Violazione del principio SECCO

10

Sono sicuro che ci sia un nome per questo anti-pattern da qualche parte; tuttavia non conosco abbastanza bene la letteratura anti-pattern per saperlo.

Considera il seguente scenario:

or0 è una funzione membro in una classe. Nel bene o nel male, è strongmente dipendente dalle variabili dei membri della classe. Il programmatore A arriva e ha bisogno di funzionalità come or0 ma piuttosto che chiamare or0 , il programmatore A copia e rinomina l'intera classe. Suppongo che lei non chiami or0 perché, come ho detto, dipende strongmente dalle variabili membro per la sua funzionalità. O forse è una programmatrice junior e non sa come chiamarla da un altro codice. Quindi ora abbiamo or0 e c0 (c per copia). Non posso assolutamente criticare il programmatore A per questo approccio: tutti noi abbiamo tempi di consegna molto stretti e abbiamo il codice per fare il lavoro.

Diversi programmatori mantengono or0 quindi ora è la versione orN . c0 è ora la versione cN . Sfortunatamente la maggior parte dei programmatori che hanno mantenuto la classe contenente or0 sembravano completamente inconsapevoli di c0 - il che è uno degli argomenti più forti a cui posso pensare per la saggezza del principio DRY. E potrebbe anche esserci stato un mantenimento indipendente del codice in c . In entrambi i casi, sembra che or0 e c0 siano stati mantenuti indipendenti l'uno dall'altro. E, gioia e felicità, si verifica un errore in cN che non si verifica in orN .

Quindi ho alcune domande:

1.) Esiste un nome per questo anti-pattern? Ho visto accadere così spesso che troverei difficile credere che non si tratti di un anti-modello con un nome.

2.) Posso vedere alcune alternative:

a.) Correggere orN per prendere un parametro che specifica i valori di tutte le variabili membro di cui ha bisogno. Quindi modifica cN per chiamare orN con tutti i parametri necessari passati.

b.) Prova a trasferire manualmente le correzioni da orN a cN . (Intendiamoci, non voglio farlo ma è una possibilità realistica).

c.) Recopy orN a cN - di nuovo, schifo ma lo elenco per completezza.

d.) Cerca di capire dove cN è rotto e poi ripararlo indipendentemente da orN .

L'alternativa a sembra la soluzione migliore a lungo termine, ma dubito che il cliente mi consenta di implementarla. Mai tempo o denaro per sistemare le cose, ma sempre tempo e denaro per riparare lo stesso problema 40 o 50 volte, giusto?

Qualcuno può suggerire altri approcci che forse non ho considerato?

Se tu fossi al mio posto, quale approccio prenderesti? Se ci sono altre domande e risposte qui su queste linee, si prega di inviare link a loro. Non mi dispiace rimuovere questa domanda se si tratta di un dupe ma la mia ricerca non ha ancora trovato nulla che indirizzi ancora questa domanda.

EDIT: ringrazia tutti per tutte le risposte ponderate.

Ho chiesto un nome per l'anti-pattern in modo da poterlo cercare ulteriormente da solo. Sono sorpreso che questa particolare cattiva pratica di codifica non abbia un nome "canonico" per questo.

    
posta Onorio Catenacci 12.09.2011 - 15:31
fonte

5 risposte

16
  1. è appena chiamato codice duplicato - Non so di altri nomi di fantasia per questo. Le conseguenze a lungo termine sono come hai descritto, e peggio.

  2. Ovviamente, l'eliminazione della duplicazione è l'opzione ideale, se possibile. Potrebbe essere necessario molto tempo (in un caso recente nel nostro progetto precedente, ho avuto diversi metodi duplicati in più di 20 sottoclassi in una gerarchia di classi, molti dei quali avevano evoluto le proprie lievi differenze / estensioni nel corso degli anni. io a circa 1,5 anni attraverso la scrittura di unità e il refactoring successivi per eliminare tutte le duplicazioni, ma la perseveranza è valsa la pena).

    In tal caso, potresti comunque aver bisogno di una o più delle altre opzioni come correzioni temporanee, anche se decidi di iniziare ad eliminare la duplicazione. Tuttavia, quale di questi è meglio dipende da molti fattori, e senza più contesto stiamo solo supponendo.

    Un sacco di piccoli miglioramenti possono fare una grande differenza nel lungo periodo. Non hai necessariamente bisogno dell'approvazione esplicita del cliente per questi - un piccolo refactoring ogni volta che tocchi la suddetta classe per correggere un bug o implementare una funzionalità può fare molto nel tempo. Basta includere un po 'di tempo extra per il refactoring nelle stime delle attività. È proprio come la manutenzione standard per mantenere il software sano a lungo termine.

risposta data 12.09.2011 - 15:42
fonte
9

C'è un riferimento al modello WET (We Enjoy Typing) ma non so se è un nome standard.

...Software licensing is a notable exception to the DRY (Don't Repeat Yourself) practice - software licensing code should be as WET (We Enjoy Typing - the opposite of DRY) as possible.

If you isolate your licensing logic in one place, separated from other concerns, you make it far easier to modify your software to disable the licensing altogether. It is much better to repeat the licensing logic many times throughout the application, preferably such that it is executed numerous times throughout a single execution of the software.

For example, we suggest that you perform a licensing check during installation, during application startup, and whenever important features are accessed. Don't check the licence once during startup & pass that value around; instead, actually replicate the licensing check in each area. It's inconvenient, but far better than releasing a product that's easy to crack...

    
risposta data 12.09.2011 - 15:56
fonte
3

Se ti capisco bene, c'è troppa attività in corso nella classe. Ciò crea metodi che non seguono il principio di responsabilità singola . Conducono al codice che deve essere spostato, pezzi presi mentre altri lasciati fuori. Questo potrebbe anche creare molti membri.

Dovresti anche esaminare i modificatori di accessibilità. Garantire che quelle cose che sono pubbliche dovrebbero in effetti essere pubbliche. Il consumatore non ha bisogno di sapere su ogni piccolo membro ... usa l'incapsulamento.

Questo richiede un refactoring. Sembra anche che il codice sia stato scritto senza un design iniziale. Guarda nello sviluppo di Test Driven. Scrivi il codice come dovrebbe essere chiamato piuttosto che chiamare il codice, tuttavia è implementato. Esamina TDD per alcuni suggerimenti su come eseguire l'attività.

    
risposta data 12.09.2011 - 15:48
fonte
3

Se stai copiando il codice, introduci un debito tecnico di doppia manutenzione o più specificamente: duplicazione del codice .

Di solito questo è risolto tramite il refactoring. Più specificamente, reindirizza tutte le chiamate a una nuova funzione (o un nuovo metodo in una nuova classe) che ha il codice comune. Il modo più semplice per iniziare è rimuovere tutto il codice copiato e vedere quali interruzioni, in cui risolvi reindirizzando le chiamate al codice comune.

Ottenere il tuo cliente ad accettare il codice refactoring può essere difficile dal momento che è difficile convincere una persona non tecnica a fissare un debito tecnico. Quindi la prossima volta che dai le stime del tempo, solo include il tempo necessario per il refactoring delle tue stime . La maggior parte delle volte i clienti presumono che tu stia facendo pulizia del codice durante il tempo in cui esegui la correzione.

    
risposta data 12.09.2011 - 15:51
fonte
1

Mi sembra codice spaghetti . La soluzione migliore è un refactoring / riscrittura.

a pejorative term for source code that has a complex and tangled control structure, especially one using many GOTOs, exceptions, threads, or other "unstructured" branching constructs. It is named such because program flow is conceptually like a bowl of spaghetti, i.e. twisted and tangled...

http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Spaghetti.jpg/175px-Spaghetti.jpg

    
risposta data 12.09.2011 - 15:40
fonte

Leggi altre domande sui tag