Per i miei requisiti di progettazione, questa gerarchia di progettazione sembra ragionevole?

-1

Sfondo

Costruzione

Si noti che sto usando C # qui, ma potrebbe non essere necessario fornire input alle mie domande concettuali sul design. Considera la seguente metodologia di progettazione ...

Lavoro in un luogo in cui abbiamo diverse versioni di un determinato prodotto. Recentemente mi è stata data una specifica di progettazione per 3 delle versioni, in cui la specifica afferma che le 3 versioni sono identiche tranne che ognuna ha un nome diverso. Mentre mi è stata data una specifica solo per le 3 versioni, ci sono in realtà più di appena 3. Ho bisogno di iniziare a scrivere un oggetto di classe base secondo le specifiche di progettazione. Per il gusto di questa domanda, farò riferimento alla classe base di questo prodotto come ProductObject .

Inoltre, ogni ProductObject contiene 16 oggetti ai quali mi riferirò come EntryObject . Ognuno dei 16% diEntryObject (s) avrà bisogno di campi membri leggermente diversi, ma sono più o meno liberamente basati sulla stessa cosa.

Uso

La versione appropriata di ProductObject sarà costruita con una stringa di byte separati "a doppio spazio", a cui mi riferirò come SeparatedBytes . SeparatedBytes avrà sempre lo stesso formato, un'intestazione seguita dalla stringa di byte. Indipendentemente dal numero di versioni diverse di ProductObject , l'% in arrivo di co_de sarà sempre identico tranne che con carichi utili variabili. I payload sono solo letture del sensore e non hanno nulla a che fare con il modo in cui i dati appaiono in termini di formato (sembreranno sempre una stringa di byte separati da un doppio spazio). Ecco come appare SeparatedBytes :

01  EF  AB  02  ...  XX

Questa stringa di byte separati "double-space" verrà analizzata / divisa e passata al rispettivo SeparatedBytes . Ciascuno del 16% diEntryObjects (s) sarà costruito come una parola 32-bit del valore EntryObject . Quindi la costruzione di SeparatedBytes dovrebbe essere simile a:

EntryObject myEntryObject = new EntryObject("01EFAB02");

I primi 4 byte saranno il primo tipo di EntryObject , i secondi 4 byte saranno il secondo tipo di EntryObject , i terzi 4 byte saranno il terzo tipo di EntryObject , fino al sedicesimo tipo di EntryObject . Questo assomiglierà a qualcosa ...

EntryObjectType1 type1 = new EntryObjectType1("12345678");
EntryObjectType2 type2 = new EntryObjectType2(the next four bytes);
EntryObjectType3 type3 = new EntryObjectType3(the next four bytes);

.
.
.

EntryObjectType16 type16 = new EntryObjectType16(the final four bytes);

Gerarchia di progetto / ereditarietà proposta

Ho intenzione di affrontare il mio progetto nel modo seguente, con uno spazio dei nomi composto da quanto segue:

  1. Avere una classe base per EntryObject .
  2. Costruisci 3 classi figlio per ognuna delle versioni ProductObject .
  3. Avere una classe base per ProductObject .
  4. Hanno 16 classi figlio derivate dalla classe base EntryObject .
  5. Hanno 16 membri EntryObject pubblici all'interno della EntryObject base-class.

Domande / Concern

La mia preoccupazione è principalmente con # 5 qui. Mi interessa il n. 5 perché mi sono state fornite solo le prime 3 versioni di ProductObject con cui lavorare.

Che succede se in fondo alla strada arriva una nuova versione di ProductObject e il ProductObject (s) all'interno si comporta diversamente? Sarà essere in grado di accogliere correttamente un tale cambiamento, data la mia gerarchia di progettazione proposta?

    
posta Snoop 16.03.2016 - 13:05
fonte

2 risposte

0

L'applicazione di OO nella parte inferiore del design facilita le future modifiche ovunque

A meno che tu non abbia un'idea di come ProductObject possa cambiare la progettazione per tutti i cambiamenti è una sciocchezza. Nondimeno, OO ei suoi principi ci portano in ogni caso oltre la metà. Ma devi usare OO "fino in fondo" ma non lo hai fatto.

Definisci una classe SeparatedBytes

new EntryObject("01EFAB02"); non dovrebbe ricevere una stringa ma un oggetto SeparatedBytes , o una proprietà, o una chiamata al metodo, di ciò.

Una volta compilata la classe con le proprietà e le funzionalità appropriate, dai ai client un'API con cui lavorare, non una stringa stupida (un termine tecnico in questo caso). Ciò significa che tutta la gestione delle stringhe attualmente in corso nelle classi esistenti di livello superiore scompare. Così hai facilitato il cambiamento futuro attraverso l'intera gerarchia di classi.

Definisci classi "fino in fondo"

Le parti secondarie di SeparatedBytes probabilmente dovrebbero essere anche classi. Il fatto che 4 byte definiscano un tipo sta urlando per diventare un IMHO di classe. Se devi "interrompere" un pezzo di 4 byte e passarlo a un altro oggetto, è meglio avere alcune funzionalità con cui il client può lavorare.

... completamente!

Se c'è una "gestione speciale" fatta al livello byte + double-space allora forse c'è anche una classe qui. Tutto ciò che questa struttura può fare per se stesso e che può essere incapsulato, espresso in parole aziendali o semplificato per l'uso da parte dei clienti.

My concern is mainly with #5 here. I am concerned with #5 because I was only given the first 3 versions of ProductObject to work with.

Ora penso di poter rispondere a questa domanda.

Il type di questi 4 byte sarà incapsulato in qualche modo all'interno della struttura SeparatedBytes . Questa "definizione / dichiarazione di tipo" può essere contenuta nella classe EntityObject e ora possiamo avere qualcosa come un ProductObject.EntityObjectCollection di List<EntityObject> - oggetti generici / generici che espongono il loro "tipo" attraverso la struttura SeparatedBytes .

    
risposta data 17.03.2016 - 20:53
fonte
0

Se vuoi renderlo disponibile in futuro per consentire diverse configurazioni di EntryObject s, una opzione sarebbe quella di avere la classe ProductObject base con una raccolta generica EntryObject , come List<EntryObject> o un altro tipo a seconda di i tuoi requisiti, invece di esattamente il 16% di membri di% co_de.

    
risposta data 16.03.2016 - 15:26
fonte