<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Design &amp; Architecture</title><link>https://www.dotnetzone.gr:443/cs/forums/16/ShowForum.aspx</link><description>Θέματα αρχιτεκτονικής και σχεδιασμού εφαρμογών (design patterns, object orientation, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Re: Design patterns introduction</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/866.aspx</link><pubDate>Sat, 15 Jan 2005 02:33:33 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:866</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/866.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=866</wfw:commentRss><description>Σχεδόν παίζει αλλά δεν χρειάζεται! Η ευκολότερη υλοποίηση είναι να ορίζεις και να δημιουργείς το instance σαν static μεταβλητή. Το πρόβλημα στη C++ είναι ότι η σειρά με την οποία δημιουργούνται τα global αντικείμενα δεν εξασφαλισμένη. Αυτό σημαίνει ότι αν ένα Singleton χρησιμοποιεί ένα άλλο Singleton, μπορεί να υπάρξουν λάθη.&lt;br /&gt;Τόσο στη C# όσο και στη VB.NET μια static(shared) μεταβλητή γίνεται initialize οπωσδήποτε πριν την χρησιμοποιήσει ο οποιοσδήποτε. Στο &lt;a target="_blank" title="http://www.microsoft.com/downloads/details.aspx?familyid=BF32527D-187C-49FA-8C67-9E9105535550&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=BF32527D-187C-49FA-8C67-9E9105535550&amp;amp;displaylang=en"&gt;specification της &lt;/a&gt;VB αναφέρει &lt;em&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;&lt;span lang="EN" style="FONT-SIZE: 8pt; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;font color="#000000"&gt;For&lt;/font&gt; &lt;/span&gt;&lt;span&gt;&lt;span lang="EN" style="FONT-WEIGHT: normal; FONT-SIZE: 8pt; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;font color="#000000"&gt;Shared&lt;/font&gt;&lt;/span&gt; variables, variable initializers correspond to assignment statements that are executed after the program begins, but before the &lt;/span&gt;&lt;/font&gt;&lt;span class="Bold"&gt;&lt;span lang="EN" style="FONT-WEIGHT: normal; FONT-SIZE: 8pt; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;font color="#000000"&gt;Shared&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/em&gt;&lt;span lang="EN" style="FONT-SIZE: 8pt; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;em&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; variable is first referenced&lt;/font&gt;.&lt;/font&gt;&lt;/em&gt;&lt;strong&gt;&amp;nbsp; &lt;/strong&gt;&lt;/span&gt;(§9.6.3 Variable Initializers)&lt;br /&gt;&lt;br /&gt;Έτσι άνετα μπορείς να γράψεις το singleton ως:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Modifier"&gt;&lt;pre class="source"&gt;&lt;table border="0" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey" width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br&gt;&lt;font face="Lucida Console, Courier" size="2"&gt;&lt;span class="Modifier"&gt;public&lt;/span&gt; &lt;span class="Modifier"&gt;sealed&lt;/span&gt; &lt;span class="ReferenceType"&gt;class&lt;/span&gt; Singleton&lt;br/&gt;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="Modifier"&gt;static&lt;/span&gt; &lt;span class="Modifier"&gt;readonly&lt;/span&gt; Singleton instance=&lt;span class="Keyword"&gt;new&lt;/span&gt; Singleton();&lt;br/&gt;&lt;font color="#008000"&gt;&lt;span class="InlineComment"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Explicit static constructor to tell C# compiler&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;/span&gt;&lt;span class="InlineComment"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// not to mark type as beforefieldinit&lt;/span&gt;&lt;br/&gt;&lt;/font&gt;&lt;span class="Modifier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&lt;/span&gt; Singleton() { } &lt;br/&gt; &lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton() { } &lt;br/&gt; &lt;br/&gt;&lt;span class="Modifier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; &lt;span class="Modifier"&gt;static&lt;/span&gt; Singleton Instance &lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span class="Statement"&gt;return&lt;/span&gt; instance; } &lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br/&gt;}&lt;/font&gt;&lt;br&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;/span&gt; &lt;/pre&gt; &lt;p&gt;Το instance θα δημιουργηθεί την πρώτη φορά που θα κληθεί κάποιο static member του Singleton. Επειδή εδώ μόνο το Instance() μπορεί να κληθεί, το lazy instantiation παίζει τέλεια. Αν πρόσθετες και άλλα static members, το πράγμα θα ήταν πιο αβέβαιο.&lt;br /&gt;&lt;br /&gt;Δες και ένα πολύ καλό άρθρο &lt;a title="http" href="http://www.yoda.arachsys.com/csharp/singleton.html" target="_blank"&gt;Implementing the Singleton Pattern in C#&lt;/a&gt;, το οποίο αναλύει διεξοδικότατα το Singleton.&lt;br /&gt;&lt;br /&gt;Να εξηγήσω τί σημαίνει το &lt;em&gt;σχεδόν παίζει&lt;/em&gt; για το double-checked locking. Το double-checked locking παίζει αν υπάρχει μόνο &lt;em&gt;ένας&lt;/em&gt; επεξεργαστής. Διαφορετικά τίποτα δεν εμποδίζει δύο threads, σε δύο διαφορετικούς επεξεργαστές να πιάσουν το ίδιο lock. Τουλάχιστον, το .NET δεν βάζει αυτό τον περιορισμό. Τον βάζουν όμως οι επεξεργαστές Intel. Αν η Intel αλλάξει ποτέ το memory model των επεξεργαστών το double-checked locking θα αποτύχει. &lt;br /&gt;&lt;br /&gt;Αυτό δεν είναι τόσο απίθανο όσο ακούγεται.&amp;nbsp;Μπορεί π.χ. να βγάλει η Intel ή η AMD ένα νέο dual-core τσιπάκι, με δύο mode λειτουργίας, συμβατό και Turbo με χαλαρότερο memory model για καλύτερες επιδόσεις.&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Re: Design patterns introduction</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/854.aspx</link><pubDate>Fri, 14 Jan 2005 19:40:41 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:854</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/854.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=854</wfw:commentRss><description>&lt;font color="#0000ff" size="1"&gt; &lt;p&gt;Ξερω οτι μιλάμε γενικα για patterns, αλλά "πιάστηκα" από την προηγούμενη αναφορά...&lt;br /&gt;&lt;br /&gt;Μια και λέμε για doubly-checked, αυτό παίζει; (Αν δεν ταιριάζει εδώ η απάντηση, παρακαλώ ενημερώστε με)&lt;br /&gt;(τα comments είναι από VBXC)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre class="source"&gt;&lt;table border="0" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey" width="15"&gt;&lt;/td&gt;&lt;td bgcolor="lightgrey"&gt;&lt;br&gt;&lt;font face="Lucida Console, Courier" size="2"&gt;&lt;br/&gt;Public Class &lt;font size="1"&gt;Singleton&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;'/// &amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p&gt;'/// The member variable that will hold the single instance of this object.&lt;/p&gt;&lt;p&gt;'/// &amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Private Shared &lt;/font&gt;&lt;font size="1"&gt;m_Singleton &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;As &lt;/font&gt;&lt;font size="1"&gt;Singleton&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'/// &amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p&gt;'/// A dummy synchronization object to be used by SyncLock.&lt;/p&gt;&lt;p&gt;'/// This is ReadOnly and Shared, so it gets initialized ONLY ONCE.&lt;/p&gt;&lt;p&gt;'/// &amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Private Shared ReadOnly &lt;/font&gt;&lt;font size="1"&gt;m_objDummySyncLockObject &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;As Object &lt;/font&gt;&lt;font size="1"&gt;= &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;New Object&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'/// &amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p&gt;'/// Declare the default constructor as private, so that only the&lt;/p&gt;&lt;p&gt;'/// public shared construction function can be used.&lt;/p&gt;&lt;p&gt;'/// &amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Private Sub New&lt;/font&gt;&lt;font size="1"&gt;()&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Put the initialization code here.&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;End Sub&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'/// &amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p&gt;'/// Get this singleton object instance.&lt;/p&gt;&lt;p&gt;'/// &amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p&gt;'/// &amp;lt;returns&amp;gt;&lt;/p&gt;&lt;p&gt;'/// The single instance of this class.&lt;/p&gt;&lt;p&gt;'/// &amp;lt;/returns&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Public Shared Function &lt;/font&gt;&lt;font size="1"&gt;Instance () &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;As &lt;/font&gt;&lt;font size="1"&gt;Singleton&lt;br/&gt;&lt;/p&gt;&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'Check if the object has been initialized using a double-checked locking pattern.&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;If &lt;/font&gt;&lt;font size="1"&gt;(IsNothing(m_Singleton) = &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;True&lt;/font&gt;&lt;font size="1"&gt;) &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Then&lt;/p&gt;&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'Lock on a synchronization dummy object.&lt;/p&gt;&lt;p&gt;'Since this object is shared, no other threads are allowed to access this&lt;/p&gt;&lt;p&gt;'portion of the code before the lock is released.&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;SyncLock &lt;/font&gt;&lt;font size="1"&gt;(m_objDummySyncLockObject)&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'Double-Check that the object still has not been &lt;/p&gt;&lt;p&gt;'initialized by any other thread&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;If &lt;/font&gt;&lt;font size="1"&gt;(IsNothing(m_Singleton) = &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;True&lt;/font&gt;&lt;font size="1"&gt;) &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Then&lt;/p&gt;&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'Create the single new object&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font size="1"&gt;m_Singleton = &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;New &lt;/font&gt;&lt;font size="1"&gt;Singleton()&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;br/&gt;End If&lt;/p&gt;&lt;p&gt;&lt;br/&gt;End SyncLock&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;End If&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#008000" size="1"&gt;&lt;br/&gt;'Return the single instance of this object&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;Return &lt;/font&gt;&lt;font size="1"&gt;m_Singleton&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;br/&gt;End Function&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;End Class&lt;/p&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt; &lt;p&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;</description></item><item><title>Re: Design patterns introduction</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/425.aspx</link><pubDate>Wed, 10 Nov 2004 20:48:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:425</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/425.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=425</wfw:commentRss><description>&lt;p&gt;Καλή αλλά λιτή η λίστα. Αναφέρει τις τυπικές υλοποιήσεις των patterns αλλά δεν συζητάει τα γνωστά προβλήματα και πως αντιμετωπίζονται. Βέβαια, το ίδιο πρόβλημα έχω συναντήσει και σε &lt;em&gt;βιβλία&lt;/em&gt; με patterns για C#.&lt;br /&gt;&lt;br /&gt;Παράδειγμα, το Singleton. Είναι γνωστό ότι η τυπική υλοποίηση δεν είναι thread safe. Ένας συνηθισμένος τρόπος να αντιμετωπιστεί αυτό είναι με χρήση locking και μάλιστα με double checked locking. Το μειονέκτημα είναι τα locks που πρέπει να πιάσει ο κώδικας. Η περιγραφή του Singleton δεν αναφέρει τίποτα για το πρόβλημα, αλλά το real-world example χρησιμοποιεί double checked locking. &lt;br /&gt;&lt;br /&gt;Έδώ που τα λέμε, η λίστα βρίσκεται στο site εκπαιδευτικής εταιρείας, οπότε λογικό είναι να μην λένε όλη την ιστορία, αλλιώς τί θα πουλησουν? &lt;img src="/Forums//emoticons/emotion-14.gif" alt="Devil" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description></item><item><title>Design patterns introduction</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/424.aspx</link><pubDate>Wed, 10 Nov 2004 19:12:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:424</guid><dc:creator>papageor</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/424.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=424</wfw:commentRss><description>&lt;p&gt;&lt;font style="BACKGROUND-COLOR: #efefef"&gt;Ένα πολύ καλό site στο οποίο αναπτύσσονται διεξοδικά διάφορα design patterns σε C# είναι το:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" title="http://www.dofactory.com/patterns/Patterns.aspx" href="http://www.dofactory.com/patterns/Patterns.aspx"&gt;http://www.dofactory.com/patterns/Patterns.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;</description></item></channel></rss>