Quando stai progettando troppo per risolvere un problema di base, sei over-engineering . Ad esempio, quando si utilizza un pattern factory astratto "just in case" per creare un oggetto molto semplice in cui la business logic è abbastanza semplice da stare in LOC quattro-cinque, si sta pensando troppo al design (e violando KISS e YAGNI).
Tieni presente che non deve necessariamente essere eccessivamente complesso . Un modello di fabbrica astratto non ha nulla di complesso in esso non appena le classi vengono nominate correttamente e gli altri membri della squadra conoscono il modello. Detto questo, sono ancora troppe classi e codice per un problema che può essere risolto senza ricorrere a schemi specifici.
Quando non stai facendo abbastanza, sei under-engineering . Ad esempio, se la maggior parte della base di codice Java è in metodi statici all'interno di classi statiche e la maggior parte è in classi di utilità, non stai pensando abbastanza al design.
Si noti che la sovraingegneria e la sottoprogrammazione sono solitamente eseguite da programmatori inesperti, attraverso due diversi modelli:
-
I più inesperti non conoscono abbastanza i modelli di progettazione e tendono a non usarli e a non pensare troppo al design. Lasciano che il loro codice cresca con un design scarso o nullo, trovando il codice più semplice da leggere e capire.
-
Un po 'più esperti che hanno iniziato ad apprendere modelli di progettazione hanno la tendenza ad applicare questi modelli ovunque per dimostrare di conoscerli. Dovremmo creare un oggetto? Usiamo un modello di builder con un builder astratto e uno concreto. Hai bisogno di comunicare tra due oggetti? Usiamo il modello dell'adattatore! E, ovviamente, le interfacce fluenti sono divertenti, dal momento che ci fanno scrivere codice come questo:
Product product = ProductBuilder()
.setId(39)
.setPrice(new PriceFactory().usingAmount(59).usingUnit(Unit.Dollar))
.setTitle("Product 1"),
.setDescription("Description goes here")
.getResult()
invece di:
Price price = new Price(59, Unit.Dollar);
Product product = new Product(39, price, "Product 1", "Description goes here");
Richiede molta più esperienza ed esperienza per trovare il centro d'oro, cioè usare tanto design quanto necessario, ma assolutamente non più. Questo è il termine di ingegneria di destra, anche se non è usato molto nel settore, per una buona ragione.
Over-engineering e under-engineering sono i termini usati per criticare il codice di qualcun altro, come in "Amico, smetti di sovra-ingegnerizzare il tuo codice, riusciamo a malapena a trovare la strada attraverso dozzine di classi aggiunte inutilmente!" D'altra parte, il centro d'oro di right-engineering di uno sviluppatore non sarà necessariamente lo stesso (e di solito non è lo stesso) per gli altri. Una risposta recente mostra quanto non sia ovvio determinare dove porre una frontiera tra l'utilizzo di una fabbrica o lo spostamento del logica in un costruttore. Quindi, non si può affermare che il suo codice sia stato progettato correttamente, perché almeno alcuni dei suoi colleghi non sarebbero d'accordo.