"Clean Architecture" di Bob Martin è una regola empirica per tutte le architetture o è solo una delle opzioni?


22

Mi sono piaciuti molto i concetti del video The Principles of Clean Architecture di Uncle Bob Martin . Ma sento che questo modello è come una combinazione di modelli astratti di Factory e Builder nel suo nucleo.

Questo è un modo per scrivere buoni programmi ma non l'unico.

Rotaie e reattori sono 2 framework che vengono in mente e che non promuovono questo tipo di architettura pulita. Rails si aspetta che la tua logica aziendale sia nei modelli ( FatModels e SkinnyController ) e reagisca all'interno dei tuoi componenti. Entrambi gli approcci associano strettamente la logica aziendale e il codice quadro .

Non trovo nulla di sbagliato in nessuno dei 3 modi. È una chiamata di giudizio a sceglierne uno.

Ma nel video ritengo che suggerisca che un'architettura pulita dovrebbe avere un chiaro confine tra logica aziendale e framework. I frame (web, android, ecc.) Dovrebbero essere plug-in che si collegano alla logica aziendale. Nel video prende in giro anche le rotaie.

Quindi, "Clean Architecture" di Bob Martin è una regola empirica per tutte le architetture o è solo una delle opzioni?


16
"Clean Architecture" è qualcosa che ha inventato Bob Martin. Questo è tutto.
Robert Harvey,

2
Forse una domanda migliore è questa :. Rails e React hanno un enorme successo. Cosa ha scritto Bob Martin, usando la sua architettura pulita, per confrontare? Mi piacerebbe conoscere la risposta da solo.
user949300

4
Leggi il post sul blog di Joel su cinque mondi e sai perché non esiste una "regola empirica per tutte le architetture".
Doc Brown,

1
Le rotaie possono avere molto successo per startup e prototipi. Quando arriva il momento di mantenere e sviluppare ulteriormente con altri 50 sviluppatori, la "libertà" di Rails diventa un problema con cui gli sviluppatori senior devono lottare.
Fabio,

Risposte:


34

Mentre l '"architettura pulita" va bene e presenta molti vantaggi, è importante ricordare che:

  • L'architettura pulita è in gran parte il re-branding e l'evoluzione di Robert C. Martin di approcci correlati come l'architettura delle cipolle di Jeffrey Palermo (2008) e l'architettura esagonale ("Ports and Adapters") di Alistair Cockburn e altri (<2008).

  • Problemi diversi hanno requisiti diversi. L'architettura pulita e gli approcci correlati trasformano il disaccoppiamento, la flessibilità e l'inversione della dipendenza fino a undici, ma sacrificano la semplicità. Questo non è sempre un buon affare.

Il precursore di queste architetture è il classico modello MVC di Smalltalk. Ciò districa il modello dall'interfaccia utente (controller e vista), in modo che il modello non dipenda dall'interfaccia utente. Esistono molte varianti di MVC come MVP, MVVM,….

I sistemi più complessi non hanno solo un'interfaccia utente, ma probabilmente più interfacce utente. Molte app scelgono di offrire un'API REST che può essere utilizzata da qualsiasi interfaccia utente, come un'app Web o un'app mobile. Ciò isola la logica aziendale sul server da queste interfacce utente, quindi al server non importa quale tipo di app vi acceda.

In genere, il server dipende ancora da servizi di back-end come database o provider di terze parti. Questo è perfettamente bene e porta a una semplice architettura a strati.

L'architettura esagonale va oltre e smette di fare una distinzione tra frontend e backend. Qualsiasi sistema esterno potrebbe essere un input (origine dati) o un output. Il nostro sistema principale definisce le interfacce (porte) necessarie e creiamo adattatori per qualsiasi sistema esterno.

Un approccio classico per un forte disaccoppiamento è un'architettura orientata ai servizi (SOA), in cui tutti i servizi pubblicano e consumano eventi da un bus di messaggi condiviso. Un approccio simile è stato successivamente reso popolare dai microservizi.

Tutti questi approcci presentano vantaggi , come la semplificazione del test del sistema in isolamento (sostituendo tutti i sistemi esterni con cui si interfaccia con implementazioni simulate). Semplificano la fornitura di più implementazioni per un tipo di servizio (ad esempio l'aggiunta di un secondo processore di pagamento) o lo scambio dell'implementazione di un servizio (ad esempio il passaggio da un database Oracle a PostgreSQL o la riscrittura di un servizio Python in Go) .

Ma queste architetture sono la Ferrari delle architetture: costose e la maggior parte delle persone non ne ha bisogno. La maggiore flessibilità di Clean Architecture ecc. Viene a scapito di una maggiore complessità. Molte applicazioni e in particolare le webapp CRUD non ne traggono beneficio. Ha senso isolare le cose che potrebbero cambiare, ad esempio utilizzando i modelli per generare HTML. È meno sensato isolare elementi che è improbabile che cambino, ad esempio il database di backup. Ciò che probabilmente cambierà dipende dal contesto e dalle esigenze aziendali.

I framework fanno ipotesi su cosa cambierà. Ad esempio React tende ad assumere che il design e il comportamento di un componente cambino insieme, quindi non ha senso separarli. Pochi quadri presumono che potresti voler cambiare il quadro. Pertanto, i framework presentano una quantità di lock-in. Ad esempio, la dipendenza di Rail dal modello (molto supposto!) Del Record attivo rende difficile cambiare la strategia di accesso ai dati al modello (spesso superiore) del repository. Se le tue aspettative di cambiamento non corrispondono al framework, utilizzare un framework diverso potrebbe essere migliore. Molti altri framework Web non fanno ipotesi sull'accesso ai dati.


20
Nota a margine: Robert C Martin ha questa sfortunata tendenza a presentare qualcosa come la migliore cosa di sempre e suggerire che questo è l'unico approccio sensato. Di solito non ha completamente torto. Ma spesso omette la discussione di potenziali inconvenienti ed è incline all'iperbole. Di conseguenza, il suo consiglio tende a essere fuorviante. È quindi meglio ignorare completamente tutto ciò che dice.
amon,

2
Adoro ascoltare una frase del genere, perché così spesso trovo persone che cercano ciecamente di seguire ogni piccola cosa che dice. Almeno se dovessi adottare l'approccio "questo è un modo, che spesso funziona, ma tieni sempre d'occhio", potrei sentirmi meglio con lui, ma non posso davvero dire che sono un fan di Robert Martin
jleach

6
È divertente, perché lo ricordo sottolineando che la sua soluzione non era l'unica nel libro. Quindi, ha parlato della sua soluzione in modo più approfondito. Personalmente, non mi importa di alcuni dei suoi post, ma Clean Architecture è stata un'ottima lettura.
bitsoflogic,

2
@bitsoflogic Buono a sapersi! TBH Non ho letto i suoi libri e la mia opinione si basa sui suoi discorsi, articoli e sulle domande delle persone che leggono le sue cose. Finora, ho visto altri esempi in cui gli manca una sfumatura evidente. Questo è un vero problema considerando che Clean Code è commercializzato molto per gli sviluppatori junior che non possono ancora mettere le proprie opinioni nel contesto. Il suo discorso sull'architettura pulita (questa domanda si basa su una registrazione) non sembra discutere delle limitazioni. Per il pubblico previsto va bene, per chiunque lo consideri un '"autorità" presenta un punto di vista fuorviante.
amon,

1
@amon Mi piacerebbe davvero vedere qualcuno parlare in modo più approfondito del tempo e del luogo per molti dei modelli e delle architetture. Di solito sono tenuti ad affrontare un certo problema, sia esso dovuto al linguaggio di programmazione o alle esigenze aziendali, ma le discussioni si concentrano sempre sul "come implementare". Per quanto riguarda il libro, la sua conoscenza della storia del codice (dopo averlo vissuto) è stata in grado di dare una prospettiva unica alle cose. Detto questo, penso che troverai principalmente lo stesso problema nel libro che hai visto nei colloqui.
bitsoflogic,

24

Mi sono piaciuti molto i concetti del video The Principles of Clean Architecture di Uncle Bob Martin. Ma sento che questo modello è come una combinazione di modelli astratti di Factory e Builder nel suo nucleo.

Neanche vicino.

Quando guardi questo:

inserisci qui la descrizione dell'immagine

Stai guardando il design di un grafico a oggetti. Questo impone ciò che sa di cosa. Ciò che manca in questa storia è come è stato costruito quel grafico a oggetti. Mi dispiace ma non lo troverai qui. Non vi è alcuna menzione di costruzione.

Puoi costruire tutto questo senza fabbriche e costruttori astratti. Lo so perché l' ho fatto . Non ho nemmeno deciso di evitarli. Li amo. Non mi è mai capitato di averne bisogno. Ho appena usato il passaggio di riferimento. Iniezione di dipendenza è il termine elegante per questo.

In effetti, potrei costruire tutto ciò che vedi in quel diagramma in principale. Quindi basta chiamare un metodo su un oggetto per avviare il tutto ticchettio.

Ora le cose devono esistere prima che tu possa spingerle in altre cose. L'ho esplorato qui e gli ho dato questo piccolo diagramma carino:

inserisci qui la descrizione dell'immagine

E puoi costruire tutto ciò senza nemmeno andartene main().

Consiglierei di usare costruttori e fabbriche quando si desidera scomporre un mucchio di codice di costruzione procedurale in bei pezzi concettuali di dimensioni ridotte. Ma non c'è nulla nell'architettura pulita o in nessuna delle altre architetture di parole d'ordine che ti richiedano. Quindi se vuoi restare con te main(), bene. Per favore, abbi pietà .

"Clean Architecture" di Bob Martin è una regola empirica per tutte le architetture o è solo una delle opzioni?

Considero Clean Architecture come una parola d'ordine usata per guidare le persone verso un blog e un libro. Quel blog e quel libro hanno ottime spiegazioni di architetture più vecchie molto simili con nomi più vecchi usati per guidare le persone verso blog più vecchi e libri più vecchi. In particolare cipolla, nonché porte e adattatori. Nessuna delle quali è l'unica opzione architettonica che hai.

Mi piace lo zio Bob perché è un oratore e un autore pubblici fantastici. Mi fa pensare a cose che altrimenti non avrei. Ma se lasci che ciò ti trasformi in un fanatico religioso che insiste sul fatto che tutto deve essere fatto a modo tuo, scoprirai rapidamente che l'aggiornamento della documentazione è il più vicino che ti lascerò arrivare al mio codice.

Le architetture di parole d'ordine sono utili quando si ha un codice di lunga durata che deve persistere mentre il mondo cambia attorno ad esso. Questo è quando brilla. Se il mondo è stabile rispetto al codice, allora stai facendo cose fantasiose senza una buona ragione.

Non importa quanto qualcosa di fantastico sembri, c'è un contesto in cui puoi inserirlo che lo renderà assurdo. Spiacente, neanche questo è un proiettile d'argento.

Ma nel video ritengo che suggerisca che un'architettura pulita dovrebbe avere un chiaro confine tra logica di business e framework. I frame (web, android, ecc.) Dovrebbero essere plug-in che si collegano alla logica aziendale. Nel video prende in giro anche le rotaie.

Hai ragione. Lui fa. Lo zio Bob ritiene che i framework possano essere trattati come librerie. E loro possono. Ma anche quella decisione ti costa qualcosa.

Ciò che il signor Martin sta cercando di preservare è uno spazio in cui la tua lingua di uso generale è ancora generale. Ti arrendi quando diffondi un framework ovunque. Quando lo fai, stai seguendo il percorso di trasformare la tua lingua in qualcosa chiamato una lingua specifica del dominio. HTML è un linguaggio specifico del dominio. Fa molto bene il suo lavoro ma ci sono altri lavori che non può fare affatto.

Finché le tue esigenze sono anticipate dal quadro, le cose andranno molto bene. È bello avere le tue esigenze anticipate. Ti mette in una scatola che semplifica le cose. Basta capire a cosa ti stai arrendendo per ottenere questo. Se diffondi Spring ovunque non puoi più pubblicizzarlo come lavoro Java. È un lavoro Java / Spring. Potrei dire la stessa cosa di Ruby e Rails ma Rails ha mangiato il pranzo di Ruby molto tempo fa.


4

Per citare il video:

"Non vuoi fare fusioni di posta in SQL."

seguito da:

"In realtà ho visto una stored procedure SQL che è stata un'intera stampa unione"

L'architettura, come la fusione della posta, è solo un'opzione tra le tante.

Ciò che non è facoltativo sono i problemi che l'architettura sta cercando di risolvere.

Se capisci quali problemi la fusione SQL mail causa rispetto ad altre soluzioni, allora la tua scelta architettonica verrà informata e anche se sei costretto a scegliere soluzioni "cattive", sarai consapevole e mitigerai le loro carenze.

Se segui uno stile architettonico solo perché è ben pensato, è probabile che tu commetta errori e incontri gli stessi problemi.



1

L'architettura pulita è un insieme di principi e modelli per affrontare una serie di sintomi comuni che le organizzazioni di sviluppo software devono spesso affrontare nel corso della vita della costruzione di applicazioni complesse. Il signor Martin fa di tutto per identificare i sintomi e le cause profonde in base alla sua vasta esperienza nel settore e per chiarire il ruolo dell'architettura nel mitigare queste preoccupazioni.

Tuttavia, non è una regola empirica, né una panacea per tutti i mali. Se leggi il libro, avrai una migliore comprensione di se / quando / come applicare i principi e i modelli che sostiene (e i compromessi coinvolti). Se non hai letto il libro, è probabile che tu faccia ipotesi, domande, giudizi e dichiarazioni errati sulla base di informazioni incomplete.


questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati in 4 risposte precedenti
moscerino del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.