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

 

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

Design patterns introduction

Îåêßíçóå áðü ôï ìÝëïò papageor. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 14-01-2005, 18:33. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-11-2004, 11:12 424

    Design patterns introduction

    Ένα πολύ καλό site στο οποίο αναπτύσσονται διεξοδικά διάφορα design patterns σε C# είναι το:


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


    Γεώργιος Παπαγεωργίου
    Software Engineer
    Fortune Technologies SA
  •  10-11-2004, 12:48 425 σε απάντηση της 424

    Re: Design patterns introduction

    Καλή αλλά λιτή η λίστα. Αναφέρει τις τυπικές υλοποιήσεις των patterns αλλά δεν συζητάει τα γνωστά προβλήματα και πως αντιμετωπίζονται. Βέβαια, το ίδιο πρόβλημα έχω συναντήσει και σε βιβλία με patterns για C#.

    Παράδειγμα, το Singleton. Είναι γνωστό ότι η τυπική υλοποίηση δεν είναι thread safe. Ένας συνηθισμένος τρόπος να αντιμετωπιστεί αυτό είναι με χρήση locking και μάλιστα με double checked locking. Το μειονέκτημα είναι τα locks που πρέπει να πιάσει ο κώδικας. Η περιγραφή του Singleton δεν αναφέρει τίποτα για το πρόβλημα, αλλά το real-world example χρησιμοποιεί double checked locking.

    Έδώ που τα λέμε, η λίστα βρίσκεται στο site εκπαιδευτικής εταιρείας, οπότε λογικό είναι να μην λένε όλη την ιστορία, αλλιώς τί θα πουλησουν? Devil


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-01-2005, 11:40 854 σε απάντηση της 424

    Re: Design patterns introduction

    Ξερω οτι μιλάμε γενικα για patterns, αλλά "πιάστηκα" από την προηγούμενη αναφορά...

    Μια και λέμε για doubly-checked, αυτό παίζει; (Αν δεν ταιριάζει εδώ η απάντηση, παρακαλώ ενημερώστε με)
    (τα comments είναι από VBXC)



    Public Class Singleton

    '/// <summary>

    '/// The member variable that will hold the single instance of this object.

    '/// </summary>

    Private Shared m_Singleton As Singleton


    '/// <summary>

    '/// A dummy synchronization object to be used by SyncLock.

    '/// This is ReadOnly and Shared, so it gets initialized ONLY ONCE.

    '/// </summary>

    Private Shared ReadOnly m_objDummySyncLockObject As Object = New Object


    '/// <summary>

    '/// Declare the default constructor as private, so that only the

    '/// public shared construction function can be used.

    '/// </summary>

    Private Sub New()

       'Put the initialization code here.

    End Sub


    '/// <summary>

    '/// Get this singleton object instance.

    '/// </summary>

    '/// <returns>

    '/// The single instance of this class.

    '/// </returns>

    Public Shared Function Instance () As Singleton


    'Check if the object has been initialized using a double-checked locking pattern.

    If (IsNothing(m_Singleton) = True) Then


    'Lock on a synchronization dummy object.

    'Since this object is shared, no other threads are allowed to access this

    'portion of the code before the lock is released.

    SyncLock (m_objDummySyncLockObject)


    'Double-Check that the object still has not been

    'initialized by any other thread

    If (IsNothing(m_Singleton) = True) Then


    'Create the single new object

    m_Singleton = New Singleton()


    End If


    End SyncLock


    End If


    'Return the single instance of this object

    Return m_Singleton


    End Function


    End Class







     


     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  14-01-2005, 18:33 866 σε απάντηση της 854

    Re: Design patterns introduction

    Σχεδόν παίζει αλλά δεν χρειάζεται! Η ευκολότερη υλοποίηση είναι να ορίζεις και να δημιουργείς το instance σαν static μεταβλητή. Το πρόβλημα στη C++ είναι ότι η σειρά με την οποία δημιουργούνται τα global αντικείμενα δεν εξασφαλισμένη. Αυτό σημαίνει ότι αν ένα Singleton χρησιμοποιεί ένα άλλο Singleton, μπορεί να υπάρξουν λάθη.
    Τόσο στη C# όσο και στη VB.NET μια static(shared) μεταβλητή γίνεται initialize οπωσδήποτε πριν την χρησιμοποιήσει ο οποιοσδήποτε. Στο specification της VB αναφέρει For Shared variables, variable initializers correspond to assignment statements that are executed after the program begins, but before the Shared variable is first referenced.  (§9.6.3 Variable Initializers)

    Έτσι άνετα μπορείς να γράψεις το singleton ως:


    public sealed class Singleton
    {
       static readonly Singleton instance=new Singleton();
       // Explicit static constructor to tell C# compiler   
       // not to mark type as beforefieldinit
       static Singleton() { }

       Singleton() { }

       public static Singleton Instance
       {
          get { return instance; }
       }
    }

     

    Το instance θα δημιουργηθεί την πρώτη φορά που θα κληθεί κάποιο static member του Singleton. Επειδή εδώ μόνο το Instance() μπορεί να κληθεί, το lazy instantiation παίζει τέλεια. Αν πρόσθετες και άλλα static members, το πράγμα θα ήταν πιο αβέβαιο.

    Δες και ένα πολύ καλό άρθρο Implementing the Singleton Pattern in C#, το οποίο αναλύει διεξοδικότατα το Singleton.

    Να εξηγήσω τί σημαίνει το σχεδόν παίζει για το double-checked locking. Το double-checked locking παίζει αν υπάρχει μόνο ένας επεξεργαστής. Διαφορετικά τίποτα δεν εμποδίζει δύο threads, σε δύο διαφορετικούς επεξεργαστές να πιάσουν το ίδιο lock. Τουλάχιστον, το .NET δεν βάζει αυτό τον περιορισμό. Τον βάζουν όμως οι επεξεργαστές Intel. Αν η Intel αλλάξει ποτέ το memory model των επεξεργαστών το double-checked locking θα αποτύχει.

    Αυτό δεν είναι τόσο απίθανο όσο ακούγεται. Μπορεί π.χ. να βγάλει η Intel ή η AMD ένα νέο dual-core τσιπάκι, με δύο mode λειτουργίας, συμβατό και Turbo με χαλαρότερο memory model για καλύτερες επιδόσεις.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems