Utilizzo di modelli diversi per funzionalità simili

10

Sono l'unico sviluppatore di un progetto che, come per qualsiasi progetto software, potrebbe essere preso da qualcun altro in futuro.

Diciamo che ho usato lo schema X per implementare la funzione A. Dopo aver sviluppato e terminato la funzione, mi rendo conto che potrei implementare la stessa funzione usando il pattern Y, che ho appena imparato. Ma la funzionalità A funziona bene e il refactoring da X a Y richiede molto tempo e offre pochi vantaggi.

Quindi è il momento di implementare la funzione B. È simile ad A, ma questa volta voglio cogliere l'occasione per giocare con il pattern Y. Sono contento del risultato finale, meglio di quando faccio la funzione A, ma ora il codice utilizza due modelli diversi, X e Y, per caratteristiche simili.

Ma non c'è una vera ragione per usare modelli diversi, tranne per il fatto che quando costruivo la caratteristica A non ero abbastanza abile da usare lo stesso schema della caratteristica B.

Si noti che questa domanda non riguarda scegliere il modello giusto per un dato problema ; si tratta di due modelli coesistenti nel codice di base per risolvere problemi simili, che potrebbero essere ridotti a un dato tempo sufficiente per il refactoring.

  • Il codice è olfattivo?
  • Quali sono gli svantaggi di mantenere il codice sorgente come questo?
  • Dovrei limitarmi a utilizzare un solo pattern? cioè il refactor A per usare Y o continuare a usare X quando si scrive B?
  • In che modo, nella fonte, posso comunicare che la ragione per cui esistono due modelli diversi per funzionalità simili è essenzialmente senza motivo?
  • Mi preoccupo troppo di ciò che il prossimo sviluppatore pensa del mio codice?
posta ris8_allo_zen0 30.08.2016 - 14:37
fonte

5 risposte

7

Se il modello X e Y risolvono lo stesso problema e nessuno dei due è oggettivamente migliore, allora dovresti decidere su uno e attenersi ad esso. Se è possibile, dovresti sforzarti di risolvere lo stesso problema nello stesso modo in modo coerente.

Sei non preoccupato troppo, piuttosto è un odore di codice serio che dovresti assolutamente gestire e ripulire.

Gli svantaggi di avere soluzioni diverse allo stesso problema in un codice base:

  • ci vorrà il doppio del tempo per capire il codice
  • ci vorrà il doppio del tempo per modificare il codice quando si modifica un comportamento che coinvolge il modello
  • avrai il doppio di bug
  • i colleghi attuali e futuri ti odieranno
risposta data 30.08.2016 - 15:05
fonte
2

Sono d'accordo con la risposta di JacquesB. Vorrei aggiungere, rispondendo ad altre domande, che se in questo momento i due modelli coesistono e non hanno ancora il tempo (ancora) di rifattorizzare la tua applicazione per utilizzare quella che hai trovato la migliore, dovresti mettere che nei tuoi commenti nella classe "offendente" (quella da refactoring). In questo modo, è evidente al futuro sviluppatore (tu o qualcun altro) che c'è ancora del debito da pagare.

Infine, lo svantaggio principale di mantenere un codice base come questo è la complessità aggiunta, ma non necessaria. Sicuramente vuoi evitare la complessità non necessaria a tutti i costi!

    
risposta data 30.08.2016 - 15:37
fonte
1

Non giocare nella base di codice. Scrivi prototipi che puoi trovare i vantaggi e i disavaggi di un modello / disegno rispetto agli altri.

Potrebbe risultare che ciò che intuitivamente può essere ridotto può essere in realtà più complesso di due modelli diversi.

Aspettatevi di gettare una buona parte del codice sviluppato per il prototipo.

    
risposta data 30.08.2016 - 16:55
fonte
1

Indipendentemente dal fatto che si tratti di un codice, l'odore dipende in realtà solo da come sono simili i problemi A e B. La risposta di JacquesB sembra presumere che siano molto simili e che se cambi il problema A (per correggere un bug per esempio) dovrai anche cambiare il problema B allo stesso tempo. JaqueB potrebbe avere ragione, ma potrebbe anche accadere che A e B cambino in modo indipendente perché non sono poi così simili. In questa situazione è improbabile che vengano descritti gli aspetti negativi.

In base alla tua descrizione sembra un po 'di odore di codice (Duplicazione), ma è difficile dire quanto puzzolente sia l'odore. Ad esempio, se A utilizza Metodo Metodo e B usa Strategia, i due problemi potrebbero essere molto diversi, nonostante i pattern di mirroring utilizzati. Vorrei aspettare e vedere l'approccio. Nel caso in cui il problema C arrivi e sia come A e B, allora il refactor A deve essere coerente con B e quindi creare C dovrebbe essere molto semplice. Se c'è un bug in A vorrei anche rifattarlo per abbinare B, quindi correggere il bug. Nel caso in cui nulla cambi allora .... non importa, vero?

Avere più modi di risolvere problemi simili in un codebase è un dato di fatto. Anche nel caso in cui tu sia l'unico sviluppatore, imparerai cose nuove e avrai nuove intuizioni, quindi le tue soluzioni cambieranno. Come si riconosce correttamente è necessario correggere queste imperfezioni fornendo valore. La riprogettazione (che è ciò che stai facendo davvero quando cambi un pattern) il codice che non cambierà mai non fornisce alcun valore. L'unico vero modo per sapere che cambierà è in realtà dover fare il resto, ed è per questo che aspetterei un problema C.

    
risposta data 15.09.2016 - 14:28
fonte
1

No, puoi avere più pattern usati in una singola base di codice.

Tuttavia, se stai implementando un componente e stai esponendo un modo di usarlo che segue un pattern, probabilmente è meglio attenersi a quello. Supponiamo, ad esempio, che io stia usando il modello di builder per il mio client di query REST, ma poi implemento una delle risorse in modo diverso. Questo confonderà le persone.

    
risposta data 30.08.2016 - 15:04
fonte

Leggi altre domande sui tag