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

 

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

Ερώτηση για υλοποίηση Business Objects (μάλλον θεωρητική)

Îåêßíçóå áðü ôï ìÝëïò DeClen. Τελευταία δημοσίευση από το μέλος cap στις 25-06-2007, 10:30. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-06-2007, 13:07 32716

    Ερώτηση για υλοποίηση Business Objects (μάλλον θεωρητική)

    Παιδιά καλησπέρα,

    Ψάχνοντας λίγο τα post του forum έπεσα πάνω στο post του cap

    Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις


    Έκατσα και το ξανα-διάβασα με προσοχή (λέω "ξανά" γιατί το είχα διαβάσει και παλαιότερα αλλά λόγω ελλήψεων στις γνώσεις μου δεν είχα καταλάβει και πολλά...). Επικεντρώθηκα λίγο στα Business Objects και για εκπαιδευτικούς σκοπούς έκατσα και έφτιαξα ένα project-άκι. Στο project αυτό υλοποιώ ένα object με 2 string properties και 2 methods. H μέθοδος Create() απλά δίνει τιμές στα string και επιστρέφει το object και η μέθοδος Alter() παίρνει το object αλλάζει τα string και το ξαναεπιστρέφει.

    Παρακάτω φαίνεται ένα διάγραμμα των κλάσεων (για να μην κάθομαι και γράφω όλο τον κώδικα)



    Υπάρχουν λοιπόν τα TestBOIdiot και TestBOSmart αντικείμενα (εντελώς τυχαία τα ονόματα).

    Στην υλοποίηση του Idiot ορίζω απλά τα properties του και στη συνέχεια έναν manager με τα methods του. Ο κώδικας που χρησιμοποιώ για να το καλέσω είναι:

    1
    2
    Dim myTestBOIdiot As New TestBOIdiot
    myTestBOIdiot = TestBOIdiotManager.Create()

    Επειδή χρησιμοποιώ κυρίως αυτον τον τρόπο υλοποίησης του 3-layer πιστεύω ότι μέχρι εδώ είμαι καλά.


    Στην υλοποίηση του Smart ορίζω τα properties και τα methods μέσα στο ίδιο το object. Ο κώδικας που χρησιμοποιώ για να το καλέσω είναι:

    1
    2
    Dim myTestBOSmart As New TestBOSmart
    myTestBOSmart = TestBOSmart.Create()

    Παράλληλα μέσα στον κώδικα δημιουργίας του έχω

    1
    2
    3
    4
    5
    6
    7
    8
    9
     Public Shared Function Create() As TestBOSmart
    'create object and return it

    _FieldA = "1"
    _FieldB = "2"

    Return New TestBOSmart()

    End Function
    (τα _FieldA και _FieldB είναι Private Shared)

    Αυτό που θέλω να ρωτήσω είναι αν η υλοποίηση του Smart είναι σωστή ή έχω κάνει κάτι λάθος. Μήπως χρειάζεται και αυτό κάποιου είδους manager?

    Ευχαριστώ.
  •  09-06-2007, 02:34 32792 σε απάντηση της 32716

    Απ: Ερώτηση για υλοποίηση Business Objects (μάλλον θεωρητική)

    Μια και εγώ είχα γράψει το αρχικό post που σε ενέπνευσε να κάνεις αυτό το διαχωρισμό, να πω μερικές σκέψεις μου:

    Στην πρώτη περίπτωση έχεις ένα απλό data carrier object (BOIdiot) και την κλάση - διαχειριστή του (BOIdiotManager). Ολα καλά, αν λάβουμε υπόψη οτι αυτή είναι μια από τις πιθανές προσεγγίσεις. Φυσικά, ο Manager μπορεί να κάνει πολύ περισσότερα πράγματα από απλή δημιουργία του object, όπως π.χ. να επικοινωνεί με τη βάση δεδομένων (η καλύτερα το DAL) για να "γεμίσει" το BOIdiot instance, κλπ.

    Στη δεύτερη περίπτωση όμως μπερδεύτηκα. Εντάξει να έχεις ένα "smart" αντικείμενο που γνωρίζει πράγματα για τον εαυτό του, αλλά γιατί shared fields; Αυτό σημαίνει οτι ΟΛΑ τα instances που θα φτιάξεις θα μοιράζονται τις τιμές των _fieldA, _fieldB.

    Η λογική shared function υπο μορφή factory method είναι ενδιαφέρουσα. Δεν ξέρω αν είθισται να χρησιμοποιείται κάτι τέτοιο (αν και έχω σκεφτεί πολλές φορές οτι θα είχε κάποια χρησιμότητα), εκεί ίσως μπορούν να μας κατατοπίσουν και οι υπόλοιποι συνάδελφοι. Ισως μια τέτοια παράθεση απόψεων σε βοηθήσει και στην απορία σου αν είναι απαραίτητος ένας manager ή οχι.

    Από την άλλη μεριά, βέβαια, τι θα μπορούσε να κάνει ένα shared factory method επάνω στην ίδια την κλάση που δημιουργεί τα instances που θέλεις, που δεν θα μπορούσε να κάνει ο ίδιος ο constructor (New()) της κλάσης, απλός ή overloaded; Ενας manager θα μπορούσε να απομονώσει τον κώδικα που χρειάζεται π.χ. για να γεμίσει το object κατόπιν επικοινωνίας με τη βάση δεδομένων, όπως προείπα. Μια shared factory method όμως και ένας constructor επάνω στο ίδιο το object σου δεν θα είχαν διαφορά μια και δεν θα απομόνωναν τίποτα.

    Βεβαια, αυτά τα λέω έχοντας πιεί δύο ποτά και καταλαβαίνεις οτι ίσως να μην είμαι τόσο..διαυγής :) Εγώ θα ήθελα να ακούσω μια άποψη και από κάποιον άλλο συνάδελφο.


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  10-06-2007, 19:28 32819 σε απάντηση της 32792

    Απ: Ερώτηση για υλοποίηση Business Objects (μάλλον θεωρητική)

    cap αρχικά σε ευχαριστώ για την ανταπόκρισή σου!

    Ας πάρουμε με τη σειρά τα πράγματα. Με όσα είπες για την 1η υλοποίηση συμφωνώ μαζί σου. Άλλωστε και εγώ χρησιμοποιώ τον manager για να κάνω όλα αυτά που προανέφερες (κυρίως business logic και επικοινωνία με το DAL). Γενικότερα μου αρέσει αυτή η προσέγγιση των stateless αντικειμένων και των αντίστοιχων διαχειριστών τους, αλλά...

    ...επειδή γενικότερα μου αρέσει να ψάχνω το τι γίνεται γενικώς, δοκίμασα και την δεύτερη υλοποίηση. Έχεις δίκιο πως η συνάρτηση Create() είναι κάπως ατυχής γιατί μπορούμε πολύ όμορφα να κάνουμε ένα overload στην New(). Για την ακρίβεια είναι ατυχής η ονομασία της...

    Ας πάρουμε καλύτερα το παράδειγμα της Alter(). Ας πούμε ότι η Alter προσθέτει ένα "!" στο κάθε field. Ο τρόπος που το έχω υλοποιήσει είναι

    1
    2
    3
    4
    5
    6
    7
    Public Shared Function Alter(ByVal myTestBOSmart As TestBOSmart) As TestBOSmart
    'alter object and return it

    _FieldA = myTestBOSmart.FieldA & "!"
    _FieldB = myTestBOSmart.FieldB & "!"

    Return New TestBOSmart()

    και μέσα στον κώδικα την καλώ

    1
    2
    3
    Dim myTestBOSmart As New TestBOSmart
    myTestBOSmart = TestBOSmart.Create()
    myTestBOSmart = TestBOSmart.Alter(myTestBOSmart)

    Να σου πω όμως την αλήθεια όμως αυτό μου φαίνεται κάπως... λάθος! Αυτό που πραγματικά θα ήθελα να κάνω είναι

    1
    myTestBOSmart.Alter()

    αλλά το μυαλό μου έχει ψιλοκολλήσει. Γενικότερα μπορώ να εντοπίσω το πρόβλημα στο ότι έχω ψιλοκολλήσει στη δημιουργία πραγματικά stateful αντικειμένων.

    Σημείωση: Πριν 2 μερούλες αγόρασα το Head First Design Patterns και από ένα γρήγορο ξεφύλλισμα μου έδωσε την εντύπωση ότι θα μου λύσει αρκετές από αυτές τις απορίες. Παρόλα αυτά την συγκεκριμένη περίοδο έχω ψιλομπερδευτεί λίγο με τα stateful αντικείμενα... Smile



  •  25-06-2007, 10:30 33136 σε απάντηση της 32819

    Απ: Ερώτηση για υλοποίηση Business Objects (μάλλον θεωρητική)

    DeClen:

    Ας πάρουμε καλύτερα το παράδειγμα της Alter(). Ας πούμε ότι η Alter προσθέτει ένα "!" στο κάθε field. Ο τρόπος που το έχω υλοποιήσει είναι

    1
    2
    3
    4
    5
    6
    7
    Public Shared Function Alter(ByVal myTestBOSmart As TestBOSmart) As TestBOSmart
    'alter object and return it

    _FieldA = myTestBOSmart.FieldA & "!"
    _FieldB = myTestBOSmart.FieldB & "!"

    Return New TestBOSmart()


    Ζητώ συγνώμη για τη φρικτή καθυστέρηση στην απάντηση. Αυτό που έχεις κάνει στο κομμάτι κώδικα που παρατίθεται είναι να δημιουργήσεις μια static method (η οποία ισχύει για την κλάση και όχι για τα instances) η οποία δέχεται ένα αντικείμενο τύπου TestBOSmart και του αλλάζει τα properties. Αυτό που δεν καταλαβαίνω στον κώδικά σου είναι γιατί επιμένεις να χρησιμοποιείς shared (static) fields εντός της shared function. Στην ουσία, αλλάζεις τις τιμές των shared fields και όχι τα properties του instance με αυτόν τον τρόπο. Ετσι, αν δώσεις στην myTestBOSmart να "φάει" τρία TestBOSmart instances, τα _FieldA και +_FieldB (τα οποία πρέπει να καταλάβουμε οτι έτσι όπως τα ορίζεις ΔΕΝ ανήκουν σε κάποιο instance - και άν ανήκουν είναι λάθος - από μια shared function δεν μπορείς να πειράξεις instance fields γιατί η shared function δεν γνωριζει σε ποιό instance αναφέρεσαι) θα κρατήσουν μόνο τις τιμές που θα προέρχονται από το τελευταίο εκ των τριών instances, και βέβαια ΚΑΝΕΝΑ instance από τα τρια δεν θα αλλάξει τιμές στα properties του.

    Η λογική θα ήταν να πεις κάτι σαν myTestBOSmart.FieldA += "!" χωρίς να χρησιμοποιείς shared πράγματα εντός της κλάσης σου.

    Ξανακοιτώντας βλέπω οτι τα έγραψα λίγο μπερδεμένα. Κεντρικό νόημα λοιπόν: Τα _fieldA και _fieldB προφανώς υποθέτεις οτι αναφέρονται στο instance που έχεις στο μυαλό σου εκείνη τη στιγμή. ΛΑΘΟΣ. Βρίσκεσαι μέσα σε μια shared function, άρα τα _fieldA και _fieldB μόνο shared μπορούν να είναι. Αν νομίζεις οτι με αυτό τον τρόπο αλλάζεις εσωτερικά fields του ΣΥΓΚΕΚΡΙΜΕΝΟΥ instance, τότε νομίζεις λάθος. (Ουφ - τα ξεμπέρδεψα τώρα ή τα μπερδεψα χειρότερα; :) )

    Στο άλλο σκέλος, αν θέλεις να είναι πραγματικά "smart" (με την έννοια που το συζητάμε εδώ) το object σου, οντως θα πρέπει να κάνεις την Alter() instance-based και όχι shared. Ετσι κάθε instance θα μπορεί να κάνει alter τον εαυτό του. Με λίγα λόγια, myTestBOSmart.Alter(). Εκεί έχει νόημα να χρησιμοποιήσεις τα _fieldA και fieldB μια και πλέον μπορούν να αναφέρονται σε τιμές του συγκεκριμένου instance.

     

     

     

     


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems