2009-03-02 11 views
7

Si contraddicono?Disaccoppiamento vs YAGNI

Il disaccoppiamento è qualcosa di grande e difficile da raggiungere. Tuttavia, nella maggior parte delle applicazioni non ne abbiamo davvero bisogno, quindi posso progettare applicazioni altamente accoppiate e quasi non cambierà niente di diverso da ovvi effetti collaterali come "non puoi separare i componenti", "il test delle unità è doloroso culo "ecc.

Cosa ne pensi? Cerchi sempre di disaccoppiare e affrontare il sovraccarico?

risposta

7

Mi sembra che il disaccoppiamento e YAGNI siano virtù molto complementari. (Ho appena notato la risposta di Rob, e sembra che siamo sulla stessa pagina qui.) La domanda è quanto disaccoppiamento dovresti fare, e YAGNI è un buon principio per aiutare a determinare la risposta. (Per coloro che parlano di test unitari - se è necessario disaccoppiare per fare il test unitario, allora YAGNI ovviamente non si applica.)

Ho davvero sinceramente dubbi sulle persone che dicono di "sempre" disaccoppiare. Forse lo fanno sempre ogni volta che ci pensano. Ma non ho mai visto un programma in cui ulteriori strati di astrazione non possano essere aggiunti da qualche parte, e dubito sinceramente che ci sia un esempio non banale di un tale programma là fuori. Ognuno disegna una linea da qualche parte.

Dalla mia esperienza, ho scollegato il codice e quindi non ho mai sfruttato la flessibilità aggiuntiva su tutte le volte che ho lasciato codice accoppiato e quindi ho dovuto tornare indietro e modificarlo in seguito. Non sono sicuro se ciò significa che sono equilibrato o ugualmente rotto in entrambe le direzioni.

2

I (quasi) disaccoppia. Ogni volta che lo facevo lo trovavo utile, e (quasi) ogni volta che non lo facevo, dovevo farlo più tardi. Ho anche trovato un buon modo per ridurre il numero di bug.

0

Bene, YAGNI è poco più di una falsa frase semplicistica che la gente gira intorno. Il disaccoppiamento, tuttavia, è un concetto abbastanza ben compreso. YAGNI sembra implicare che si è una sorta di sensitivo. È solo la programmazione di cliché, che non è mai una buona idea. Per essere onesti, c'è da dimostrare che YAGNI non è probabilmente correlato al disaccoppiamento. L'accoppiamento è in genere "più veloce" e "chissà che tu abbia bisogno di una soluzione disaccoppiata, non cambierai comunque la componente X!"

+0

YAGNI implica che uno non è una sorta di sensitivo - vedi http://c2.com/cgi/wiki?YouArentGonnaNeedIt –

+0

So esattamente di cosa si tratta, ma stai solo giocando con esso. Ma tu mostri perché è essenzialmente una frase sciocca. Se vuoi discutere se YAGNI sia un disturbo psichico o solo una miopia, non lo farò perché è una discussione noiosa e infruttuosa. – BobbyShaftoe

2

Il disaccoppiamento a scopo di disaccoppiamento può essere negativo. Costruire componenti testabili è molto importante però.

La parte difficile della storia è sapere quando e quanto è necessario il disaccoppiamento.

+0

Perché dici che il disaccoppiamento per il gusto di farlo può essere cattivo? – tddmonkey

+1

Intendo il disaccoppiamento senza un vero vantaggio ma semplicemente per farlo, anche se richiede più tempo. – cherouvim

+0

Molto buono. E se usi lo sviluppo orientato ai test (dovresti!), Il disaccoppiamento è immediatamente necessario. – Offirmo

0

Come dice il tag, è molto soggettivo. Si basa interamente sulla tua saggezza ingegneristica per decidere di cosa "non avremo bisogno". Potrebbe essere necessario l'accoppiamento in un caso, ma non in un altro. Chi lo deve dire? , naturalmente.

Per una decisione così soggettiva, quindi, non ci può essere una linea guida da prescrivere.

