Mi è stato assegnato il compito di implementare un linguaggio specifico di dominio per uno strumento che può diventare abbastanza importante per l'azienda. Il linguaggio è semplice ma non banale, consente già loop nidificati, concatenazione di stringhe, ecc. Ed è praticamente sicuro che altri costrutti verranno aggiunti man mano che il progetto avanza.
So per esperienza che scrivere un lexer / parser a mano, a meno che la grammatica sia banale, è un processo che richiede tempo ed è soggetto a errori. Quindi mi sono rimaste due opzioni: un generatore di parser à la yacc o una libreria combinatrice come Parsec. Anche il primo era buono, ma ho scelto il secondo per vari motivi e ho implementato la soluzione in un linguaggio funzionale.
Il risultato è abbastanza spettacolare per i miei occhi, il codice è molto conciso, elegante e leggibile / fluente. Ammetto che potrebbe sembrare un po 'strano se non hai mai programmato qualcosa di diverso da java / c #, ma questo sarebbe vero per qualsiasi cosa non scritta in java / c #.
Ad un certo punto, tuttavia, sono stato letteralmente attaccato da un collega. Dopo una rapida occhiata al mio schermo, ha dichiarato che il codice è incomprensibile e che non avrei dovuto reinventare l'analisi ma usare solo uno stack e una stringa. Spaccare come fanno tutti. Ha fatto molto rumore e non sono riuscito a convincerlo, in parte perché sono stato colto di sorpresa e non ho avuto spiegazioni chiare, in parte perché la sua opinione era immutabile (nessun gioco di parole). Mi sono persino offerto di spiegargli la lingua, ma senza risultati.
Sono sicuro che la discussione tornerà in superficie davanti al management, quindi sto preparando alcuni argomenti concreti.
Questi sono i primi motivi che mi vengono in mente per evitare una soluzione basata su String.Split:
- hai bisogno di molti ifs per gestire casi speciali e le cose vanno rapidamente fuori controllo
- molti indici array codificati rendono la manutenzione dolorosa
- estremamente difficile gestire cose come una chiamata di funzione come argomento del metodo (es. add ((aggiungi a, b), c)
- molto difficile fornire messaggi di errore significativi in caso di errori di sintassi (molto probabile che accada)
- Sono tutto per semplicità, chiarezza ed evitare inutili cose criptiche, ma credo anche che sia un errore smorzare ogni parte della base di codice in modo che anche una pinna da hamburger possa capirla. È lo stesso argomento che sento per non usare le interfacce, non adottare la separazione delle preoccupazioni, copiare e incollare il codice, ecc. Dopo tutto, è necessario un minimo di competenza tecnica e volontà di apprendere per lavorare su un progetto software. (Non userò questo argomento perché probabilmente suonerà offensivo, e iniziare una guerra non aiuterà nessuno)
Quali sono i tuoi argomenti preferiti contro l' analisi del modo Cthulhu ? *
* ovviamente se riesci a convincermi che ha ragione, sarò anche perfettamente felice