Introduzione agli anti-pattern

Gli anti-pattern sono l'esatto opposto dei pattern. Ricordiamo che i modelli di progettazione sono esempi di buone pratiche di programmazione, ovvero modelli per risolvere determinati problemi. Ma gli anti-schemi sono il loro completo opposto, cioè schemi di errori che vengono commessi durante la risoluzione di vari problemi.

Parte di una buona pratica di programmazione consiste proprio nell'evitare gli anti-pattern. Non pensare che questa sia una spazzatura teorica così incomprensibile: questi sono problemi specifici che quasi tutti gli sviluppatori hanno riscontrato. Chi sa, è armato!

Diamo un'occhiata ad alcuni anti-pattern comuni tra i principianti:

  • Numeri magici e stringhe
  • classe dio
  • Ottimizzazione anticipata
  • l'invenzione della bicicletta
  • Invenzione del monociclo

Numeri magici e stringhe

Un numero magico è una costante utilizzata nel codice per qualcosa (il più delle volte identificazione dei dati), il cui numero stesso non ha alcun senso senza un commento corrispondente. I numeri non hanno assolutamente alcuna semantica.

Quando i numeri iniziano ad apparire nel codice del tuo progetto, il cui significato non è ovvio, questo è molto brutto. Un programmatore che non è l'autore di tale codice avrà difficoltà a spiegare come funziona. Nel tempo, anche l'autore del codice con i numeri magici non sarà in grado di spiegarlo.

I numeri rendono il codice difficile da capire e refactoring. Le ragioni principali di questo errore sono la fretta nello sviluppo e la mancanza di pratica di programmazione. Questo anti-pattern dovrebbe essere stroncato sul nascere stabilendo l'uso di costanti numeriche prima di iniziare lo sviluppo.

Per risolvere questo problema, è necessario creare una variabile il cui nome spieghi lo scopo della costante numerica e assegnarle il valore desiderato.

classe dio

L'oggetto divino è un anti-pattern abbastanza comune tra gli sviluppatori OOP. Tale oggetto assume troppe funzioni e/o memorizza quasi tutti i dati. Di conseguenza, abbiamo un codice non portabile, che peraltro è difficile da capire.

Inoltre, tale codice è abbastanza difficile da mantenere, dato che l'intero sistema dipende quasi esclusivamente da esso. Motivi di questo errore: incompetenza dello sviluppatore, uno sviluppatore che si assume gran parte del lavoro (soprattutto quando la quantità di lavoro supera il livello di esperienza dello sviluppatore).

È necessario affrontare questo approccio suddividendo le attività in attività secondarie che possono essere gestite da diversi sviluppatori.

Ottimizzazione anticipata

L'ottimizzazione prematura è l'ottimizzazione che viene eseguita prima che il programmatore disponga di tutte le informazioni necessarie per prendere decisioni informate su dove e come farlo.

In pratica, è difficile prevedere dove si verificherà un collo di bottiglia. I tentativi di ottimizzazione prima di ottenere risultati empirici porteranno alla complessità del codice e alla comparsa di errori, ma non porteranno alcun vantaggio.

Come evitare? Innanzitutto, scrivi codice pulito, leggibile e funzionante utilizzando algoritmi e strumenti noti e collaudati. Se necessario, utilizzare gli strumenti di profilazione per trovare i colli di bottiglia. Affidati a misurazioni, non a congetture e supposizioni.

Esempi e caratteristiche

Caching prima della profilazione. Utilizzo di euristiche complesse e non dimostrate invece di algoritmi matematicamente corretti. Una selezione di framework nuovi e non testati che potrebbero comportarsi in modo anomalo sotto carico.

Qual è la difficoltà

Non è facile determinare quando l'ottimizzazione è prematura. È importante lasciare spazio alla crescita in anticipo. Devi scegliere soluzioni e piattaforme che ti consentano di ottimizzare e crescere facilmente. Inoltre, a volte l'ottimizzazione prematura viene utilizzata come scusa per un codice errato. Ad esempio, prendono un algoritmo O(n2) solo perché l'algoritmo sarebbe O(n) più difficile.

l'invenzione della bicicletta

Il significato di questo anti-pattern è che il programmatore sviluppa la propria soluzione a un problema per il quale esistono già soluzioni, e spesso molto più efficaci.

Lo sviluppatore si considera più intelligente, quindi cerca di trovare la propria soluzione per ogni attività, nonostante l'esperienza dei suoi predecessori. Molto spesso, ciò comporta solo una perdita di tempo e una diminuzione dell'efficienza del programmatore. Dopotutto, è probabile che la soluzione non sia ottimale, se trovata.

Certo, non si può scartare del tutto la possibilità di una soluzione indipendente, poiché questa porterà alla programmazione copia-incolla in modo diretto. Lo sviluppatore deve navigare tra i compiti che possono presentarsi davanti a lui per risolverli con competenza, utilizzando soluzioni già pronte o inventando le proprie.

Molto spesso, la ragione di questo anti-pattern è una semplice mancanza di tempo. E il tempo è denaro.

Invenzione della bicicletta a ruota quadra

Questo anti-modello è strettamente correlato al semplice reinventare la ruota, creando la tua cattiva soluzione quando esiste una soluzione migliore.

Questo anti-pattern richiede il doppio del tempo: in primo luogo, il tempo viene speso per inventare e implementare la propria soluzione, quindi per il refactoring o la sua sostituzione.

Il programmatore deve essere consapevole dell'esistenza di varie soluzioni per determinate gamme di compiti, essere guidato dai loro vantaggi e svantaggi.

Tutti i problemi che dovrai affrontare come programmatore possono essere suddivisi in due parti:

  • le persone intelligenti hanno risolto questo problema 30 anni fa
  • le persone intelligenti hanno risolto questo problema 50 anni fa

La maggior parte dei problemi di programmazione sono stati risolti con successo prima ancora che tu nascessi . Non c'è bisogno di inventare nulla: basta studiare l'esperienza di altre persone (questo è ciò per cui sono scritti i libri).

Nel 2022 possiamo festeggiare i seguenti compleanni:

  • Linguaggi di programmazione
    • Il linguaggio C compie 50 anni (1972)
    • Il linguaggio Java ha compiuto 27 anni (1995)
    • Python compie 31 anni (1991)
  • Connessione
    • Internet ha compiuto 39 anni (1983)
    • Il telefonino compie 49 anni (1973)
    • Il primo SMS è stato inviato 30 anni fa (1992)
  • Modelli
    • Il modello MVC ha compiuto 44 anni (1978)
    • SQL è stato inventato 48 anni fa (1974)
    • I Java Beans sono stati inventati 26 anni fa (1996)
  • Biblioteche
    • Hibernate è stato inventato 21 anni fa (2001)
    • La primavera è stata inventata 20 anni fa (2002)
    • Tomcat rilasciato 23 anni fa (1999)
  • Sistema operativo
    • Unix è stato rilasciato 51 anni fa (1971)
    • Windows ha visto la luce 37 anni fa (1985)
    • Mac OS rilasciato 21 anni fa (2001)

E tutte queste cose non sono state solo inventate, sono state sviluppate come soluzioni a problemi che erano molto comuni e rilevanti in quel momento.