Sto scrivendo il codice Ruby per un semplice esercizio di crittografia e ho frequentemente imbattuto in questo dilemma (l'esercizio è un cifrario solitario se devi saperlo). Si tratta di capire se dovrei estrapolare la mia logica con variabili descrittive e istruzioni a step singolo che rendano la funzione leggibile anziché una dichiarazione concisa, anche densa che elimini la ripetizione e / o riduca al minimo le opportunità di errori.
Il mio esempio più recente: il mio programma prende input e, a causa delle rigide linee guida del formato, può facilmente determinare se l'input debba essere crittografato o decrittografato. Per semplificare, una volta che la chiave di crittografia e il messaggio sono stati convertiti / generati per essere compatibili, si tratta di sottrarre la chiave dal messaggio crittografato o di aggiungere la chiave a un messaggio non crittografato, per ottenere l'output desiderato (si pensi alla chiave come crittografia, messaggio + crittografia = codice; codice - crittografia = messaggio). La posizione DRY mi dice che dovrei convertire il mio messaggio crittografato in modo diverso dal mio messaggio non crittografato in modo che la funzione che prende la chiave di crittografia e la applichi al messaggio non debba mai distinguere. Ho scoperto che questo significa che ho bisogno di alcune istruzioni nidificate nella funzione, ma la logica sembra essere solida. Questo codice, tuttavia, non è facilmente leggibile. Ciò richiederebbe alcuni commenti per essere chiari.
Potrei, d'altra parte, scrivere due diverse funzioni chiamate in base a un flag che viene impostato quando l'applicazione determina la crittografia o la decrittografia. Ciò sarebbe più semplice da leggere, ma duplicherebbe la funzione di alto livello dell'applicazione della chiave di crittografia a un messaggio (causandone la crittografia o la decrittografia).
Dovrei inclinarmi verso un codice leggibile o un codice conciso? O ho perso un altro modo per ottenere questa funzionalità e soddisfare entrambi i principi? Si tratta di una posizione su una scala in cui è necessario considerare lo scopo del progetto e prendere le decisioni migliori per raggiungere questo scopo?
Finora, tendo a enfatizzare il codice conciso e DRY su un codice leggibile.