Estoy escribiendo código Ruby para un simple ejercicio de encriptación y con frecuencia me he encontrado con este dilema (el ejercicio es un cifrado solitario si debe saberlo). Se trata de si debo rellenar mi lógica con variables descriptivas y declaraciones de un solo paso que hacen que la función sea legible en lugar de declaraciones concisas, incluso densas, que eliminen la repetición y / o minimicen las oportunidades de errores.
Mi ejemplo más reciente: mi programa recibe información y, debido a las pautas de formato rígido, puede determinar fácilmente si la información debe cifrarse o descifrarse. Para simplificar, una vez que la clave de cifrado y el mensaje se convierten / generan para ser compatibles, se trata de restar la clave del mensaje cifrado o agregar la clave a un mensaje no cifrado, para obtener la salida deseada (piense en la clave como cifrado, mensaje + cifrado = código; código - cifrado = mensaje). La posición DRY me dice que debo convertir mi mensaje cifrado de manera diferente a mi mensaje no cifrado para que la función que toma la clave de cifrado y la aplica al mensaje nunca necesite distinguir. Descubrí que esto significa que necesito algunas instrucciones anidadas if en la función, pero la lógica parece ser sólida. Sin embargo, este código no es fácil de leer.
Por otro lado, podría escribir dos funciones diferentes que se invocan en función de un indicador que se establece cuando la aplicación determina el cifrado o descifrado. Esto sería más fácil de leer, pero duplicaría la función de alto nivel de aplicar la clave de cifrado a un mensaje (lo que hace que se cifre o descifre).
¿Debo inclinarme hacia un código legible o un código conciso? ¿O he perdido otra forma de obtener esta funcionalidad y satisfacer ambos principios? ¿Es una posición a lo largo de una escala en la que uno debe considerar el propósito del proyecto y tomar las mejores decisiones para cumplir ese propósito?
Hasta ahora, tiendo a enfatizar el código conciso y SECO sobre el código legible.