Ci sono sicuramente molti modi per progettare un sistema software. Alcuni disegni sono migliori di altri e alcuni potrebbero essere ugualmente buoni. Inoltre, i sistemi software crescono e si evolvono, il che significa che un design che è buono oggi potrebbe non essere così bello domani, quando sarà necessario aggiungere una nuova funzione.
Tuttavia ci sono principi e pratiche collaudati che ti aiutano a capire come decomporre il tuo problema in classi, oggetti, algoritmi, schemi, ecc. Ricorda, scrivere software è un processo iterativo, proprio come scrivere un libro. Non hai mai capito bene al primo tentativo. Invece, inizi con una brutta copia e continui a raffinarlo. I due concetti principali sono coesione e accoppiamento . Volete che i vostri moduli abbiano un'elevata coesione, esemplificata dal principio di responsabilità singola , e basso accoppiamento. Vuoi anche che il tuo design abbia senso per gli altri, in modo che possa essere facilmente compreso, implementato o aumentato.
Un buon approccio è disegnare un diagramma di alto livello del tuo sistema, e. g. usando UML. Se sembra un disastro, o se alcune parti di esso non hanno senso, probabilmente vorrai refactoring. Potrebbe anche aiutare a spiegare il tuo sistema a qualcun altro. In primo luogo, probabilmente vedrai i difetti del design da solo mentre parli. Secondo, se altre persone trovano difficile seguire il tuo design, dovresti probabilmente correggerlo. Un altro modo è quello di spiegare il tuo progetto per iscritto. Quindi leggilo. ha senso per te? Quindi dagli ad altri per leggere. Ha senso per loro?
La progettazione del software diventa più semplice con l'esperienza. Sviluppa un senso per gli odori di codice , che ti indicano potenziali difetti di progettazione. Tuttavia, anche se hai scritto codice per decenni, è comunque una buona idea spiegare i tuoi disegni ad altre persone e vedere se possono seguire il tuo codice.
Per essere più concreti, consiglio vivamente i seguenti due libri: Pulisci codice di Robert C. Martin, e Refactoring di Martin Fowler.