"Grafico" è un termine ambiguo, riferito a diversi tipi di oggetti matematici.
Ma qualunque sia il tipo di grafico che hai in mente, ognuno di questi oggetti è un'astrazione a sé stante, con determinate operazioni che sono essenziali per definire l'astrazione. Ad esempio, se pensi a un grafico nel senso di un grafico a linee , le operazioni tipiche potrebbero essere
-
aggiungi alcuni nuovi punti che vengono automaticamente inseriti in un modo per mantenere ordinati i punti in base alle loro coordinate X
-
estrai i punti nell'ordine delle coordinate X
-
forse cancella o sostituisci alcuni punti
-
forse operazioni per calcolare le linee intermedie tra due punti vicini.
Queste sono le public operazioni che dovrebbero far parte della classe Graph
stessa - un grafico che è solo un contenitore per un elenco di punti, come mostrato nell'esempio, senza un'API pubblica che forma l'astrazione, è piuttosto inutile. D'altra parte, ogni operazione che non fa parte di questa astrazione è meglio posizionata altrove.
Dove esattamente, dipende . Dipende dal modo in cui il grafico verrà utilizzato nel sistema, da quali altri punti del sistema sono disponibili o potrebbero essere disponibili e dalla singola operazione. A volte una classe da sola va bene. A volte una funzione statica è ok. A volte una funzione all'interno di un'altra classe è sufficiente, se quell'altra classe è il posto unico nel sistema in cui è necessaria l'operazione. E a volte va bene fare un'eccezione alla regola, rimanere pragmatici e posizionare la funzione direttamente nella classe Graph
, solo perché al momento non hai un posto migliore.
Nota che non esiste una regola ferrea che dice "questo o quel luogo è meglio", questo è in qualche modo supponente. Cerca di seguire il principio SOLID, cerca di creare astrazioni coerenti con responsabilità disgiunte e refactoring man mano che il programma si evolve. Spesso un'operazione molto semplice, abbastanza semplice da essere solo una funzione, inizia a diventare più complessa nel tempo, il che rende necessario rifattorizzare la logica della funzione in molte funzioni più piccole che verranno quindi ridotte a una classe autonoma.