Μια και εγώ είχα γράψει το αρχικό 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