+0

Grazie per la risposta, non sto cercando una linea guida, come ho detto, sono curioso di sapere cosa fanno gli altri. Qual è la tua idea sull'argomento e quando/in quali casi sei caduto e non ne hai voglia. Scusa se non era chiaro sulla domanda. –

2

Direi che non lo fanno. Il disaccoppiamento consiste nel ridurre le dipendenze non necessarie all'interno del codice e nel restringere gli accessi attraverso interfacce pulite e ben definite. "Non ne avrete bisogno" è un principio utile che generalmente sconsiglia l'eccessiva estensibilità e l'eccessiva ampiezza dell'architettura di una soluzione in cui non esiste un caso d'uso ovvio e attuale.

Il risultato pratico di questi è che si dispone di un sistema in cui è molto più facile di refactoring e mantenere i singoli componenti senza provocare inavvertitamente un effetto a catena in tutta l'intera applicazione, e dove non ci sono aspetti inutilmente complicati al design - è come semplice come è richiesto per soddisfare i requisiti attuali.

0

YAGNI il pasticcio :) ... davvero, non abbiamo bisogno di avere tutto il codice mixato per andare "più veloce".

I test di unità aiutano davvero a sentire quando è accoppiato (dato che si capisce bene che cos'è un test unitario rispetto ad altri tipi di test). Se invece lo fai con la mentalità "non puoi separare i componenti", puoi facilmente aggiungere cose che non ti serviranno :)

Direi che YAGNI entra quando inizi a torcere e cambiare la logica tutto oltre gli scenari di utilizzo effettivi richiesti dall'attuale implementazione. Diciamo che hai un codice che utilizza un paio di fornitori di pagamenti esterni che lavorano entrambi con reindirizzamenti su un sito esterno. Va bene avere un design che mantenga tutto pulito, ma non penso che sia giusto iniziare a pensare ai provider che non sappiamo se saranno mai supportati che hanno un sacco di modi diversi di gestire l'integrazione e il relativo flusso di lavoro.

1

Se "unit test è una rottura di palle", allora direi che si fai bisogno. La maggior parte delle volte il disaccoppiamento può essere raggiunto anche virtualmente a costo zero, quindi perché non vuoi farlo?

Inoltre, uno dei miei più grandi spauracchi quando si lavora su una nuova base di codice si trova a dover disaccoppiare il codice prima di poter iniziare a scrivere unit test quando l'introduzione di un'interfaccia da qualche parte o l'uso di iniezione di dipendenza potrebbe risparmiare un sacco di tempo

+0

Come conseguire il disaccoppiamento con un costo praticamente pari a zero? Questo è quasi impossibile nella mia mente. Sono curioso di questo, perché penso che la maggior parte della gente sia d'accordo sul fatto che il disaccoppiamento è piuttosto difficile da raggiungere. Soprattutto quando anche le cose più semplici come leggere una configurazione richiede dep. iniezione –

+0

L'iniezione delle dipendenze deve essere eseguita di norma (e lo sarà se si esegue il test dell'unità) correttamente. Non è necessario un contenitore DI per raggiungere questo obiettivo, ma vedrai che stai scrivendo un codice di codice per raggiungerlo. Guice ti dà DI con pochissima configurazione e può essere retrofittato abbastanza facilmente – tddmonkey

4

YAGNI è una regola empirica (non una religione). Il disaccoppiamento è più o meno una tecnica (anche non una religione). Quindi non sono realmente imparentati, né si contraddicono a vicenda.

YAGNI parla di pragmatismo. Supponi di non aver bisogno di qualcosa, finché non lo fai.

In genere, supponendo che YAGNI determini il disaccoppiamento. Se non applichi affatto quel coltello, finirai per presupporre che devi avere classi che conoscono tutto il comportamento dell'altro prima di aver dimostrato che ciò è vero.

"Decouple" (o "coppia vagamente") è un verbo, quindi richiede lavoro. YAGNI è una presunzione, per la quale ti aggiusti quando trovi che non è più vero.