I pattern dovrebbero essere usati solo dove possono essere la migliore soluzione o aiuto nella creazione di una buona soluzione (sei d'accordo?).
Vedo i modelli di progettazione rigorosamente come dettagli di implementazione. Se documentate le vostre API pubbliche e programmate tale documentazione, in generale non importa (o vi influenzerà molto) dove avete modelli di progettazione. Cioè, non vai "Ho un modello di ponte qui e implementerò un visitatore sopra di esso". Invece, è "questa classe avrà implementazioni diverse su vari sistemi operativi, quindi sarà implementata usando un modello a ponte". Quindi, quando lo usi, sei indifferente al fatto che sia implementato come un bridge, perché guardi l'API pubblica, non un modello di bridge.
quanti sforzi si dovrebbero effettivamente investire nella creazione di progetti flessibili e debolmente accoppiati?
L'accoppiamento allentato può essere ottenuto seguendo una semplice serie di regole. Se li rispetti, il tuo codice sarà (più) liberamente accoppiato, mentre lo scrivi (ovvero ogni sforzo è già parte del processo di sviluppo).
Tra le regole (non un elenco esaustivo):
- definisci le tue interfacce pensando (o scrivendo) al codice client (come verrà usata la classe), non a ciò che farà la classe (cioè progettando l'interfaccia, non l'implementazione)
- "dì, non chiedere"
- costruire oggetti da parti già create
- passa al costruttore gli oggetti reali che utilizzerai (non le fabbriche per i membri, i parametri per le fabbriche dei parametri o qualcosa del genere).
- ASCIUTTO (se hai due linee che appaiono nello stesso ordine in due punti, estraile in una funzione separata e così via).
- Se la creazione di un oggetto è un'operazione più complessa, implementare la creazione delle parti intermedie come metodo / classe di fabbrica (cioè non nel corpo del costruttore).
- YAGNI (crea le cose di cui hai bisogno, non prima).
Queste regole vengono seguite in modo diverso, a seconda della lingua, della metodologia di sviluppo seguita dal team (ad esempio TDD), dei limiti di budget di tempo e così via.
Ad esempio, in Java, è buona norma definire l'interfaccia come un interface
e scrivere codice client su quello (quindi, istanziare l'interfaccia con una classe di implementazione).
D'altra parte, in C ++ non hai interfacce, quindi puoi solo scrivere l'interfaccia come una classe base astratta; Dato che in C ++ usi l'ereditarietà solo quando hai un forte requisito (e come tale evita il sovraccarico di funzioni virtuali non necessarie), probabilmente non definirai l'interfaccia separatamente, solo l'intestazione della classe).
Coloro che si oppongono ai modelli di progettazione affermano che i costi per l'utilizzo di questi modelli spesso superano i vantaggi.
Penso che stiano sbagliando. Se si scrive codice debolmente accoppiato (e DRY), l'integrazione dei modelli di progettazione in esso viene fornita con il minimo sforzo aggiuntivo. Altrimenti, dovrai adattare il tuo codice per implementare un modello di progettazione.
Se devi implementare molte modifiche per implementare un modello di progettazione, il tuo problema non è il modello di progettazione: è la tua base di codice che è monolitica e strettamente accoppiata. Questo è un problema di progettazione non ottimale / non ottimale, non un problema di modelli di progettazione.
Quello che mi piacerebbe sapere è quanto sforzo dovrei effettivamente fare per creare livelli aggiuntivi di astrazione e progetti, solo per consentire alla mia applicazione di seguire i principi OO come accoppiamento libero, programmazione di un'interfaccia, ecc. Vale davvero la pena vero? Quanto sforzo dovrei fare in questo?
Le tue domande danno per scontato (non dichiarato) che l'unico vantaggio dell'accoppiamento libero sia la capacità di implementare facilmente i modelli di progettazione. Non è.
Tra i vantaggi dell'accoppiamento libero ci sono:
- refactoring e riprogettazione della flessibilità
- sforzo meno sprecato
- testabilità
- maggiore possibilità di riutilizzo del codice
- semplicità progettuale
- meno tempo trascorso nel debugger
... e pochi altri che non mi vengono in mente in questo momento.