Pubblicità Progresso: Campagna Anti-IF

Obiettivo di questa campagna è sensibilizzare gli sviluppatori verso l’uso efficace dei principi di base del paradigma Object-Oriented.

Il primo passo per raggiungere questo obiettivo è essere consapevoli delle conseguenze in termini di design dell’uso degli IF (di qui il nome della campagna), e delle strutture di controllo in genere, applicati seguendo il paradigma imperativo anche in un linguaggio Object-Oriented.

Questa maggiore consapevolezza, obiettivo della nostra campagna, darà modo allo sviluppatore di comprendere come, applicando i principi del Design Object-Oriented, sia possibile raggiungere risultati di maggiore efficacia in termini di flessibilità, evolutività, comunicatività e testabilità.


La campagna nasce da una idea di Francesco Cirillo: “Molti team vogliono essere agili, ma non conoscono le basi per ridurre la complessità del loro codice. Saper usare gli oggetti consente di eliminare gli IF di tipo, che rappresentano il più diffuso strumento per compromettere flessibilità ed evolutività del software. Iniziamo da questi!”

Il problema di base è che l’IF di tipo crea dipendenza, accoppiamento tra moduli (metodi, oggetti, componenti, etc.) e aumenta i cammini possibili all’interno del nostro codice (riducendone così la leggibilità ).

L’IF sembra un modo rapido e comodo per realizzare i cambiamenti, ma proprio per quanto appena detto, IF dopo IF, si arriva a software non più modificabile e pieno di duplicazioni.

Un esempio semplice:

// classe Bond
double calculateValue() {
if(_type == BTP) {
return calculateBTPValue();
} else if(_type == BOT) {
return calculateBOTValue();
} else {
return calculateEUBValue();
}
}

Ogni modifica nel tipo delle obbligazioni, ad esempio una nuova obbligazione da valutare, porta a modificare il nostro pezzo di codice. Immaginate cosa può voler dire modificare metodi con IF e SWITCH innestati!

Gli oggetti forniscono uno strumento efficace per far sì che eventuali cambiamenti nei requisiti non si traducano in modifiche del codice:

// classe Bond
double calculateValue() {
_bondProfile.calculate();
}

// classe AbstractBondProfile
abstract double calculate();

// classe BTPBondProfile
double calculate() {
...
}
// classe BOTBondProfile
double calculate() {
...
}
// classe EUBondProfile
double calculate() {
...
}

Dov’è il vantaggio di togliere l’IF? Nel fatto che domani, la richiesta di un nuovo tipo di obbligazione comporterà la semplice creazione di una nuova classe, con la sola logica richiesta per il calcolo del valore di quella nuova obbligazione.

Non sempre la soluzione sta nel creare una classe astratta o una interfaccia, ma, sempre, la soluzione aumenterà la flessibilità, evolutività, comunicatività e testabilità del software.

Per ordinare la maglietta, clicca qua :)

Grazie a deneb per la notizia!

Fonte | MedotiAgili.it

