Proprietà booleane in Classe A disponibilità di controllo dei membri in Classe B: Design Pattern?

0

Dato il seguente codice:

class AnimalDescriptor {
    String species;
    boolean hasLegs;
    boolean hasTeeth;
    boolean hasHair;

    public AnimalDescriptor(String species, boolean hasLegs, 
                            boolean hasTeeth, boolean hasHair) {
        this.species = species; 
        this.hasLegs = hasLegs; 
        this.hasTeeth = hasTeeth; 
        this.hasHair = hasHair;
}

class Animal {
    AnimalDescriptor control;
    String name;
    int numberOfLegs;
    int numberOfTeeth;
    String colorOfHair;
}

class doStuff {
    public void go() {
        AnimalDescriptor dog = new AnimalDescriptor("dog", true, true, true);
        AnimalDescriptor pirahna = new AnimalDescriptor("pirahna", false, true, false);

        Animal fido = new Animal();
        fido.control = dog;
        fido.name = "Fido";
        fido.numberOfLegs = 4;
        fido.numberOfTeeth = 42;
        fido.colorOfHair = "black"; //All good here

        Animal bob = new Animal();
        bob.control = pirahna;
        bob.name = "Bob";
        bob.numberOfTeeth = 42; //So far so good
        bob.numberOfLegs = 2; //This should pass compilation, but fail 
                              //validation at run-time, since it is 
                              //nonsensical
}

Esiste un nome di modello per ciò che sto facendo qui? Ho provato a cercare variazioni sul titolo della mia domanda ma non ho ottenuto da nessuna parte.

Ovviamente, questo è un esempio estremamente semplice e abbreviato, AnimalDescriptor dovrebbe avere anche un metodo bool .validate(Animal a) , e Animal dovrebbe avere un metodo .isPropertyAvailable(String propertyName) , tra le altre aggiunte. Non volevo impantanare tutto con un esempio minuscolo di 500 righe.

Non è possibile che io sia la prima o l'unica persona a fare questo, e sono principalmente alla ricerca di qualcosa a cui aggrapparmi per ulteriori ricerche sulle migliori pratiche, i problemi di implementazione, ecc.

EDIT: Per fornire un po 'più di chiarezza, nel mio sistema ci sono ~ 20 booleani nella classe "control" (AnimalDescriptor). Sto monitorando ~ 10 6 elementi (Animali) in ~ 10 3 categorie (AnimalDescriptors) che condividono un pool di proprietà comuni, ma ogni elemento ha solo le proprietà che sono designato dalla sua configurazione "di controllo". Inoltre, il sistema dovrebbe essere in grado di espandersi, ad esempio, in 10 4 categorie (AnimalDescriptors) nei prossimi 5 anni. Abbiamo un'implementazione funzionale (se brutta), quindi non ho bisogno di validazione o eccezione how-to - Sono più interessato a come questo problema è stato affrontato in altri domini / applicazioni, i vantaggi dell'implementazione in un funzionale (come contrapposto al contesto orientato agli oggetti, best practice, ecc. Sembra che ci dovrebbe essere un nome per questo, ma non so cosa sia.

    
posta ffxtian 27.11.2013 - 16:21
fonte

1 risposta

0

Sembra che tu stia descrivendo il pattern prototype , dove alcune delle proprietà dei tuoi articoli sono determinate sulla base di qualche altro oggetto accessibile nel sistema. In effetti, l'uso particolare che stai descrivendo, in cui un certo codice di convalida del runtime accederà alle proprietà del prototipo di un particolare oggetto, è molto vicino a come JavaScript gestisce il suo modello di ereditarietà basato sul prototipo.

Se desideri differenziare questo modello per esprimere i requisiti variabili dei tuoi articoli dal modello di prototipo più generale, potresti fare riferimento a questo modello come uno schema guidato da prototipo

Probabilmente potresti anche chiamarlo uno schema , poiché il fatto che tu stia provando solo se una determinata proprietà è permessa o meno è un semplice dettaglio di implementazione piuttosto che una funzione utile del modello. (Se davvero volevi impedire a un pirana di avere le gambe, dovresti fare ciò che è stato suggerito da @ aaron-kurtzhals e creare una classe Pirana.)

    
risposta data 28.11.2013 - 00:06
fonte

Leggi altre domande sui tag