Mi è stato assegnato il compito di implementare un linguaggio specifico di dominio per uno strumento che potrebbe diventare piuttosto importante per l'azienda. Il linguaggio è semplice ma non banale, consente già cicli annidati, concatenazione di stringhe, ecc. Ed è praticamente certo che altri costrutti verranno aggiunti all'avanzamento del progetto.
So per esperienza che scrivere un lexer / parser a mano, a meno che la grammatica sia banale, sia un processo che richiede tempo e soggetto a errori. Quindi mi restavano due opzioni: un generatore di parser à la yacc o una libreria di combinatori come Parsec. Anche il primo era buono, ma ho scelto quest'ultimo per vari motivi e ho implementato la soluzione in un linguaggio funzionale.
Il risultato è piuttosto 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 tutto ciò che non è stato scritto 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 dovrei reinventare l'analisi, ma usare solo uno stack e String.Split come fanno tutti. Ha fatto un sacco di rumore, e non ho potuto convincerlo, in parte perché sono stato colto di sorpresa e non avevo una spiegazione chiara, in parte perché la sua opinione era immutabile (nessun gioco di parole). Mi sono persino offerto di spiegargli la lingua, ma senza risultato.
Sono sicuro che la discussione verrà rivista di fronte alla gestione, quindi sto preparando alcuni argomenti solidi.
Questi sono i primi motivi che mi vengono in mente per evitare una soluzione basata su String.Split:
- hai bisogno di molti if per gestire casi speciali e le cose rapidamente sfuggono al controllo
- molti indici di array hardcoded rendono la manutenzione dolorosa
- estremamente difficile da gestire cose come una chiamata di funzione come argomento del metodo (ad esempio, aggiungi ((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 ciarlatani intelligenti, ma credo anche che sia un errore smorzare ogni parte del codebase in modo che anche un flipper di hamburger possa capirlo. È lo stesso argomento che sento per non usare le interfacce, non adottare la separazione delle preoccupazioni, copiare il codice di copiatura, ecc. Un minimo di competenza tecnica e volontà di imparare è necessario per lavorare su un progetto software dopo tutto. (Non userò questo argomento perché probabilmente suonerà offensivo e iniziare una guerra non aiuterà nessuno)
Quali sono i tuoi argomenti preferiti contro analizzando il modo Cthulhu ? *
* naturalmente se riesci a convincermi che ha ragione, sarò perfettamente felice anch'io