<?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>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56351.aspx</link><pubDate>Tue, 12 Jan 2010 00:05:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56351</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56351.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56351</wfw:commentRss><description>Δεν απαντώ επίτηδες περιμένοντας να ακουστούν και άλλες γνώμες.</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56349.aspx</link><pubDate>Mon, 11 Jan 2010 22:45:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56349</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56349.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56349</wfw:commentRss><description>Εγώ θα πήγαινα κατευθείαν στο δ. με μια γερή δόση caching και asynchronicity. Αν μοντελοποιήσεις τις κλήσεις του εκάστοτε UI component σε κάποιου είδους IDataRequest interface, και το κεντρικοποιήσεις - &lt;i&gt;ότι ακριβώς προτείνεις δηλαδή αν δεν κάνω λάθος&lt;/i&gt; - πιστεύω ότι είσαι πολύ πιο ευέλικτος σε επιλογές και refactoring όταν και όπου χρειαστεί. &lt;br&gt;&lt;br&gt;Επίσης είναι πολύ πιθανό να καταλήξεις σε ένα όμορφο generic client - server design, το οποιό θα χρησιμοποιήσεις σε διάφορα projects, άσχετα με τον τύπο του client ( &lt;i&gt;ο κόσμος όλος δεν είναι ακόμα WPF ή Silverlight ...&lt;/i&gt; )&lt;br&gt;&lt;br&gt;Βέβαια, αυτό σημαίνει οτι θα πρέπει να "&lt;i&gt;ακροβατήσεις&lt;/i&gt;" λίγο στην αρχή μεταξύ ευελιξίας και πραγματικότητας ( ... &lt;i&gt;φαντάζομαι ότι μπορεί να μπλέξεις για .. αιώνες προσπαθώντας να καλύψεις υποπεριπτώσεις υποπεριπτώσεων, και όπως όλοι ξέρουμε ο χρόνος δεν είναι άπειρος&lt;/i&gt; ... ) στο design σου, αλλά .. πως να το πώ ... it feels right φίλε :D&lt;br&gt;</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56323.aspx</link><pubDate>Mon, 11 Jan 2010 03:37:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56323</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56323.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56323</wfw:commentRss><description>&lt;P&gt;Εξήγησε μας λίγο παραπάνω γιατί θέλεις να υπάρχει αυτή η μέθοδος η οποία μαζεύει όλα τα request και επιστρέφει όλα τα responses? Εννοείς ένα ένα; Δηλαδή να του δίνεις το request id πχ και να σου επιστρέφει το response το οποίο μπορεί να έχει πάρει ήδη (το οποίο το τραβάει απο το array)? &lt;/P&gt;
&lt;P&gt;Εάν είναι ασύγχρονο υπάρχει callback method η οποία καλείτε, δεν χρειάζεται να φτιάξεις δικό σου. &lt;/P&gt;
&lt;P&gt;Κάπου σε χάνω, για ρίξε λίγο φως.&lt;/P&gt;</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56322.aspx</link><pubDate>Mon, 11 Jan 2010 03:19:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56322</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56322.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56322</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;Panagiotis Kefalidis:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;
&lt;P&gt;Ένα flag το οποίο υποδηλώνει ότι όλα τα επόμενα calls πρέπει να φύγουν σαν batch&amp;nbsp;θα καλύψει αυτό το scenario (Initilization της εφαρμογής κλπ)&amp;nbsp;χωρίς να αυξήσει την πολυπλοκότητα.&lt;/P&gt;
&lt;P&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Καλή ιδέα κι αυτή! Κάνει περισσότερο ευέλικτο το κόλπο. Πάντα με τη χρήση&amp;nbsp;μιας generic composite method όμως που θα παίρνει όλα τα requests και θα επιστρέφει όλα τα responses.&lt;/P&gt;</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56321.aspx</link><pubDate>Mon, 11 Jan 2010 03:10:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56321</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56321.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56321</wfw:commentRss><description>&lt;P&gt;A οκ για το σχήμα, makes sense τώρα. &lt;/P&gt;
&lt;P&gt;Δεν νομίζω ότι θα πρέπει να το κάνεις τόσο πολύπλοκο απλά για να καλύψεις κάποιες περιπτώσεις. Ένα flag το οποίο υποδηλώνει ότι όλα τα επόμενα calls πρέπει να φύγουν σαν batch&amp;nbsp;θα καλύψει αυτό το scenario (Initilization της εφαρμογής κλπ)&amp;nbsp;χωρίς να αυξήσει την πολυπλοκότητα. Θα είναι δουλειά του data module να τα μαζέψει αυτά σε ένα call και να τα στείλει.&lt;/P&gt;</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56319.aspx</link><pubDate>Mon, 11 Jan 2010 02:43:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56319</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56319.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56319</wfw:commentRss><description>&lt;P&gt;ok, άρα προτείνεις κυρίως α και β.&lt;/P&gt;
&lt;P&gt;σημείωση: είναι λίγο απλοϊκό το σχήμα μου :), μην πιάνεστε από το αυτό. Απλά ήθελα να δείξω ένα παράδειγμα όπου μια κλήση ενεργοποιήτε επειδή υπάρχει το module 1 και μια άλλη λόγω του module 2.&lt;/P&gt;
&lt;P&gt;Να προσθέσω ότι η περίπτωση δ είναι ίσως χρήσιμη και αξίζει την πολυπλοκότητά της σε ιδιαίτερες περιπτώσεις. π.χ. κατά το άνοιγμα ενός client ξέρω ότι θα γίνουν μερικές συγκεκριμένες κλήσεις, οπότε τις συγκεντρώνω σε μια κλήση και τις εκτελώ μαζί. Βοηθά αρκετά στη μείωση του χρόνου που χρειάζεται για να ανοίξει&amp;nbsp;ένας client.&lt;/P&gt;</description></item><item><title>Απ: Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56317.aspx</link><pubDate>Mon, 11 Jan 2010 02:14:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56317</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56317.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56317</wfw:commentRss><description>&lt;P&gt;Έτσι όπως το έχει σχεδιάσει πάντως στην εικόνα, δεν είναι κι ότι καλύτερο. Τα modules τα οποία έχουν να κάνουν με data πρέπει να καλέσουν το "module data". Κοινώς να καλέσουν το module το οποίο είναι υπεύθυνο να δώσει δεδομένα στους άλλους (κάτι σαν το δ) που περιέγραψες). &lt;/P&gt;
&lt;P&gt;Εκεί επάνω θα εφαρμόσεις Caching και Asynchronous calls ώστε να γλύτωσεις round-trip με την βάση αλλα και να για μπορείς να χρησιμοποιήσεις τεχνολογίες όπως το Windows Server AppFabric (former Velocity)&amp;nbsp;και το memcached εύκολα, εφόσον όλα τα data calls είναι "συγκεντρωμένα". Εφόσον τα request θα εκτελούνται ασύγχρονα δεν χρειάζεται να έχεις ένα array απο requests κι ενα array απο responses κλπ. Ασύγχρονο είναι, όσο έρχονται, σερβίρεις.&lt;/P&gt;</description></item><item><title>Λιγότερα roundtrips vs Modularity</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/56310.aspx</link><pubDate>Sun, 10 Jan 2010 22:28:44 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:56310</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/56310.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=56310</wfw:commentRss><description>&lt;P&gt;Θα σας εκφράσω μια σκέψη μου και μου λέτε πως το βλέπετε κι εσείς.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Λιγότερα Roundtrips&lt;/STRONG&gt;: Όταν έχεις μια multi-tier εφαρμογή προσπαθείς να ελαττώσεις όσο γίνεται τις κλήσεις από το ένα tier στο άλλο (συνήθως μεταξύ του end-user client και του application server). Ο σκοπός είναι πάντα να βελτιώσεις το performance και το scalability. Δηλαδή πιο γρήγορος client και λιγότερα resources στον server.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Modularity&lt;/STRONG&gt;: Όταν έχεις ένα modular client (modules προστίθενται/ενεργοποιηούνται ανάλογα με configuration και άλλα κριτήρια) προσπαθείς να κρατήσεις αυτά τα modules ανεξάρτητα το ένα από το άλλο. π.χ. στην εικόνα υπάρχουν 2 modules που καλούν τον server για να πάρουν τα data που θέλουν να εμφανίσουν. Δεν γίνεται μια κλήση για να φέρει τα data και για τα δυο, γιατί πολύ απλά&amp;nbsp;δεν είναι απαραίτητο ότι και τα δυο αυτά modules θα είναι ορατά. Επίσης δεν είναι απαραίτητο ότι είναι ορατά μόνο αυτά. Μπορεί αν υπάρχουν και άλλα ορατά modules!&lt;/P&gt;
&lt;P&gt;Τι κάνουμε λοιπόν (με σειρά ευκολίας και λιγότερων συμβιβασμών);&lt;/P&gt;
&lt;P&gt;α) &lt;STRONG&gt;Cache&lt;/STRONG&gt;: Όπου είναι δυνατόν προσπαθούμε να χρησιμοποιήσουμε κάποιας μορφής cache. Έτσι&amp;nbsp;αφήνουμε τα modules να κάνουν τις κλήσεις που θέλουν ανεξάρτητα από τα άλλα (καλό modularity),&amp;nbsp;αλλά τα data να έρχονται από την cache χωρίς να γίνεται κλήση στον server (λιγότερα roundtrips).&lt;/P&gt;
&lt;P&gt;β) &lt;STRONG&gt;Asynchronous calls&lt;/STRONG&gt;: Χρησιμοποιούμε ασύγχρονες κλήσεις για το φόρτωμα των δεδομένων. Δεν γλιτώνουμε roundtrips αλλά πιθανότατα κάνουμε τον client να λειτουργεί πιο γρήγορα μια που τα modules θα καλούν τον server παράλληλα και όχι το ένα μετά το άλλο.&lt;/P&gt;
&lt;P&gt;γ) &lt;STRONG&gt;Sacrifice&lt;/STRONG&gt;: Προσπαθούμε να ομαδοποιήσουμε κάποιες κλήσεις θυσιάζοντας το modularity. π.χ. ενώνουμε κάποια modules που θεωρούμε ότι το πιθανότερο είναι να λειτουργούν ταυτόχρονα.&lt;/P&gt;
&lt;P&gt;δ)&amp;nbsp;&lt;STRONG&gt;Composite Server Calls&lt;/STRONG&gt;:&amp;nbsp;Δημιουργούμε κάποιους mediators/proxies στον client τους οποίους καλούν τα modules αντί να καλούν απευθείας τον server. Αυτοί οι mediators γνωρίζουν ποια modules είναι ενεργά και ξέρουν ότι κάποια στιγμή θα λάβουν κλήσεις από αυτά. Καλούν λοιπόν μια φορά τον server και φέρνουν όλα τα data που θέλουν τα modules χρησιμοποιώντας μια composite server method που παίρνει ένα array από requests (ένα request από κάθε module) και επιστρέφει ένα array από responses. Όταν πάρουν την απάντηση με το array από τα responses το&amp;nbsp;κρατάνε κάπου και όταν τα modules καλούν δίνουν έτοιμες τις απαντήσεις.&lt;/P&gt;</description></item></channel></rss>