<?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>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/27589.aspx</link><pubDate>Sun, 01 Apr 2007 02:04:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:27589</guid><dc:creator>a.soursos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/27589.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=27589</wfw:commentRss><description>Συμφωνώ με τον κ. Καναβό,&amp;nbsp; τουλάχιστον στο &lt;A href="http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx"&gt;Link Project&lt;/A&gt;&amp;nbsp;δημιουργούν κλάσεις-objects για να κάνουν queries απάνω σε αυτές και έχουν άρθρα του τύπου &lt;A href="http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/linq_over_dataset_for_csharp_developers.doc"&gt;LINQ Over DataSet for C# Developers&lt;/A&gt;, σαν να λέμε ότι η καινούρια τεχνολογία.. αυτή που&amp;nbsp;θα&amp;nbsp;υποστηριχτεί από την Microsoft, θα υποστηρίζει και τα Datasets. Οπότε για projects που θα έχουν την δυνατότητα να χρησιμοποιήσουν το Linq Project (&amp;nbsp;δηλαδή την C# 3.0&amp;nbsp;), και το LINQ τους λύνει όλα τα προβλήματα, δεν βλέπω τον λόγο να χρησιμοποιησούμε Datasets ( και να έχουμε ενδιάμεσες κλάσεις για να κάνουν ερωτήματα με το LINQ&amp;nbsp;). Ανάλογα το Project {&amp;nbsp;χρόνος υλοποίησης,&amp;nbsp;complexity, team knowledge, maintenance plan } επιλέγεις και την κατάλληλη λύση, δεν είναι απαραίτητα η σωστή επιλογή το α)&amp;nbsp; ή το β).</description></item><item><title>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/27215.aspx</link><pubDate>Wed, 28 Mar 2007 06:55:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:27215</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/27215.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=27215</wfw:commentRss><description>Ένα hint για το πού πάνε τα πράγματα μπορεί να το πάρει κανείς παρατηρώντας κάποια ανεπαίσθητα στοιχεία: Το Validation Application Block του Enterprise Library v3 δουλεύει με κλάσεις. Το Policy Injection Application Block το ίδιο. Το Linq δημιουργεί αντικείμενα από queries. &lt;br&gt;Ο Hejlsberg μιλά για datasets χρησιμοποιώντας τον αόριστο.&lt;br&gt;&lt;br&gt;Πέρα από αυτό, όταν έχεις να αντιμετωπίσεις μεταβαλλόμενες απαιτήσεις από πελάτη σε πελάτη, δεν μπορείς να χρησιμοποιήσεις ένα στατικό object model. Πρέπει να φτιαχτεί έτσι ώστε να μπορεί να μεταβάλλεται ανάλογα με τις απαιτήσεις, χωρίς να χρειάζεται να ξανακάνεις compile. Ευτυχώς, κάποια ORM το υποστηρίζουν αυτό, π.χ. το NHibernate επιτρέπει τον ορισμό δυναμικών properties τα οποία φορτώνονται σε ένα dictionary. Έτσι ορίζει κανείς τα business entities της εφαρμογής του στη φάση της ανάπτυξης αλλά μπορεί να τροποποιήσει τα δυναμικά properties απλώς αλλάζοντας το mapping file του ORM. Χρησιμοποιώντας μετά ένα workflow engine, όπως το WWF, μπορεί να αλλάξει και τη συμπεριφορά της εφαρμογής ανάλογα με τις απαιτήσεις.&lt;br&gt;&lt;br&gt;Τα πράγματα είναι λίγο πιο περίπλοκα όταν πρέπει να αλλάξουν ακόμα και τα business entities. Τα περισσότερα ORM θεωρούν ότι οι κλάσεις υπάρχουν ήδη, κάτι λογικό καθώς δεν είναι εύκολο να δημιουργήσεις μία κλάση από το μηδέν κατά την εκτέλεση της εφαρμογής. Η χρήση CodeDom το επιτρέπει αυτό βέβαια, αλλά μπλέκει κανείς με τα permissions. Θα μπορούσε κανείς να φτιάξει μία και μοναδική κλάση, π.χ. BusinessEntity και να ορίσει δυναμικά properties για κάθε διαφορετικό business entity. Αυτό είναι σχετικά δύσκολο με το NHibernate, γιατί ουσιαστικά σημαίνει ότι ένα αντικείμενο μπορεί να φορτωθεί από πολλούς διαφορετικούς πίνακες. Μία λύση θα ήταν να χρησιμοποιήσει κανείς πολλά διαφορετικά mapping files του BusinessEntity σε διαφορετικό πίνακα κάθε φορά, δημιουργώντας ένα καινούριο Configuration αντικείμενο κάθε φορά. Τα πράγματα θα ήταν πολύ πιο εύκολα αν μπορούσε κανείς να ορίσει πολλαπλά mappings μεταξύ κλάσεων και πινάκων, όχι μόνο μία κλάση προς ένα mapping. &lt;br&gt;&lt;br&gt;Το τελευταίο πράγμα που χρειάζεται να οριστεί είναι οι μέθοδοι του κάθε αντικειμένου. Ευτυχώς, χρησιμοποιώντας το Workflow Engine μπορεί κανείς να ορίσει τα business processes. Αυτό που μένει είναι οι πιο απλές μέθοδοι που κανονικά είναι αρμοδιότητα κάθε κλάσης, μέθοδοι που έχουν να κάνουν με συγκεκριμμένους υπολογισμούς κλπ. Εδώ μπορεί κανείς να χρησιμοποιήσει τεχνικές scripting, για να επιτρέψει την τροποποίηση της εφαρμογής ακόμη και στον πελάτη. Ή μπορεί να δημιουργήσει βιβλιοθήκες με τις μεθόδους που θέλει να έχει το κάθε business entity και να προσθέσει τις μεθόδους στο κάθε BusinessEntity σαν delegates. Ενδιάμεσα μπορούν να χρησιμοποιηθούν και άλλες τεχνικές, όπως τα DynamicMethods. &lt;br&gt;&lt;br&gt;Τα πράγματα θα γίνουν πολύ πιο ενδιαφέροντα με τη C# 3.0 χρησιμοποιώντας δυνατότητες όπως τα extension methods για να προστεθούν νέες μέθοδοι σε κλάσεις, το LINQ και το type inferencing για να δημιουργηθούν οι διάφοροι τύποι από τα αποτελέσματα διαφόρων queries.&lt;br&gt;</description></item><item><title>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/27206.aspx</link><pubDate>Wed, 28 Mar 2007 05:38:04 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:27206</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/27206.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=27206</wfw:commentRss><description>Θα συμφωνήσω με το φίλο palladin, με ένα μικρό "twist". &lt;br&gt;&lt;br&gt;Εξαρτάται απο το πόσο "πλατφορμική" είναι η εφαρμογή σου. Σε περιπτώσεις που υπάρχει ένα "ξεκάθαρο" object-domain model το οποίο αλλάζει σε σχετικά μικρό βαθμό απο πελάτη/χρήση/feature σε πελάτη/χρήση/feature, πάμε για O/R Mapping,&amp;nbsp; με ιδιέταιρη προσοχή στο performance. &lt;br&gt;&lt;br&gt;.. αν βέβαια μπλέξεις με "μπελάτη" και το schema σου αλλάζει ... κατά το δοκείν του εκάστοτε υπαλλήλου που ουδεμία σχέση έχει με το θέμα που καλείσαι εσύ να λύσεις ... go for datasets, ίσως αποδειχθεί πιο ευέλικτο.&lt;br&gt;&lt;br&gt;Και φυσικά έχει πάντα να κάνει με το background σου, με τί έχεις ασχοληθεί στο παρελθόν και φυσικά ... πόσο χρόνο έχεις να το ψάξεις. Ένα κακό domain model θα σου βγάλει στνη πορεία πολλά περισότερα μερεμέτια απο ένα κακό typed dataset - νομίζω ... &lt;br&gt;&lt;br&gt;Άντε και καλό μας βράδυ ... &lt;br&gt;</description></item><item><title>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/25661.aspx</link><pubDate>Thu, 01 Mar 2007 08:27:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:25661</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/25661.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=25661</wfw:commentRss><description>&lt;P&gt;Το θέμα είναι μεγάλο και αρκετά σύνθετο.&lt;/P&gt;
&lt;P&gt;Μπορείς να πάρεις μια ιδέα από τα παρακάτω άρθρα&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.informit.com/articles/printerfriendly.asp?p=31099&amp;amp;rl=1"&gt;http://www.informit.com/articles/printerfriendly.asp?p=31099&amp;amp;rl=1&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/msdnmag/issues/05/08/CuttingEdge/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/05/08/CuttingEdge/default.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Έως ένα βαθμό έχει να κάνει και με το&amp;nbsp;background που έχει ο καθένας.&lt;/P&gt;
&lt;P&gt;Γενικά νομίζω ότι υπάρχουν κάποια συγκεκριμένα camps&lt;/P&gt;
&lt;P&gt;- Yπάρχει το camp της smalltalk που δίνουν μεγάλη βάση στα objects και στο σωστό object design. &lt;/P&gt;
&lt;P&gt;Ατάκα "code must be close to the data" or code + data = objects&lt;/P&gt;
&lt;P&gt;θεωρούν το persistence ως ένα αναγκαίο κακό!!!&lt;/P&gt;
&lt;P&gt;-Υπάρχει το camp των database guys που δίνουν μεγάλη βάση στο erd τους. Yπάρχει σαφείς διαχωρισμός μεταξύ code and data και προσπαθούν να κρατούν και τα data και την λογική στην βάση&lt;/P&gt;
&lt;P&gt;-Τέλος, υπάρχει και η μέση οδός που προσπαθούμε να συμβιβάσουμε και τους δυο κόσμους... (βλέπε Ο/R mapping)&lt;/P&gt;
&lt;P&gt;Εγώ προσωπικά προσπαθώ να ακολουθώ πιστα BusinessObjects design, αλλα αφήνω και ένα escape path στον κόσμο του dataset και της sql (για τις δύσκολες περιπτώσεις...performance)&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/25651.aspx</link><pubDate>Thu, 01 Mar 2007 05:03:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:25651</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/25651.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=25651</wfw:commentRss><description>&lt;P&gt;Ναί, όντως το θέμα αυτό το έχουμε κουβεντιάσει αρκετά και ιδιαίτερα στο πρώτο community event! (Και να δεις που θα φουντώσει εκ νέου :))&lt;/P&gt;
&lt;P&gt;Τώρα, ως προς την ερώτησή σου, πιστεύεις ότι η B σχεδίαση θα σε βοηθήσει όταν χρειαστεί να γίνουν αλλαγές στο BLL? Θα πρέπει να κάνεις αλλαγές σε δύο σημεία... Καλύτερη είναι η Α σχεδίαση. Όσο πιο απλά και αφαιρετικά είναι τα layers τόσο το καλύτερο. Το DAL θα πρέπει να ενδιαφέρεται μόνο για το πως θα πάρει τα data από το data store. Αν σε "ενοχλεί" που το BLL πέρα από το business θα ασχολείται με το πως θα γυρίσει τα data σε entities μπορείς πάντοτε να απομονώσεις αυτό το functionality σε ένα ξέχωριστό layer που θα λειτουργεί ως adapter μεταξύ των δύο.&lt;/P&gt;</description></item><item><title>Απ: DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/25649.aspx</link><pubDate>Thu, 01 Mar 2007 04:19:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:25649</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/25649.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=25649</wfw:commentRss><description>&lt;P&gt;Καλώς ήλθες φίλε μας.&lt;/P&gt;
&lt;P&gt;Ανοίγεις ένα θέμα το οποίο έχει συζητηθεί με διάφορες παραλλαγές στο παρελθόν, και όχι μόνο για την επικοινωνία μεταξύ DAL και BLL. Ρίχοντας μια ματιά και σε προηγούμενες δημοσιεύσεις σίγουρα θα βρείς πολλές και ενδιαφέρουσες απόψεις.&lt;/P&gt;
&lt;P&gt;Ομως, για το συγκεκριμένο σου ερώτημα, η απάντηση που πιστεύω οτι όλοι έχουμε στο μυαλό μας είναι η εξής: Αν το DAL ξέρει τα classes του BLL, τοτε έχουμε κυκλική εξάρτηση (το BLL ξέρει το DAL και το DAL ξέρει το BLL). Συνεπώς, η απάντηση που θα μπορούσα να δώσω είναι η εξής: Το DAL πρέπει να φέρει τα δεδομένα σε μια οικεία του μορφή (π.χ. datasets) και το BLL να αναλάβει να διαμορφώσει τις custom entity classes (αν χρησιμοποιεί τέτοιες) με βάση αυτά τα δεδομένα. &lt;/P&gt;
&lt;P&gt;Ετσι (υποθέτουμε οτι έχουμε 3 tiers) το UI θα ξέρει το BLL, και το BLL θα ξέρει το DAL. Το DAL θα ξέρει μόνο το data store, και αυτό θα το κάνει να είναι ανεξάρτητο από το ποιός το καλεί.&lt;/P&gt;
&lt;P&gt;Η υπόθεση σηκώνει "νερό" μόνο αν έχουμε n-tier αρχιτεκτονικές, αλλά και πάλι οι κυκλικές εξαρτήσεις είναι τζιζ. Φυσικά, μην μείνεις μόνο στη δική μου άποψη, γιατί είμαι σίγουρος οτι και άλλοι συνάδελφοι θα απαντήσουν εν καιρώ στο συγκεκριμένο ερώτημα.&lt;/P&gt;</description></item><item><title>DataSet ή Custom Classes</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/25647.aspx</link><pubDate>Thu, 01 Mar 2007 04:07:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:25647</guid><dc:creator>Nescafe</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/25647.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=25647</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN:0cm 0cm 10pt;"&gt;&lt;FONT face=Calibri size=3&gt;Αυτή είναι η πρώτη δημοσίευση μου στο &lt;SPAN style="mso-ansi-language:EN-US;"&gt;forum&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;του &lt;SPAN style="mso-ansi-language:EN-US;"&gt;dotnetzone&lt;/SPAN&gt;.&lt;SPAN style="mso-ansi-language:EN-US;"&gt;gr&lt;/SPAN&gt;, και θα ήθελα να θέσω το θέμα της επικοινωνίας μεταξύ 2 &lt;SPAN style="mso-ansi-language:EN-US;"&gt;layers&lt;/SPAN&gt;. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0cm 0cm 10pt;"&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ας&lt;SPAN style="mso-ansi-language:EN-US;"&gt; &lt;/SPAN&gt;υποθέσουμε&lt;SPAN style="mso-ansi-language:EN-US;"&gt; &lt;/SPAN&gt;ότι&lt;SPAN style="mso-ansi-language:EN-US;"&gt; &lt;/SPAN&gt;έχουμε&lt;SPAN style="mso-ansi-language:EN-US;"&gt; &lt;/SPAN&gt;ένα&lt;SPAN style="mso-ansi-language:EN-US;"&gt; &lt;SPAN&gt;3-tier application (Interface, Business Logic Layer, Data Access Layer) . To&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;BLL&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;θέλει δεδομένα από το &lt;SPAN style="mso-ansi-language:EN-US;"&gt;DDL&lt;/SPAN&gt;, &lt;SPAN style="mso-ansi-language:EN-US;"&gt;to&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;DDL&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;κάνει την δουλεία του παίρνει από την &lt;SPAN style="mso-ansi-language:EN-US;"&gt;database&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;τα δεδομένα, ποίος τρόπος είναι ο καλύτερος για να τα στήλη στο &lt;SPAN style="mso-ansi-language:EN-US;"&gt;BLL&lt;/SPAN&gt;, &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0cm 0cm 10pt;"&gt;&lt;FONT face=Calibri size=3&gt;α)να στήλη ένα &lt;SPAN style="mso-ansi-language:EN-US;"&gt;Dataset&lt;/SPAN&gt;/&lt;SPAN style="mso-ansi-language:EN-US;"&gt;Datatable&lt;/SPAN&gt; (&lt;SPAN style="mso-ansi-language:EN-US;"&gt;typed&lt;/SPAN&gt;, &lt;SPAN style="mso-ansi-language:EN-US;"&gt;untyped&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;νομίζω δεν έχει και πολύ σημασία) ή &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN:0cm 0cm 10pt;"&gt;&lt;FONT face=Calibri size=3&gt;β)να τα διαμόρφωση σε &lt;SPAN style="mso-ansi-language:EN-US;"&gt;custom&lt;/SPAN&gt;&lt;SPAN&gt; entity &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;classes&lt;/SPAN&gt; (δηλαδή αντί να στήλη ένα &lt;SPAN style="mso-ansi-language:EN-US;"&gt;dataset&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;με τους &lt;SPAN style="mso-ansi-language:EN-US;"&gt;customers&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;να στήλη ένα &lt;SPAN style="mso-ansi-language:EN-US;"&gt;collection&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;of&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;customers&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="mso-ansi-language:EN-US;"&gt;class&lt;/SPAN&gt;) και να σταλούν πίσω στο &lt;SPAN style="mso-ansi-language:EN-US;"&gt;BLL&lt;/SPAN&gt;.&lt;/FONT&gt;&lt;/P&gt;</description></item></channel></rss>