Ho studiato i principi del design e dei principi di oop, sento ancora che manchi qualcosa nella maggior parte delle teorie sul design. Forse il fatto è che non esiste una "teoria" come nella progettazione del database.
Lasciatemi spiegare un esempio.
Supponiamo che io voglia modellare diversi modi per produrre il succo d'arancia .
Diciamo che comincio con una classe Oranges
, che modella un sacco di arance che saranno di una certa varietà, di una certa maturità, potrebbero essere state froozen ecc., E queste saranno le mie proprietà della classe Arance.
Quindi continuo fornendo a Orange un metodo di compressione.
Questo sembra essere corretto, perché unisce il metodo con i dati a cui si applica, che è la condizione preliminare per ottenere l'incapsulamento e altri principi di oop di valore.
Ma presto viene fuori che non è stata una buona scelta perché non c'è solo un modo per spremere un'arancia. Sarebbe preferibile avere una classe Juicer
le cui istanze contengano dettagli del metodo di spremitura: a mano, con uno spremiagrumi elettrico, compresa la polpa, per non parlare della miscelazione di diverse varietà di arance. Dove quest'ultimo apre una nuova gamma di possibilità che non erano disponibili (o non ottenibili con facilità) se ciascuna istanza di Arance sarebbe stata elaborata usando il suo metodo di compressione.
Diciamo che abbiamo eseguito un "refactoring" della nostra architettura di oo e ci spostiamo su un altro esempio simile che ci porterà al punto.
È ormai prassi comune utilizzare un ORM per salvare istanze di classi nel database e recuperarle in seguito.
In che cosa è simile all'esempio di classe Arance? Bene, qui ho una classe le cui istanze possono essere persistite in un database, cioè 'consentire un particolare processo'. Ma la classe stessa non contiene la logica per farlo , che in realtà è nelle classi ORM. Quindi sembra che lo stesso processo di "esternalizzazione" dell'esempio di Arance sia avvenuto anche in questo caso.
Ed ecco la domanda
Dato che è desiderabile ridurre al minimo il numero di tentativi-e-refattori, quali sono le domande che un programmatore dovrebbe porre per determinare precocemente se un metodo debba essere esternalizzato ad un'altra classe? Tutti i metodi di una classe sono esternalizzabili o esiste un insieme di metodi principali che sono intrinsecamente della classe stessa e quindi non esternalizzabili?
Idee
Come ho detto all'inizio, non sono completamente all'oscuro, mi sembra più che manchi una teoria "completa".
È facile mettere alcuni esempi:
se ho una classe le cui istanze rappresentano fatture, avrò un metodo 'calculateTotalAmount'. Questo è chiaramente un metodo intrinseco e core di quella classe, in quanto opzionato dai metodi per salvare quella fattura nel database che sarà 'esterna' della classe stessa.
Ma questa non è una "risposta finale", ma un punto di partenza che serve a dimostrare che "non tutti i metodi sono uguali", ma i metodi possono essere suddivisi in categorie. Quante (utili) categorie possiamo fare e ci sono metodologie che mettono queste domande?