<?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>Απ: Απλούστερο MVC με Generic Controller;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/16652.aspx</link><pubDate>Wed, 13 Sep 2006 04:35:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:16652</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/16652.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=16652</wfw:commentRss><description>Νομίζω η φίλτατη mns πρότεινε μια πολύ "καθαρή" λύση, Χρήστο. Όσο για το extra object, έχει ήδη απαντήσει η ίδια ... &lt;br&gt;&lt;br&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;mns wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;br&gt;Και βέβαια δεν είναι απαραίτητο να δημιουργήσεις μια νέα κλάση για να το κάνεις αυτό. Αρκεί να υλοποιήσεις το IDisplayReport στην κλάση που θα περιείχε τη function με την οποία θα δημιουργούσες τον delegate.&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;&lt;br&gt;Τώρα, έρχομαι εγώ και ρωτάω ... οι εκάστοτε juniors σίγουρα έχουν γράψει event handlers στη ζωή τους. Έμμεσα λοιπόν, έχουν αγγίξει την έννοια του delegate. Πέρα όμως απο αυτό, η ύπαρξη ενός delegate σαν παράμετρος σε μέθοδο, ίσως μπορεί να ιδωθεί και ως ... μεταβίβαση γνώσης ή έναυσμα να γίνουν καλύτεροι απο ότι είναι ήδη. &lt;br&gt;&lt;br&gt;Η γνώμη μου είναι οτι οι δύο τρόποι είναι σχεδόν ισοδύναμοι, με μια ροπή προς το interface ως πιο "φιλικό" στον προγραμματιστή. Παρ' όλα αυτά, δε νομίζω ότι η ύπαρξη του delegate είναι απαραίτητα κακό πράγμα. &lt;br&gt;&lt;br&gt;Σταματάω εδώ όμως, γιατί θα κάνουμε ένα τεχνικό post άσκηση φιλοσοφίας ( ... πάλι ...) :D&lt;br&gt;</description></item><item><title>Απ: Απλούστερο MVC με Generic Controller;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/16603.aspx</link><pubDate>Tue, 12 Sep 2006 18:25:11 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:16603</guid><dc:creator>Χρήστος Γεωργακόπουλος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/16603.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=16603</wfw:commentRss><description>Είναι κι αυτό μια ιδέα. Κοίτα όμως πως είναι τώρα:&lt;br&gt;&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Delegate&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; ShowFirstReportDelegate(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; categoryID &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Integer&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Shared&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; ShowFirstReport(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ByVal&lt;/span&gt; categoryID &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Integer&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; MyReport &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;New&lt;/span&gt; CategoryReport&lt;br /&gt;    MyReport.Show()&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Και μέσα από το instance του controller έχω:&lt;br&gt;&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; ShowFirstReportFunctionDelegate &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; ShowFirstReportDelegate &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AddressOf&lt;/span&gt; ShowFirstReport&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Me&lt;/span&gt;.AddReportOption(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Εκτύπωση κατηγορίας"&lt;/span&gt;, &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;GetType&lt;/span&gt;(FirstReportParametersControl), ShowFirstReportFunctionDelegate)&lt;/span&gt;&lt;br&gt;&lt;br&gt;Έχω επιβαρύνει τους developers με το να φτιάξουν ξεχωριστά ένα ParametersControl και με το να δουν τη λέξη delegate. Με αυτό που προτείνεις θα τους γλυτώσω από το delegate, αλλά θα τους επιβαρύνω με την κατασκευή ενός νέου object που θα έχει μέσα το function.&lt;br&gt;&lt;br&gt;Καλή η ιδέα σου, την κρατάω, απλά τα κριτήρια επιλογής της λύσης είναι περισσότερο ψυχολογικά...&lt;br&gt;</description></item><item><title>Απ: Απλούστερο MVC με Generic Controller;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/16598.aspx</link><pubDate>Tue, 12 Sep 2006 17:55:41 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:16598</guid><dc:creator>Νατάσα Μανουσοπούλου</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/16598.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=16598</wfw:commentRss><description>Μια λύση θα ήταν αντί για delegate να ζητάς για παράμετρο ένα function object. Αυτό θα μπορούσε να είναι ένα object που υλοποιεί ένα interface σαν το&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;interface&lt;/span&gt;  IDisplayReport &lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; DisplayReport(ReportParametersBase a_Parameters);&lt;br /&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;Και οι παράμετροι να είναι μαζεμένες σε ένα object που κληρονομεί από το ReportParameterBase. Αν μάλιστα το ReportParameterBase μπορεί να χρησιμοποιηθεί σαν hash table με κλειδί το όνομα της παραμέτρου, τότε δεν είναι καν απαραίτητο να το κληρονομήσεις αλλά μπορείς να το χρησιμοποιήσεις ως έχει.&lt;br&gt;Και βέβαια δεν είναι απαραίτητο να δημιουργήσεις μια νέα κλάση για να το κάνεις αυτό. Αρκεί να υλοποιήσεις το IDisplayReport στην κλάση που θα περιείχε τη function με την οποία θα δημιουργούσες τον delegate.&lt;br&gt;</description></item><item><title>Απλούστερο MVC με Generic Controller;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/16594.aspx</link><pubDate>Tue, 12 Sep 2006 17:38:28 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:16594</guid><dc:creator>Χρήστος Γεωργακόπουλος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/16594.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=16594</wfw:commentRss><description>Έχω μια φόρμα από την οποία οι χρήστες κάνουν επιλογή εκτυπώσεων από μια λίστα και κάνοντας click στο κουμπί print εκτυπώνεται το επιλεγμένο report. Θέλω να κάνω αυτή τη φόρμα αρκετά generic ώστε να χρησιμοποιείται σε οποιοδήποτε section της εφαρμογής που έχει reports και να είναι όσο το δυνατόν απλούστερο για τους developers να προσθέτουν τα δικά τους reports.&lt;br&gt;&lt;br&gt;Όταν ο χρήστης επιλέγει ένα report, σε ένα διπλανό panel η φόρμα ανοίγει ένα έτοιμο user control (διαφορετικό για κάθε report) το οποίο μαζεύει τις απαραίτητες παραμέτρους. Μόλις γίνει click στο print, η φόρμα ζητάει από το user control τις παραμέτρους και τις μεταβιβάζει στο αντίστοιχο function που εμφανίζει το report.&lt;br&gt;&lt;br&gt;Το μοντέλο είναι ουσιαστικά MVC με την φόρμα να είναι ο controller, το parameters user control να είναι το view, και οι παράμετροι (η αν θέλετε το object των παραμέτρων) να είναι το model.&lt;br&gt;&lt;br&gt;Ο parent controller λοιπόν (από τον οποίο γίνονται inherit όλες οι φόρμες που κάνουν αυτή τη δουλιά, απλά με άλλα reports) έχει πάνω του μια μέθοδο AddReport την οποία χρησιμοποιούν οι developers για να προσθέσουν τα δικά τους reports σαν επιλογές. Αυτή θα πρέπει να δέχεται τα εξής ορίσματα:&lt;br&gt;&lt;ol&gt;&lt;li&gt;Τον τίτλο του report&lt;/li&gt;&lt;li&gt;Τον τύπο του user control το οποίο μαζεύει τις απαιτούμενες παραμέτρους&lt;/li&gt;&lt;li&gt;Την συνάρτηση η οποία πρέπει να κληθεί για να πάρει τις παραμέτρους και να εμφανίσει το report&lt;/li&gt;&lt;/ol&gt;Το πρόβλημά μου είναι ουσιαστικά στο 3. Μια επιλογή που έχω υλοποιήσει είναι μέσα στο instance του controller που δουλεύω να ορίζω ένα delegate sub με τα ορίσματα της αντίστοιχης συνάρτησης και να το περνάω στο AddReport σαν System.Delegate για να το κάνω αργότερα invoke. Η λύση αυτή δεν μου αρέσει όμως γιατί αναγκάζει τους developers (juniors) να μπλέκουν με τη λέξη delegate.&lt;br&gt;&lt;br&gt;Θα ήθελα να το αντικαταστήσω με ένα απλό addressOf που είναι πολύ πιο εύκολα κατανοητό. Αυτό όμως προϋποθέτει ότι ουσιαστικά υπάρχει δηλωμένο ένα generic delegate μέσα στο controller base, το οποίο από τη στιγμή δεν ξέρει όλους τους τύπους models που μπορεί να λάβει σαν παραμέτρους θα με ρίξει σε boxing το οποίο θα μου φέρει άλλα προβλήματα μετά.&lt;br&gt;&lt;br&gt;Θα ήθελα απόψεις / λύσεις, με στόχο την όσο το δυνατόν μεγαλύτερη απλοποίηση της χρήσης για τους developers.&lt;br&gt;&lt;br&gt;tnx.&lt;br&gt;&lt;br&gt;</description></item></channel></rss>