דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. בניית מודאלים גנאריים

בניית מודאלים גנאריים

מתוזמן נעוץ נעול הועבר ארכיון code613m
12 פוסטים 2 כותבים 592 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #2

    אני מאוד לא מבין את הכיוון ואת הדרך, לא הבנתי גם למה במקום באובגקט אתה לא משתמש עם המחלקה היפה שעשית (GenaricTable).
    כלומר המחלקה קונקשיין לפי איך שהתחלת אמורה להיראות ככה:

    Public Class Connection(Of TRcordA, TRecordB)
        Public Sub New(GenaricTableOut As GenaricTable(Of TRcordA), GenaricTableIn As GenaricTable(Of TRecordB))
    
        End Sub
    End Class
    

    אבל אני מריח את הבעיה עליה אתה שואל.
    אתה מנסה להתמודד מראש עם מחלקות שונות שיתנו פחות או יותר אותה פונקציונליות אבל עדיין מחלקות שונות.
    אגב, בC#, אין אופציה בכלל למה שעשית. אם אתה לא יודע מראש את סוג המחלקה, אין לך שום אפשרות להשתמש במאפיין/מתודה שאת הבטוח שיהיה בה).
    אז מה עושים? אז פה כדאי מאוד לסקור חזק את נושא ה"תכנות מונחה עצמים"', OOP בלועזית מרשימה.

    בOOP יש שתי דברים שמאוד נוגעים לשאלתך:
    א. Interface - ממשק (מנשק לפי האקדמיה :)) שזה עצם שמכיל רשימה של חוקים, שכל מחלקה שמכריזה על עצמה כמממשת את אותו Interface, חייבת לממש.
    ב. מחלקת אב אבסטרקטית (מופשטת). בהנחה שאתה מכיר את המושג "ירושה", אז אפשר ליצור מחלקה למחצה (שאין לה שום טעם משל עצמה, וגם אי אפשר ליצור ממנה מופע), ותפקידה זה לתרום את הפונקציונליות שלה למחלקות היורשות ממנה.
    שתי הדרכים נראים דומות אך יש הרבה הבדלים בינהם, הן באופן השימוש והן במטרתו.
    במקרה שלך כדאי לך ליצור אב טיפוס, או ממשק או מחלקה מופשטת, ולוותר על השימוש בגנריות ולהשתמש בטיפוס מוגדר, מסוג אב.
    באופן כללי ניתן לומר כלל שהשימוש בגנריות מומלץ א. מתי שלא פונים הרבה לאלמנטים בתוך האובייקט ב. מתי שמתכוננים לתת שירות גם לטיפוסים שלא תחת אחריותינו כלל.

    פורסם במקור בפורום CODE613 ב29/12/2013 11:53 (+02:00)

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    0
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #3

      תודה רבה,
      את נושא הירושה והממשקים אני מכיר ואני משתמש למשל בממשק כזה:

      Imports System.ComponentModel
      
      Public Interface IRecord
      
          Inherits INotifyPropertyChanged
          Property ID As Integer
          Sub OnPropertyChanged(ByVal name As String)
      
      End Interface
      
      Public Class GenaricTable(Of TRecord As IRecord)
          ' הטבלה הגנארית
          ' יש בה כל מיני פונקציות ומאפיינים
          ' מחזיקה אוסף של רשומות מטיפוס מסויים
      
          Public WithEvents MainCollection As ObservableCollection(Of TRecord)
      
          Public WithEvents ConnectionsCollection As ObservableCollection(Of Connection)
          Public Property Sum
      
          '....
      End Class
      

      @דוד ל.ט.

      אני מאוד לא מבין את הכיוון ואת הדרך, לא הבנתי גם למה במקום באובגקט אתה לא משתמש עם המחלקה היפה שעשית (GenaricTable).
      כלומר המחלקה קונקשיין לפי איך שהתחלת אמורה להיראות ככה:

      רציתי באמת לעשות כמו שאתה מציע אבל אז נתקעתי עם השורה הבאה בתוך GenaricTable, שורה זו שכחתי להביא בהודעה הראשונה:

      Public WithEvents ConnectionsCollection As ObservableCollection(Of Connection)
      

      כלומר חייב להיות בכל טבלה אוסף של קשרי גומלין כאשר כל קשר גומלין מכיל טבלה אחת מסוג שונה מאשר הטבלה שמכילה את אוסף הקשרי גומלין. בין כל קשרי הגומלין של טבלה מסויימת יכולים להיום כמה וכמה טיפוסים שונים לגמרי.
      מה הארכיטקסטרה הנכונה בכל המבנה הזה?

      פורסם במקור בפורום CODE613 ב29/12/2013 12:58 (+02:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #4

        או: תעשה כמו שהצעתי וקונקשיין תחליף לObject.

        או: כדי להשתמש בקונקשנים בלי קאסט צור ממשק לקונקשיין ככה:

        Public Class GenaricTable(Of TRecord As IRecord)
            Public WithEvents ConnectionsCollection As ObservableCollection(Of IConnection)
        End Class
        
        Public Class Connection(Of TRecordA As IRecord, TRecordB As IRecord)
            Implements IConnection
            Public Sub New(GenaricTableOut As GenaricTable(Of TRecordA), GenaricTableIn As GenaricTable(Of TRecordB))
            End Sub
        End Class
        

        או: אתה יכול להחליט לעשות גם ככה:

        Public Class GenaricTable(Of TRecord As IRecord)
            Implements ITable
            Public WithEvents ConnectionsCollection As ObservableCollection(Of Connection)
        End Class
        
        Public Class Connection
            Public Sub New(GenaricTableOut As ITable, GenaricTableIn As ITable)
            End Sub
        End Class
        

        פורסם במקור בפורום CODE613 ב29/12/2013 15:08 (+02:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • רחמיםר מנותק
          רחמיםר מנותק
          רחמים מורחק
          כתב ב נערך לאחרונה על ידי
          #5

          תודה,
          עשיתי ממשק גם ITable וגם IConnection
          הכל עבד מצויין חוץ ממאפיין אחד ב Connection שלא התאים ל ממשק:

          'במחלקה:
          Public Class Connection(Of TRecordA As IRecord, TRecordB As IRecord)
              Implements IConnection
           Public Property MainCollectionOfTableOut As ObservableCollection(Of TRecordA) _
          Implements IConnection.MainCollectionOfTableOut
            
          End Class
          
             'בממשק:
             Property MainCollectionOfTableOut As ObservableCollection(Of IRecord)
          

          למה זה קורה? על פי סדר הממשקים זה היה אמור להתאים, ומה אפשר לעשות אם לא שוב שימוש באובג'קט?
          אם אני מבין נכון אז אע''פ שאת TRecordA אפשר להסב [=קאסט] ל IRecord
          אבל (Collection(Of TRecordA אי אפשר להסב ל (Collection(Of IRecord אולי שייך לעשות כאן העמסת אופרטור של הקאסט ?

          פורסם במקור בפורום CODE613 ב29/12/2013 17:19 (+02:00)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #6
            Public Class Connection(Of TRecordA As IRecord, TRecordB As IRecord)
                Implements IConnection(Of TRecordA, TRecordB)
                Public Property MainCollectionOfTableOut As ObservableCollection(Of TRecordA) Implements IConnection(Of TRecordA, TRecordB).MainCollectionOfTableOut
                Public Property MainCollectionOfTableIn As ObservableCollection(Of TRecordB) Implements IConnection(Of TRecordA, TRecordB).MainCollectionOfTableIn
            End Class
            
            Public Interface IConnection(Of TRecordA As IRecord, TRecordB As IRecord)
                Property MainCollectionOfTableOut As ObservableCollection(Of TRecordA)
                Property MainCollectionOfTableIn As ObservableCollection(Of TRecordB)
            End Interface
            

            פורסם במקור בפורום CODE613 ב29/12/2013 17:52 (+02:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #7

              זה יעזור לפתור את השאלה האחרונה אבל יקלקל בחזרה את הכל, שהרי הכל התחיל מזה שה Connection הוא עם OF וממילא היה אי אפשר לעשות אוסף של Connection ולכן עשיתי את הממשק IConnection שאין בו OF.

              פורסם במקור בפורום CODE613 ב29/12/2013 18:25 (+02:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #8

                צודק. זה תלוי בך, אתה לא חייב לתפוש את החבל מכל הכיוונים. לא היית חייב לכתוב באינטרפייס את הפרופרטיז הללו, וגם להישאר עם הגנריות שלהם.
                אני הייתי עושה הכל עם אינטרפייס ולפחות את האוספים, ככה:

                Public Class Connection
                    Implements IConnection
                
                    Public Property MainCollectionOfTableIn As ObservableCollection(Of IRecord) Implements IConnection.MainCollectionOfTableIn
                    Public Property MainCollectionOfTableOut As ObservableCollection(Of IRecord) Implements IConnection.MainCollectionOfTableOut
                End Class
                
                Public Interface IConnection
                    Property MainCollectionOfTableOut As ObservableCollection(Of IRecord)
                    Property MainCollectionOfTableIn As ObservableCollection(Of IRecord)
                End Interface
                

                פורסם במקור בפורום CODE613 ב29/12/2013 18:46 (+02:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                0
                • רחמיםר מנותק
                  רחמיםר מנותק
                  רחמים מורחק
                  כתב ב נערך לאחרונה על ידי
                  #9

                  יישר כח גדול, הכל הסתדר לפי מה שבדקתי עד כעת אני לא משתמש יותר באובג'קט בזכות הממשקים,
                  אני כבר מתחיל לראות באופק את Northwind ב WPF בע''ה ... 🙂

                  פורסם במקור בפורום CODE613 ב29/12/2013 19:29 (+02:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #10

                    @רחמים

                    אני כבר מתחיל לראות באופק את Northwind ב WPF בע''ה ... 🙂

                    northwind זה אפליקציה.
                    אתה בונה אפליקציה+מסד נתונים.

                    פורסם במקור בפורום CODE613 ב30/12/2013 10:37 (+02:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    0
                    • רחמיםר מנותק
                      רחמיםר מנותק
                      רחמים מורחק
                      כתב ב נערך לאחרונה על ידי
                      #11

                      אכן אני בונה מסד נתונים גנארי, כלומר שיהיה אפשר להשתמש בו בכל תוכנית ובכל אפליקציה ואפי' עם המורכבות והיכולות המוצגות ב Northwind של אקסס.

                      פורסם במקור בפורום CODE613 ב30/12/2013 10:48 (+02:00)

                      תגובה 1 תגובה אחרונה
                      0
                      • רחמיםר מנותק
                        רחמיםר מנותק
                        רחמים מורחק
                        כתב ב נערך לאחרונה על ידי
                        #12

                        תשמע, אני ממשיך לעבוד על פיתוח המסד נתונים והממשקים האלו זה ממש כלי נפלא ביותר, אתה יכול לגשת לכל טיפוס לא משנה מה הוא יהיה ויש לי איתו שפה משותפת בזכות הממשק המשותף שיש לו עם אחרים, אתה יכול להכניס למערך שלל של טיפוס שונים העיקר שכולם תחת אותו ממשק ועם כולם אתה יכול לעבוד בלא אובג'קט ממש תענוג.
                        אין כמו OOP :smile:

                        פורסם במקור בפורום CODE613 ב01/01/2014 21:09 (+02:00)

                        תגובה 1 תגובה אחרונה
                        0

                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום