
Έχω μια UI-διαλόγου κάτι σαν αυτό: Πρέπει να επιλέξετε ένα βιβλίο από μια λίστα. Προαιρετικά, μπορείτε είτε να επιλέξετε έναν εκδότη (άλλη κατηγορία) από μια λίστα ή πληκτρολογήστε τον εκδότη-όνομα, όπως και μια σειρά.


Νομίζω ότι αυτό μου δίνει 3 τύπους όπως την έξοδο από το παράθυρο διαλόγου.


1. Βιβλίο
2. βιβλίο με τον εκδότη-class
3. βιβλίο με τον εκδότη-string


Πώς θα το μοντέλο αυτό σε αντικείμενα; Μου φαίνεται ότι το έχει ένα βιβλίο βάσης-class, και στη συνέχεια δύο υποκατηγορίες για τον εκδότη και το όνομα του εκδότη είναι η σωστή επιλογή. Οι εναλλακτικές λύσεις υπάρχουν, ίσως ευνοεί τη σύνθεση που θα δώσει ένα καλύτερο μοντέλο;




---


Θα προσπαθήσω να εξηγήσω λίγο περισσότερο. Ένα βιβλίο δεν χρειάζεται να έχουν έναν εκδότη. Το αντικείμενο εκδότης δεν είναι το ίδιο ως εκδότης-ονομασίας καταχωρισμένης ως συμβολοσειρά.


Θα πρέπει να   

-Επιλέξτε ένα βιβλίο από μια υπάρχουσα λίστα 


Μπορείτε να ένα από τα παρακάτω   

-Επιλέξτε έναν εκδότη από μια υπάρχουσα λίστα ή   

-Μπορείτε να εισάγετε ένα όνομα εκδότη ή   

-Μπορείτε να συμπληρώσετε τίποτα για τον εκδότη 

 
Πώς να διαμορφώσει αυτό το OO
=============================




> 
> Θα προσπαθήσω να εξηγήσω λίγο περισσότερο. Ένα βιβλίο δεν χρειάζεται να έχουν έναν εκδότη. Το αντικείμενο εκδότης δεν είναι το ίδιο ως εκδότης-ονομασίας καταχωρισμένης ως συμβολοσειρά.
> 
> 
> Θα πρέπει να -Επιλέξτε ένα βιβλίο από μια υπάρχουσα λίστα
> 
> 
> Μπορείτε να ένα από τα παρακάτω -Επιλέξτε έναν εκδότη από μια υπάρχουσα λίστα ή -Μπορείτε να εισάγετε ένα όνομα εκδότη ή -Μπορείτε να συμπληρώσετε τίποτα για τον εκδότη
> 
> 
> 


Ακόμα καλεί για ένα αντικείμενο προσαρμοσμένο αποτέλεσμα. Τώρα έχετε τρεις τομείς ένα αντικείμενο βιβλίο, ένα αντικείμενο εκδότη, και ένα String εκδότη. Μπορείτε στη συνέχεια να περάσει στον κώδικα που μπορεί να ασχοληθεί με το θέμα έξυπνα. Θα μπορούσατε να προσθέσετε μεθόδους για την αντιμετώπιση των αναγκών προσαρμοσμένη επεξεργασία. Αλλά στο τέλος, είναι μια εξειδικευμένη αποτέλεσμα της εν λόγω διαλόγου και δεν θα πρέπει να είναι κάποια υποπεδίο του βιβλίου ή του εκδότη ή οποιοδήποτε άλλο αντικείμενο.


Αν το βιβλίο δεν είναι τίποτα ξέρεις ότι έχεις ένα σφάλμα, γιατί θα πρέπει να έχετε ένα βιβλίο. Έχετε τέσσερις συνδυασμούς των εκδοτών αντικειμένου και Publisher\_String για την αντιμετώπιση επίσης. Από αυτό δείχνει για μένα ότι θα πρέπει να έχετε μια τάξη να ασχοληθεί ειδικά με το αποτέλεσμα.

 

Νούμερο δύο θα ήταν η προσέγγισή μου.


Θα ήθελα να έχω μια τάξη για τον Publisher με μια ιδιότητα που ονομάζεται Όνομα, μαζί με τυχόν άλλες ιδιότητες που χρειάζονται για να περιγράψει έναν εκδότη.


Στη συνέχεια, θα είχα μια τάξη για το βιβλίο με ιδιότητες για να το περιγράψει, μαζί με μια ιδιότητα τύπου εκδότη. 


Αν ο χρήστης εισάγει ένα νέο εκδότη ως μια σειρά, να δημιουργήσετε ένα νέο αντικείμενο εκδότη.


Εάν ο χρήστης δεν εισέρχεται έναν εκδότη, αφήστε την μηδενική περιουσία. Αυτό θα ικανοποιήσει την προϋπόθεση ότι το βιβλίο δεν έχει εκδότες. Εναλλακτικά, θα μπορούσατε να έχετε εκδότης με το όνομα «Δεν εκδότη», αλλά νομίζω ότι είναι υπερβολικό έξω από το δρόμο σας για να αποφύγετε μηδενικά.

 

Θα πρέπει να διαφωνήσω με αυτή τη δήλωση στην τελευταία παράγραφο:



> 
> Μου φαίνεται ότι το έχει ένα βιβλίο βάσης-class, και στη συνέχεια δύο υποκατηγορίες για τον εκδότη και το όνομα του εκδότη είναι η σωστή επιλογή.
> 
> 
> 


Οι υποκατηγορίες χρησιμοποιούνται για να αντιπροσωπεύουν «είναι-ένα-είδος-της» σχέσης. (Το παλιό κουρασμένο στερεότυπο είναι μια κατηγορία φρούτων, με την Apple και πορτοκαλί ως υποκατηγορίες.) Μια πιο ρεαλιστική παράδειγμα θα ήταν ένα σύστημα μισθοδοσίας με την κατηγορία των εργαζομένων, εξειδικεύεται με HourlyEmployee και SalariedEmployee τάξεις. Σε κάθε περίπτωση, η υποκατηγορία αντιπροσωπεύει μια συγκεκριμένη κατηγορία, κατά την υπερκλάση.


Αντίθετα, ένας εκδότης δεν είναι ένα είδος βιβλίου. Ένα καλύτερο μοντέλο θα ήταν να έχουμε μια τάξη βιβλίο και μια τάξη εκδότη, με πολλά-προς-ένα σχέση μεταξύ τους (ένα βιβλίο που έχει ένα και μόνο εκδότη, αλλά ένας εκδότης μπορεί να παράγει πολλαπλά βιβλία).


Ένα βιβλίο έχει πολλές πιθανές ιδιότητες, όπως ο τίτλος, ISBN, εκδότης και συγγραφέας? δυναμικό χαρακτηριστικά ενός εκδότη να περιλαμβάνει το όνομα και τη διεύθυνση (ενδεχομένως πολλαπλές διευθύνσεις) και μια λίστα με τα βιβλία που έχουν εκδοθεί.


Ανάλογα με το τι προσπαθείτε να μοντέλο, ενδέχεται να χρειαστεί μια Συγγραφέας κατηγορία, αλλά αυτό είναι εκτός του πεδίου εφαρμογής της αρχικής σας ερώτηση.

 

Από τη σκοπιά OO, ΕΧΕΙ-A σχέσεις λύσει αυτό το πρόβλημα καλύτερα από τις σχέσεις IS-A σε αυτή την περίπτωση. Ένα βιβλίο-εκδότης (1: 1) και ένας εκδότης ΕΧΕΙ-Μια λίστα των βιβλίων που εκδίδει (1: πολλά). Δημιουργήστε μια τάξη βιβλίο που περιέχει μια αναφορά σε εκδότη και την κατηγορία Εκδότης που έχει μια λίστα με αναφορές σε βιβλία. Επιπλέον, ο εκδότης έχει, μια κλωστή που μπορείτε να χρησιμοποιήσετε για να εντοπίσετε ένα συγκεκριμένο εκδότη

 

Δεν θα μπορούσε να δημιουργήσει μια τάξη εκδότη να κληρονομήσει το βιβλίο, δεδομένου ότι Publisher δεν είναι ένα βιβλίο, είναι μεταδεδομένα πληροφορίες *σχετικά με* ένα βιβλίο. Η Αγία Γραφή όμως, θα κληρονομήσει το βιβλίο.


Η συμβουλή μου θα ήταν να δημιουργηθεί ένα ακίνητο εκδότη για το βιβλίο. Αυτό Εκδότης θα μπορούσε να είναι τύπου IPublishInformation, και ο εκδότης χορδών θα μπορούσε να χρησιμοποιήσει ένα NamedPublisher {κορδόνι Name} τάξη, την εφαρμογή IPublishInformation.


Αυτό είναι σκέψεις μου έτσι κι αλλιώς!

 

Δοκιμάστε αυτό το (C #):
  




```
Class Book
{
   public string Name;
   public List<Publisher> publishers = new List<Publishers>;

   Book()
   {
      // Load publishers array with relevant instances of Publisher class...
   }
}

Class Books
{
   private List<Book> books = new List<Book>;
   public Books()
   {
      // Load books array with all books...
   }

   public List<Book> GetBook (string publisher)
   {
      List<Book> retVal = new List<Book>;
      foreach (Book item in books)
      {
         if (item.Publisher.Name == publisher)
         {
            retVal.Add(item);
         }
      }
   }

   public List<Book> GetBook (Publisher publisher)
   {
      List<Book> retVal = new List<Book>;
      foreach (Book item in books)
      {
         if (item.Publisher.Name == publisher.Name)
         {
            retVal.Add(item);
         }
      }
   }
}

Class Publisher
{
   public string Name;
}

```
 

Αν υποτεθεί ότι Βιβλία μπορεί να έχει πολλαπλές εκδότες. Τότε θα θα επιστρέψει ένα BookSelectonResult με δύο proprieties. Ένα σύνολο με ένα βιβλίο και ένα άλλο σύνολο με το επιλεγμένο εκδότη. Αυτή η απάντηση επίσης να υποθέσουμε ότι έχετε μια τάξη βιβλίο, μια τάξη εκδότη, και μια κατηγορία συλλογή για το καθένα.


Το θέμα του διαλόγου είναι να επιστρέψει ό, τι επιλεγεί ο χρήστης. Αυτό είναι ένα μοναδικό «πράγμα», έτσι αξίζει το δικό κατηγορία. Αν το μόνο που έκαναν είναι να επιστρέψει ένα μόνο βιβλίο ή ένα μόνο εκδότη στη συνέχεια, χρησιμοποιώντας το αρχικό τάξη απ 'ευθείας θα είναι εντάξει. Αλλά εδώ έχετε πολλές δυνατότητες στα αποτελέσματα έτσι ώστε να απαιτεί μια μοναδική κατηγορία αποτέλεσμα.


Το άλλο ζήτημα είναι πόσο ασήμαντο είναι αυτός ο διάλογος; Για παράδειγμα, επιλέγοντας ένα όνομα αρχείου για να ανοίξει ένα βιβλίο. Η ύπαρξη όνομα του αρχείου είναι φευγαλέα αυτό που θέλετε είναι το βιβλίο που πρέπει να αποθηκεύονται στο σύστημά σας. Το ίδιο και για το αποτέλεσμα της επιλογής ένα βιβλίο και ένα εκδότη. Αν είχατε ένα άλλο αντικείμενο για να κρατήσει το αποτέλεσμα ήδη (όπως ένα check out λίστα), τότε σας προτείνω να μην ασχοληθείτε με τυχόν ειδικές μεθόδους ή τάξεις. Bundle το παράθυρο διαλόγου σε ένα αντικείμενο εντολών και μόλις επιστρέψει το αποτέλεσμα των μελών του διαλόγου τάξης. Στη συνέχεια επεξεργάζεται το αποτέλεσμα εκεί που τελικά αποθηκεύονται.


Στο λογισμικό CAM μου να κάνω αυτό συχνά με το διάλογο που χειραγωγούν τις επιλογές ρύθμισης παραμέτρων, αντί της χρήσης περίτεχνη αρχιτεκτονική Model-View-παρουσιαστής μου. Ο λόγος που μπορεί να ξεφύγει με αυτό οφείλεται στο γεγονός ότι, όταν ένας χρήστης κλικ σε ένα στοιχείο ή να εκτελέσετε μια ενέργεια, ο ελεγκτής UI εκτελεί ένα αντικείμενο εντολών που στη συνέχεια χειρίζεται το μοντέλο. Όλα πάνε μέσω εντολών αντικειμένου στο setup μου. Έτσι, για ασήμαντο διαλόγους που μόλις τα συνδυάζουν με αντικείμενα εντολών που χρησιμοποιεί το διάλογο και όχι να δημιουργήσει ολόκληρο το στρώμα MVP.


Σε τελική ανάλυση, είναι μια κλήση κρίσης. 

 

Νομίζω ότι είναι δύσκολο να πάρουν μια απόφαση σχεδιασμού που βασίζεται ακριβώς σε αυτό το παράθυρο διαλόγου. Για παράδειγμα, είστε επιλέγοντας από ένα σύνολο των υπαρχόντων βιβλίων; Σε αυτή την περίπτωση, τι θα γινόταν αν ο χρήστης εισάγει έναν εκδότη που δεν υπάρχει; Σε αυτήν την περίπτωση, μπορεί να μην θέλετε να επιστρέψετε μια παρουσία οποιασδήποτε κατηγορίας βιβλίο σε όλα, αλλά εγείρει κάποια εξαίρεση. 


Μήπως όλα τα βιβλία σε περίπτωση που σας έχουν εκδότες; Αν ναι, τότε συμφωνώ με @Bob που θα μπορούσατε να κάνετε μια τάξη εκδότη, και να έχουν μια τάξη βιβλίο περιέχει ένα στιγμιότυπο ενός αντικειμένου εκδότη. Εάν μόνο μερικά βιβλία έχουν Publishers, τότε θα μπορούσε να πάει με το μοντέλο κληρονομιά που περιγράφετε, αλλά θα ήθελα να καταρρεύσει επιλογές 2 και 3 σε μία μόνο επιλογή (και πάλι με τη χρήση ενός αντικειμένου Εκδότης), γιατί αλλιώς θα μπορούσατε να καταλήξετε με δύο παρουσίες του ίδιου βιβλίο που είναι αντικείμενα διαφόρων τύπων (εκείνη όπου ο χρήστης εισάγει τον εκδότη ως μια σειρά, και μία φορά επιλέγοντας από τη λίστα).


--Phil

 