Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Interface programming

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 25-10-2005, 11:19. Υπάρχουν 64 απαντήσεις.
Σελίδα 4 από 5 (65 εγγραφές)   < 1 2 3 4 5 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-09-2005, 14:27 4936 σε απάντηση της 4921

    Απ: Interface programming

    εμμ ... μιλούσα όμως για την GetData(), όχι για την GetMid() :)
    Angel
    O:]
  •  01-09-2005, 21:17 4954 σε απάντηση της 4936

    Απ: Interface programming

    oops! "όποιος βιάζεται...."

    Δεν το πρόσεξα...
    Βεβαίως είναι καλύτερο και σωστότερο η virtual public GetData να δηλωθεί ως abstract public GetData για να απαιτεί implementation από τα sub-classes...

    Στην βιασύνη μου όμως νόμιζα ότι την είχα ήδη ορίσει ως asbtract, γι' αυτό και πήγε κατευθείαν το μυαλό μου στην GetMid...

    σωστή η παρατήρηση...
    thanks
    rousso
    rousso
  •  03-10-2005, 19:18 5862 σε απάντηση της 4885

    Απ: Interface programming

     rousso wrote:
    • Χρειάζεται να θυμάσαι λιγότερα class names. 
    • Χρειάζεται να γράψεις λιγότερες classes.
    • Η ονοματολογία των classes είναι πιο "κομψή".
      (Αν και την factory method θα έπρεπε να την είχα ονομάσει CreateMid ή CreateInstanceOf ή CreateNew ή κάτι τέτοιο καθως το GetMid σου δεν σου δίνει την αίσθηση του factory/creation)
    • Αυτόματα η SMid και οι άλλες sub-classes κληρονομούν την GetMid() με όλες τις προεκτάσεις που μπορεί να έχει αυτό στο sub-classing των sub-classes..

    Επίσης πρόσεξε ότι στην factory method γράφω

    if (!midType.IsSubclassOf(MethodBase.GetCurrentMethod().ReflectedType))

    ενώ θα μπορούσα να γράψω

    if (!midType.IsSubclassOf(typeof(Mid)))
    Ως "άσκηση" προσπάθησε να καταλάβεις γιατί το έκανα έτσι ενώ θα δούλευε και το απλούστερο typeof(Mid)...

    you are welcome
    rousso

    Γιάννη επανέρχομαι ...
    Στην άσκηση σου τα βρήκα σκούραLightning [li].
    Ρίξε ένα σχόλιο όταν ευκαιρίσεις ... 
    H VB version μου :

    To Abstract Class :

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Imports System.Reflection

    Public MustInherit Class AbstractMidFactory
       Public MustOverride Function GetData(ByVal Con As String) As
    DataSet
       
    Public Shared Function GetMidOb(ByVal MidType As Type) As
    AbstractMidFactory
          
    Try
             
    If Not MidType.IsSubclassOf(MethodBase.GetCurrentMethod.ReflectedType)
    Then
                
    Throw New
    System.Exception("Mid Tier implementation not supported")
             
    End If
     

             
    Return CType
    (Activator.CreateInstance(MidType), AbstractMidFactory)

          
    Catch ex As
    Exception
             
    Throw
    ex
          
    End
    Try
       
    End
    Function

    End Class

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Ένα SQL Server implementation :

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Imports System.Data.SqlClient
    Public Class SqlServerMid
       Inherits AbstractMidFactory

       Public Overrides Function GetData(ByVal TableName As String) As System.Data.DataSet
          
    Dim MyCon As New SqlConnection("Server=TESTER;Network Library=DBMSSOCN;Initial Catalog=TEST_DB;" + _  
                                                              "User Id=sa;Min Pool Size=5;Max Pool Size=60;Connect Timeout=10;")
          
    Dim MyAd As New SqlDataAdapter("SELECT * FROM " + TableName, MyCon)
          
    Dim MyData As New DataSet
       
          
    Try
             
    MyCon.Open()
             
    Dim RowCount As Integer = MyAd.Fill(MyData)
             
    If RowCount = 0 Then
                
    Throw New System.Exception("No Data found...")
             
    End If
             
    Return MyData
          
    Catch ex As Exception
             
    Throw ex
          
    Finally
             
    MyData.Dispose()
             
    MyAd.Dispose()
             
    With MyCon
                
    .Close()
                
    .Dispose()
             
    End With
          
    End Try
       End Function
    End
    Class

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Και το Call :

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
       
    Dim MyOb As AbstractMidFactory = _
       AbstractMidFactory.GetMidOb(Type.GetType _
       ("Testing_Factory_Objects.SqlServerMid"))    
       
    Dim MyData As New DataSet
       
    Try

          MyData = MyOb.GetData("TestData")
          MyOb =
    Nothing

          With UltraGrid1
             .DataSource =
    Nothing
             .ResetDisplayLayout()
             .Layouts.Clear()
             Application.DoEvents()
             .DataSource = MyData
             .DataBind()
          End With

       Catch ex As Exception
          MsgBox(ex.Message, MsgBoxStyle.Critical)
       
    End Try

    End Sub

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Αυτό που θέλω να ρωτήσω τώρα είναι πως θα υλοποιήσω το παραπάνω σαν serviced component;
    Επίσης πως θα κάνω dispose το instance μου εάν θέλω να χρησιμοποιήσω object pooling;

     

     


    Πάνος Αβραμίδης
  •  06-10-2005, 10:17 5927 σε απάντηση της 5862

    Απ: Interface programming

    Επίσης υπάρχει τρόπος να κάνω επιλεκτικά implement κάποιο overload ;


    Πάνος Αβραμίδης
  •  07-10-2005, 10:35 6003 σε απάντηση της 5862

    Απ: Interface programming

    Καλημέρα :)

    Οκ, πρώτα για την άσκηση, που έχει και περισσότερο ενδιαφέρον ...

    Η κλήση MethodBase.GetCurrentMethod().ReflectedType σου γυρίζει το Type στο οποίο είναι implemented η μέθοδος η οποία "τρέχει" αυτή τη στιγμή. Πιο "λιανά", αν έχεις ως abstract base class την AbstractMidFactory και subclass την SqlServerMid, ο παραπάνω κώδικας θα σου γυρίζει type AbstractMidFactory και όχι SqlServerMid.

    To midType.IsSubclassOf(typeof(Mid) θα σου γύριζε στην ίδια περίπτωση SqlServerMid, το runtime type δηλαδή.

    Όσον αφορά το επιλεκτικό overload, αν έχεις μαρκάρει τη μέθοδο στην abstract base class σου ως abstract (MustInherit), δεν μπορείς επιλεκτικά να κάνεις τα overloads, εκτός κι αν η derived κλάσση είναι επίσης abstract. Αν όμως μαρκάρεις τη μέθοδο ως virtual (.. δε θυμάμαι τώρα το αντίστοιχο keyword σε VB :( ... ) τότε δεν έχεις τέτοια προβλήματα.

    Το να κάνεις την κλάσση σου serviced compoent είναι μια σχετικά εύκολη διαδικασία, την οποία θα βρείς πολύ εύκολα στο google, αλλά .. δεν είμαι σίγουρος (πρωινιάτικα...) αν μπορείς αν έχεις static (shared) μεθόδους σε ένα serviced compoent .. άποιος άλλος θα μας διαφωτίσει όσον αφορά αυτό :)

    Και τελικά ... πολύ καλημέρα μας !
    Angel
    O:]
  •  07-10-2005, 11:47 6008 σε απάντηση της 6003

    Απ: Interface programming

    Γεια σου και χαρά σου Άγγελε !!!
    Σε ευχαριστώ για την απάντηση.
    Διευκρινίζω :

     anjelinio wrote:
    Καλημέρα :)

    Οκ, πρώτα για την άσκηση, που έχει και περισσότερο ενδιαφέρον ...

    Η κλήση MethodBase.GetCurrentMethod().ReflectedType σου γυρίζει το Type στο οποίο είναι implemented η μέθοδος η οποία "τρέχει" αυτή τη στιγμή. Πιο "λιανά", αν έχεις ως abstract base class την AbstractMidFactory και subclass την SqlServerMid, ο παραπάνω κώδικας θα σου γυρίζει type AbstractMidFactory και όχι SqlServerMid.

    To midType.IsSubclassOf(typeof(Mid) θα σου γύριζε στην ίδια περίπτωση SqlServerMid, το runtime type δηλαδή.

    Το παραπάνω ήταν κατανοητό ... Αυτό που δεν είχα καταλάβει ήταν αφού ουσιαστικά πάντα ρωτάω αν το Type που
    έρχεται είναι subclass του εαυτού μου (AbstractMidFactory) γιατί να μην ρωτήσω κάτι πιο απλό :

    If Not MidType.IsSubclassOf(Type.GetType("AbstractMidFactory")) Then
       
    Throw New System.Exception("Mid Tier implementation not supported")
    End If

    Αν και το αποτέλεσμα είναι το ίδιο γιατί να χρησιμοποιήσω Reflection θέλω να πω :

    If Not MidType.IsSubclassOf(MethodBase.GetCurrentMethod.ReflectedType) Then
       
    Throw New System.Exception("Mid Tier implementation not supported")
    End If


     anjelinio wrote:

    Όσον αφορά το επιλεκτικό overload, αν έχεις μαρκάρει τη μέθοδο στην abstract base class σου ως abstract (MustInherit), δεν μπορείς επιλεκτικά να κάνεις τα overloads, εκτός κι αν η derived κλάσση είναι επίσης abstract. Αν όμως μαρκάρεις τη μέθοδο ως virtual (.. δε θυμάμαι τώρα το αντίστοιχο keyword σε VB :( ... ) τότε δεν έχεις τέτοια προβλήματα.

    Θα το δοκιμάσω και θα επανέρθω ...

     anjelinio wrote:

    Το να κάνεις την κλάσση σου serviced compoent είναι μια σχετικά εύκολη διαδικασία, την οποία θα βρείς πολύ εύκολα στο google, αλλά .. δεν είμαι σίγουρος (πρωινιάτικα...) αν μπορείς αν έχεις static (shared) μεθόδους σε ένα serviced compoent .. άποιος άλλος θα μας διαφωτίσει όσον αφορά αυτό :)
    Και τελικά ... πολύ καλημέρα μας !

    Θα ήθελα όντως τα φώτα σας ....


    Πάνος Αβραμίδης
  •  07-10-2005, 12:56 6010 σε απάντηση της 6008

    Απ: Interface programming

     axaros wrote:

    Το παραπάνω ήταν κατανοητό ... Αυτό που δεν είχα καταλάβει ήταν αφού ουσιαστικά πάντα ρωτάω αν το Type που
    έρχεται είναι subclass του εαυτού μου (AbstractMidFactory) γιατί να μην ρωτήσω κάτι πιο απλό :

    If Not MidType.IsSubclassOf(Type.GetType("AbstractMidFactory")) Then
       
    Throw New System.Exception("Mid Tier implementation not supported")
    End If


    ... γιατί είναι καλό να μην έχεις "magic numbers" και "magic strings" στον κώδικά σου :) Μπορεί σε λίγο καιρό ν'αλλάξεις όνομα στην κλάσση σου που λέει ο λόγος και να ξεχάσεις ν'αλλάξεις το string. Ψειρίζουμε λίγο τώρα βέβαια, αλλά ... εντάξει, κουβέντα κάνουμε ;)

    Angel
    O:]
  •  07-10-2005, 13:14 6011 σε απάντηση της 6010

    Απ: Interface programming

    Δεν έχεις άδικο ... Δεκτό !!!
    Συντακτικά είναι όντως καλύτερο ...

    Από περιέργεια :

    To GetType("TheTypeIneed") πως δουλεύει under the scenes;
    Ποια η διαφορά του με ένα Reflective Call (performance wise);


    Πάνος Αβραμίδης
  •  07-10-2005, 14:01 6014 σε απάντηση της 6003

    Απ: Interface programming

     anjelinio wrote:
    Καλημέρα :) 

    Η κλήση MethodBase.GetCurrentMethod().ReflectedType σου γυρίζει το Type στο οποίο είναι implemented η μέθοδος η οποία "τρέχει" αυτή τη στιγμή. Πιο "λιανά", αν έχεις ως abstract base class την AbstractMidFactory και subclass την SqlServerMid, ο παραπάνω κώδικας θα σου γυρίζει type AbstractMidFactory και όχι SqlServerMid.

    To midType.IsSubclassOf(typeof(Mid) θα σου γύριζε στην ίδια περίπτωση SqlServerMid, το runtime type δηλαδή.

    Δεν είναι έτσι...

    Το MethodBase.GetCurrentMethod().ReflectedType επιστρέφει τον τύπο της κλάσης που χρησιμοποιείς κάθε φορά για να καλέσεις το static factory method (αναξάρτητα από το που είναι αυτό implemented).

    Δηλαδη αν γράψεις Mid.GetMid(...) η MethodBase.GetCurrentMethod().ReflectedType δίνει typeof(Mid). Αν γράψεις SMid.GetMid(....) η MethodBase.GetCurrentMethod().ReflectedType δίνει typeof(SMid) κ.ο.κ.

    Άρα αν γράψεις SMid.GetMid(typeof(AMid)) η (!midType.IsSubclassOf(MethodBase.GetCurrentMethod().ReflectedType)) θα είναι true οπότε θα πάρεις ένα ωραίο exception που θα σου λέει ότι δεν είναι λογικό να ζητήσεις από την SMid να σου φτιάξει ένα AMid object.

    Γιατί το έγραψα έτσι; Γιατί εφόσον είναι γραμμένο έτσι μπορείς να κάνεις sub-classes και στην SMid και στην AMid και όποια άλλη αντίστοιχα όπου να μπορείς να κάνεις override και customize την συμπεριφορά του factory χωρίς να "κινδυνεύεις" να καλέσεις λάθος factory για λάθος objects...

    Δηλαδή αν η SMid2 είναι subclass της SMd και AMid2 είναι αντίστοιχα subclass της AMid και γράψεις SMid.GetMid(typeof(SMid2)) θα δουλέψει. Αν όμως γράψεις SMid.GetMid(typeof(AMid2)) θα πάρες exception.

    rousso

     


    rousso
  •  07-10-2005, 14:32 6020 σε απάντηση της 6014

    Απ: Interface programming

     rousso wrote:

    Γιατί το έγραψα έτσι; Γιατί εφόσον είναι γραμμένο έτσι μπορείς να κάνεις sub-classes και στην SMid και στην AMid και όποια άλλη αντίστοιχα όπου να μπορείς να κάνεις override και customize την συμπεριφορά του factory χωρίς να "κινδυνεύεις" να καλέσεις λάθος factory για λάθος objects...

    Δηλαδή αν η SMid2 είναι subclass της SMd και AMid2 είναι αντίστοιχα subclass της AMid και γράψεις SMid.GetMid(typeof(SMid2)) θα δουλέψει. Αν όμως γράψεις SMid.GetMid(typeof(AMid2)) θα πάρες exception.
    rousso

    Γαμ%^* μου !!!!
    Και είχες μιλήσεις για subclassing ....
    Την περίπτωση περισσότερων levels δεν την είχα καν σκεφτεί ...

    Γιάννη χίλια ευχαριστώ !!!

     


    Πάνος Αβραμίδης
  •  07-10-2005, 17:14 6032 σε απάντηση της 6020

    Απ: Interface programming

    Παρεπιπτόντως ρίξτε μια ματιά :

    http://www.dofactory.com/Patterns/PatternAbstract.aspx

     


    Πάνος Αβραμίδης
  •  07-10-2005, 18:38 6034 σε απάντηση της 6032

    Απ: Interface programming

    I stand corrected in a BIG way ... :?
    Angel
    O:]
  •  07-10-2005, 19:04 6035 σε απάντηση της 6034

    Απ: Interface programming

    Όχι .. δεν είναι έτσι ρε παιδιά τελικά. Όντως η .ReflectedType θα σου δώσει τον τύπο στον οποίο ορίζεται η μέθοδος που τρέχει ...

    Και για του λόγου το αληθές:

    using System;

    using System.Reflection;

     

    namespace TestGeneric

    {

           /// <summary>

           /// Summary description for AbstractBase.

           /// </summary>

           public abstract class AbstractBase

           {

                  public AbstractBase()

                  {

                         //

                         // TODO: Add constructor logic here

                         //

                  }

     

                  public string GetReflectedType(){

                         return MethodInfo.GetCurrentMethod().ReflectedType.ToString();      

                  }

           }

    }

    κι ένα παιδί της ...

    using System;

     

    namespace TestGeneric

    {

           /// <summary>

           /// Summary description for FirstLevelChild.

           /// </summary>

           public class FirstLevelChild : AbstractBase

           {

                  public FirstLevelChild()

                  {

                         //

                         // TODO: Add constructor logic here

                         //

                  }

           }

    }

    .. κι ένα παιδί του παιδιού της ...

    using System;

     

    namespace TestGeneric

    {

           /// <summary>

           /// Summary description for SecondLevelChild.

           /// </summary>

           public class SecondLevelChild : FirstLevelChild

           {

                  public SecondLevelChild()

                  {

                         //

                         // TODO: Add constructor logic here

                         //

                  }

           }

    }

     

    .. κι ένα μικρό Console app που δημιουργεί instances και των δύο, και καλεί την GetReflectedType() : string τους για να δούμε τι θα γυρίσει ...

    static void Main(string[] args)

    {

           FirstLevelChild child1 = new FirstLevelChild();

           AbstractBase child2 = new SecondLevelChild();

     

           Console.WriteLine(child1.GetReflectedType());

           Console.WriteLine(child2.GetReflectedType());

           Console.ReadLine();

    }

    ... παρατήρησε οτι το πρώτο παιδί το δηλώνω με τον τύπο του, και το δεύτερο με τον abstract τύπο. Αυτό για να δώ τη συμπεριφορά του MethodInfo.GetCurrentMethod().ReflectedType , ανάλογα με τον τύπο που έχει δηλωθεί η μεταβλητή. Αν δοκιμάσετε και τα δύο με τον abstract base τύπο, το αποτέλεσμα είναι το ίδιο.

    Output:

    TestGeneric.AbstractBase
    TestGeneric.AbstractBase
    _

    Μόλις το δοκίμασα και με static τη μέθοδο GetReflectedType(), και παλι το ίδιο αποτέλεσμα πήρα.

    Με τρέλλανες αγαπητέ rousso απογευματιάτικα :D .. αλλά τα γουστάρω πολύ αυτά τα φιλοσοφικά ερωτήματα ! Πάντα τέτοια !!!




    Angel
    O:]
  •  13-10-2005, 10:49 6143 σε απάντηση της 6035

    Απ: Interface programming

    Άγγελε καλημέρα!!!
    Διόρθωσε με αλλά νομίζω ότι ο Γιάννης υπονοούσε ότι το Creation method
    θα γίνεται shadowed σε όλα τα subclasses :

    Abstract Class :

    Public Shared Function GetMidOb(ByVal MidType As Type) As AbstractMidFactory

    Try
       
    If Not MidType.IsSubclassOf(MethodBase.GetCurrentMethod.ReflectedType) Then
          
    Throw New System.Exception("Mid Tier implementation not supported")
       
    End If
       
    Return CType(Activator.CreateInstance(MidType), AbstractMidFactory)

       
    Catch ex As Exception
          
    Throw ex
       
    End Try

    End Function

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Implementation subclass Level1 :

    Public Shared Shadows Function GetMidOb(ByVal MidType As Type) As MsAccessMid
    Try

       If Not MidType.IsSubclassOf(MethodBase.GetCurrentMethod.ReflectedType) Then
          
    Throw New System.Exception("Mid Tier implementation not supported")
       
    End If

       Return CType(Activator.CreateInstance(MidType), MsAccessMid)

       Catch ex As Exception
          
    Throw ex
       
    End Try

    End Function


     


    Πάνος Αβραμίδης
  •  13-10-2005, 15:18 6150 σε απάντηση της 6143

    Απ: Interface programming

    Δε χρειάζεται - και δε θα έπρεπε κατά την ταπεινή μου άποψη - να γίνει κάτι τέτοιο όμως. Αλλιώς, θα έπρεπε να είναι abstract (MustOverride) η μέθοδος γενικότερα.

    ( Το σκεπτικό μου είναι οτι όταν έχεις μια μέθοδο την οποία κάνεις shadow, θα πρέπει το shadows implementation να έχει κάποιες σοβαρές αλλαγές στον κώδικα. Αν κάνεις copy-paste και αλλάζεις μια λέξη .. what's the point; κάνε Me.GetType() σντί για MethodBase.GetCurrentMethod.ReflectedType και τελείωσες χωρίς κανένα shadow )

    Ή απλώς κάπου - κλασσικά για techies - παρεξηγήσαμε ο ένας τα λεγόμενα του άλλου :)
    Angel
    O:]
Σελίδα 4 από 5 (65 εγγραφές)   < 1 2 3 4 5 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems