Il principio aperto/chiuso sembra riguardare la prevenzione delle regressioni in un oggetto o metodo. Dato che il tuo codice è coperto da test perché stai praticando BDD, questo sembra un requisito ridondante. Inoltre, sembra introdurre ulteriore complessità richiedendo l'estensibilità a livello di API piuttosto che a livello di lingua.Ci sono dei vantaggi nel seguire il principio di apertura/chiusura quando si usa BDD?
risposta
Assolutamente ci sono vantaggi. In effetti, i due principali (BDD e Open/Closed) sono progettati per scopi diversi. BDD è progettato per guidare il processo di sviluppo, ed è qui che si percepiscono i suoi benefici (riduzione delle tempistiche, realizzazione di codice di qualità superiore, ecc.). Aperto/Chiuso è progettato per essere eseguito nel processo di sviluppo, ma aiuta nella manutenzione.
I vantaggi del BDD sono facili da comprendere. Tempi più brevi per lo sviluppo iniziale significano meno costi per il progetto nel suo insieme, giusto? Sbagliato. Basato su The 60/60 Rule, il 60% del costo del progetto è da mantenerlo (e il 60% di tale costo deriva da modifiche dei requisiti post-distribuzione). Quindi, mentre è vantaggioso risparmiare denaro durante la fase di sviluppo iniziale, i maggiori risparmi devono essere ottenuti durante la manutenzione.
Ed è qui che il principale Open/Closed pagherà. Seguendo questo principio, ci si risparmia un sacco di tempo nella manutenzione (dal momento che non è necessario rintracciare i Test unità rotti perché si modifica la funzionalità di un metodo).
E il principio Open/Closed non riguarda la prevenzione delle regressioni tanto quanto impedisce un'API in modifica che è quasi impossibile tenere il passo con. Se si nota, le buone API non cambiano mai. Possono essere estesi. Le parti potrebbero essere deprecate. Ma non vedi mai setFoo(string bar)
passare a setFoo(int bar)
. Ecco cosa Open/Closed è lì per prevenire ...
Capisco perché non vuoi che la tua API cambi. Dove non sono così sicuro è quando vuoi aggiungere all'api di una classe. Non sono sicuro di aver aperto/chiuso correttamente, ma sembra suggerire che non dovresti cambiare una classe per niente una volta chiusa. Se questo è il caso, sembra che sia in conflitto con altri principi come non ottimizzare la progettazione iniziale e emergente attraverso il refactoring. Forse mi sbaglio e si riferisce solo alla chiusura dei singoli metodi? – opsb
@opsb: Penso che tu abbia eseguito il grokking correttamente. Applicato alle classi, il principio aperto/chiuso dice "sai come puoi aggiungere nuovi metodi a una classe, ed è ancora completamente compatibile con tutti i codici esistenti? Beh, non farlo, ma crea una nuova classe con tutte le funzionalità della vecchia classe, e anche di più. Questa nuova classe può essere una sottoclasse della vecchia classe se aiuta ". Puoi anche provare ad anticipare la necessità di cambiare attraverso l'iniezione delle dipendenze, il modello di strategia e qualsiasi altro trucco che puoi immaginare per rendere le tue lezioni più flessibili senza doverle modificare. –
È la sottoclasse per aggiungere nuove funzionalità che mi mettono a disagio. Dato che la tua API non è cambiata e stai aggiungendo solo funzionalità, non riesco a vedere il vantaggio di frammentare ciò che dovrebbe essere una singola classe attraverso 2 classi, cioè dato che non hai assicurato nessuna regressione nella tua API esistente, quale giustificazione c'è per usare un disegno che in qualsiasi altro punto del processo sarebbe considerato inferiore. – opsb
- 1. Ci sono dei vantaggi nel mantenere MaxPermSize piccolo?
- 2. Ci sono degli svantaggi quando si usa ".on"?
- 3. Ci sono dei benefici quando si usa la finale in AS3?
- 4. Ci sono dei vantaggi nell'uso di Rank2Types in favore di RankNTypes?
- 5. Ci sono delle euristiche di padding CSS che posso seguire?
- 6. Come seguire il principio di Responsabilità Unica nel mio esecutore HttpClient?
- 7. Principio dei migliori principi
- 8. Quando si viola il SRP (Principio della singola responsabilità)?
- 9. Ci sono dei vantaggi nell'usare i parametri const con un tipo ordinale?
- 10. Perché ci sono file duplicati quando si estrae l'archivio tar.gz
- 11. Ci sono specialità all'interno dei campi incorporati
- 12. Query rinviare nulla quando ci sono dati nel database
- 13. Quali sono i vantaggi dei puntoni
- 14. Ci sono dei puntatori in javascript?
- 15. Quando ci sono vantaggi nell'usare la stored procedure su una query hard coded?
- 16. Ci sono dei buoni benchmark Clojure?
- 17. Reactjs: Ci sono vantaggi nell'utilizzo dei componenti React rispetto alle normali funzioni?
- 18. cfquery si blocca quando ci sono commenti TSQL
- 19. Come sono le prestazioni quando ci sono centinaia di Task.Delay
- 20. Come si usa '~' (tilde) nel contesto dei percorsi?
- 21. Utilizzo del comando exec di Java quando non si sa se ci sono spazi
- 22. I colori sono errati quando si usa RenderTarget2D in XNA
- 23. Quando si usa l'istruzione Using?
- 24. Quando si usa "apply" e quando "funcall"?
- 25. Java: il codice inlining avrà dei vantaggi?
- 26. Quali sono i vantaggi di Persistenza Ignoranza?
- 27. Metodo non chiamata quando si usa dei rendimenti
- 28. Quali sono le cose reali nel jmp_buf quando si usa setjmp e longjmp?
- 29. Quali sono i vantaggi dei file di risorse (.resx)?
- 30. Quali sono i vantaggi/vantaggi dell'utilizzo di Python 3?
Ci sono un sacco di tecniche agili che non si applicano alle API che hai pubblicato al di fuori della tua organizzazione, perché è semplicemente impossibile aggiornare tutto il codice che dipende sull'interfaccia che stai cambiando. open/closed è più adatto a quel genere di cose, penso, o in generale alle interfacce (se ce ne sono) che progetti per permanenza. –