18 Risposte a “Pubblicità Progresso: Campagna Anti-IF”

  1. C++ Lover Dice:

    Cosa c’entra il fatto che voi abbiate scoperto ieri mattina il polimorfismo con l’if?

    Quello che voi chiamate “if di tipo” lo fanno solo i bambinetti che programmano in nient’altroche Giava.

    Se dovete farvi una maglietta per ricordarvelo o lo considerate una grande furbata, beh! allora siamo messi bene…

  2. Mark Ugin Dice:

    in un mondo senza if le macchine andrebbero sempre dritte?

  3. montoya Dice:

    @C++ Lover
    Me crepo… il “Giava” non sarà potente come il C/C++, ma sicuramente non è come lo immagini te. Io quindi sarei un bambinetto spastico, perché uso sia il “Giava” che il “C++”… bah

  4. michelangelog Dice:

    anche a me questo discorso torna poco, l’oop è una metodologia, il linguaggio non c’entra potresti usare l’oop anche in vb.net… ma non vedo come senza if possano farsi alcune cose in modo efficente almeno che tu un pattern machting basato sulle espressioni regolari non lo consideri un if (anche se magari poi lo implementi proprio con uno switch o un if), nessun testo di oop menziona l’if come un costrutto da evitare, anzi paradossalmente allora c++ grazie alle classi template era più adatto di java a fornire un esempio :) (generics suck)

  5. michelangelog Dice:

    inoltre secondo te un linguaggio come erlang sarebbe tutto da buttare :).
    Java meno potente del C++? si, no, forse… dipende dal contesto, scrivi un applicazione web di un certo livello a forza di cgi in c++ vedrai che gioia… O un mini applicativo per un cellulare che ha solo un jvm e magari niente api per il C.
    Il linguaggio è una questione di contesto ma il metodo è sempre valido.

  6. nexus Dice:

    Credo che gli autori dei commenti di disappunto abbiano travisato il senso “profondo” della campagna che non intende affatto eliminare definitivamente l’uso dell’if, ma limitarlo alle situazioni nelle quali non è possibile una maggiore (migliore) espressività tramite i costrutti e gli approcci dell’OOP.
    L’anti-IF è solo uno slogan che arriva più velocemente al senso, ma a quanto pare è di facile fraintendimento.
    Parlo così perchè, tanto per fare un esempio, al javaday 2007, Cirillo ha mostrato un esempio di refactoring “anti-if” nel quale l’obiettivo era mirato ad evitare un ciclo for poco espressivo, flessibile all’evoluzione, ecc….per dire quanto l’IF in se c’entri poco…

  7. axj Dice:

    Togliere l’ if… come direbbe Menea di Seneca …”cui prodest?”, ovvero a chi è di vantaggio fare una cosa del genere. Ho capito la battaglia contro i “buffer”, quella contro l’utilizzo di “heap indiscriminati”, di specificatori di stringa non formattati, e persino quella sul “riempimento sql”…. ma quella dell’if non ha proprio senso….ne per la sicurezza ne computazionalmente vedo vantaggi, e per quanto riguarda la struttura di codice, beh… li è come la fXXa…. ognuno se la sceglie come vuole…..

    Piccolo fuori pista: La discussione sul linguaggio di programmazione più potente è vecchia non so quanto….. ed è inutile….. sono 3000 i pro e i contro C++/Java, e stare li uno su uno è stupido.
    Certo potremmo stare a discutere per ore su Bytecode P.I. di java, e le ottimizzazioni al proc di C++ ma, per queste cose…. e meglio il forum (eheh… pubblicizzo… scherzo dai!!!!)

  8. kenneth Dice:

    secondo me, se l’avesse detto Dijkstra, molti di questi commenti sarebbero positivi.

  9. axj Dice:

    Se lo avesse detto lui, direi che non ha molto ben chiaro su come lavora il codice macchina…..

    Basta vedere come certe istruzioni vengono convertite in asm per capire che è una masturbazione mentale

  10. sistemista Dice:

    io non ce sto a crede!!!

  11. CLover-JavaWorker Dice:

    Ma che stronzate, ma che senso ha non utilizzare gli if?
    Io nn ho ancora capito come cavolo vogliono fare, ma in un modo o nell’altro l’if si usa, se non dal codice, la stessa JVM lo usa, e se JVM non la utilizasse il processore lo usa.
    Ma dico, ma questi fanatici di java che credono di essere intelligenti perche vogliono eradicare l’if, ma conoscono qualcosa della programmazione VERA, e la programmazione VERA = Linguaggio C, insuperabile, potentissimo, insostituibile.

  12. CLover-JavaWorker Dice:

    sono daccordissimo con axj.

  13. axj Dice:

    Per dirla ignorantemente, divento tutti “salti” alla fine…. chi sa di che parilamo capira, per gli altri, non avrà importanza

  14. Risorto Dice:

    Non si parla di eliminare gli if, si parla di non programmare in modo procedurale in un linguaggio object oriented.
    L’esempio con la classe abstract rappresenta un modo per rendere object oriented un pezzo di codice dove l’if è completamente innutile e dannoso.
    Chi non lo capisce ha bisogno di un ripasso di oop.

    NOTA FONDAMENTALE:
    non ho nominato ne java ne c++, in quanto questo hanno entrambi, con caratteristiche diverse la connotazione della programamazine oop.
    Le porcate nel codice si possono scrivere sia in java che c++.

    La stupida discusisone riguardo meglio java/c++ ha le caratteristiche del confronto se è meglio un machete o un bisturi: dipende sempre dal contesto e dal mondo che uno si appresta ad affrontare

  15. axj Dice:

    La stupida discusisone riguardo meglio java/c++ ha le caratteristiche del confronto se è meglio un machete o un bisturi: dipende sempre dal contesto e dal mondo che uno si appresta ad affrontare

    Esempio stupendo, rende proprio l’idea…. ora bisogna definire solamente chi è il machete e chi il bisturi

  16. Stefano Dice:

    Personalmente, uno dei motivi per cui non aderisco a questa campagna ‘anti’if’ sta proprio nella pericolosità dello slogan: pericolosità non nel senso che fa male leggerlo quanto nel fatto che può essere, purtroppo, preso alla lettera.

    Ho letto attentamente il concetto alla base della campagna e non posso che essere d’accordo (anche se, francamente, si tratta di tecniche adottate normalmente da qualunque programmatore OO con un minimo di esperienza).

    Diciamo che il pericolo sta nel fatto che DAVVERO, lì fuori, ci sono programmatori che possono aderire ciecamente, andare in giro con la maglietta e togliere, sul serio, TUTTI gli if dal loro codice ..

    Sigh.

    A proposito (scusate l’auto riferimento, ma è in tema):

    http://minddrivenit.blogspot.com/2008/07/campagna-anti-if-e-i-goto.html

  17. Gentilino Dice:

    Io sono soltanto stufo di sentire espressioni tipo “io sono programmatore java… ” o “.. programmatore net”… o il “c si che è un linguaggio…” … un programmatore è un programmatore e non uno che conosce una sintassi piuttosto che un’altra… quelli sono solo dattilografi pigri…
    Un programmatore è un programmatore e quindi scrive buon codice, stabile, estendibile, facilmente modificabile…. e quindi comprensibile….

    Per quanto riguarda lo slogan, è sicuramente forte, ma lo slogan serve proprio per attirare l’attenzione o esaltare concetti… e non certo a fornire una verità assoluta… chi non è in grado di capire questo, credo, che l’IF sia solo l’ultimo dei suoi problemi….

    PS: Condivido il monito di Stefano sulla pericolosità dello slogan, ma volevo solo rassicurarlo sul fatto che quei poverini che “aderiranno ciecamente” non saranno mai in grado di togliere gli IF dal loro codice… :)

  18. Stefano Dice:

    Gentilino, mi piace molto la tua nota sulla definizione di ‘programmatore’. Sono d’accordo.

Lascia una Risposta