Quando mi è stato insegnato per la prima volta i principi orientati agli oggetti, mi è stato insegnato che quando si utilizzano oggetti in una relazione "hasA" (o situazioni simili in cui un oggetto helper incapsula uno scopo più piccolo discreto in un sistema più grande), la classe posseduta non dovrebbe avere consapevolezza del suo ambiente più grande, quindi, ad esempio:
- Il mazzo di classe ha una carta [], ogni carta non ha accesso diretto al mazzo
- Class GameBoard ha GamePiece, ogni GamePiece non ha accesso verso la scacchiera
Questo ha tenuto bene e vero per un po ', ma alla fine ho avuto un problema in cui sono strongmente tentato di uscire da questo.
In un'applicazione in cui sono definiti i "comandi" definiti dall'utente che vengono analizzati dall'input ed eseguiti, ha un senso relativo definire Comando di classe e Condizionale di classe, ognuno dei quali ha sottoclassi per ciascuno dei molti possibili tipi di comando che l'utente può definire .
Contesto aggiunto Questa è un'utilità di gioco di ruolo, quindi ogni comando si riferisce a un'operazione eseguita sull'oggetto "Carattere" o a un problema con le regole dei generatori. Quindi AddStat (WIL, 5) incrementa di conseguenza quel valore. I comandi non dovrebbero avere bisogno di accedere al generatore più grande per eseguire se stessi, ma dovranno almeno accedere all'oggetto modificato dal comando rappresentato. Quindi per la maggior parte degli scopi, il personaggio è l'"ambiente" su cui il comando agisce.
Ha senso, sembra a prima vista aiutare le cose. Ma c'è un collegamento mancante quando molte di queste classi possono solo eseguire validazioni di input di base senza un contesto più ampio, per non parlare del fatto che senza più oggetti "consapevoli", ogni parte del codice che le riguarda dovrà fare quella principale ifelseif branch per capire quale comando ha a che fare con ...
La cosa del design non sono sicuro di dove andare qui è la seguente (questo non è ancora codificato a causa della quantità di modifiche che ci vorrebbe per adattare una di queste soluzioni divergenti)
- Il comando rimane "stupido" senza consapevolezza di carattere / ambiente. È consentito un metodo di risoluzione (Character obj), che consente di trasmettere una consapevolezza sufficiente a restituire un vero / falso significativo. Ciò significa che Command rimane un validatore di sintassi di base relativamente semplice, mentre il codice di corpo in altri casi fa il lavoro pesante per eseguire
- Come prima, eccetto Command ottiene anche il proprio metodo di risoluzione (Character obj), e ogni sottoclasse contiene il codice necessario per eseguire il comando
- Come prima, tranne che creiamo completamente oggetti Command con un riferimento al Carattere
Non sono sicuro di dove andare su questo ... Mentre tecnicamente c'è già un po 'di organizzazione del codice ottenuta con l'opzione più semplice, si ritiene che la leggibilità dell'applicazione trarrebbe beneficio dall'opzione 2 / Opzione 3, anche se il il purismo dell'incapsulamento soffre.
Quale percorso è il modo per andare qui? O sono completamente fuori dal marchio?