Se me ha asignado la tarea de implementar un lenguaje específico de dominio para una herramienta que puede llegar a ser bastante importante para la empresa. El lenguaje es simple pero no trivial, ya permite bucles anidados, concatenación de cadenas, etc. y es prácticamente seguro que se agregarán otras construcciones a medida que avance el proyecto.
Sé por experiencia que escribir un lexer / analizador a mano, a menos que la gramática sea trivial, es un proceso lento y propenso a errores. Así que me quedaban dos opciones: un generador de analizadores a la yacc o una biblioteca combinada como Parsec. El primero también era bueno, pero elegí el segundo por varias razones e implementé la solución en un lenguaje funcional.
El resultado es bastante espectacular para mis ojos, el código es muy conciso, elegante y legible / fluido. Admito que puede parecer un poco extraño si nunca programó en otra cosa que no sea java / c #, pero esto sería cierto para cualquier cosa que no esté escrita en java / c #.
Sin embargo, en algún momento he sido literalmente atacado por un compañero de trabajo. Después de un rápido vistazo a mi pantalla, declaró que el código es incomprensible y que no debería reinventar el análisis, sino solo usar una pila y una cadena. Hizo mucho ruido y no pude convencerlo, en parte porque me sorprendió y no tuve una explicación clara, en parte porque su opinión era inmutable (sin juego de palabras). Incluso me ofrecí a explicarle el idioma, pero fue en vano.
Estoy seguro de que la discusión va a resurgir frente a la gerencia, así que estoy preparando algunos argumentos sólidos.
Estas son las primeras razones que se me ocurren para evitar una solución basada en String.Split:
- necesita muchos ifs para manejar casos especiales y las cosas se descontrolan rápidamente
- muchos índices de matriz codificados dificultan el mantenimiento
- extremadamente difícil de manejar cosas como una llamada a función como argumento de método (ej. add ((add a, b), c)
- Muy difícil proporcionar mensajes de error significativos en caso de errores de sintaxis (muy probable que suceda)
- Estoy a favor de la simplicidad, la claridad y evitar cosas innecesariamente inteligentes y crípticas, pero también creo que es un error tonificar cada parte de la base de código para que incluso una hamburguesa pueda entenderlo. Es el mismo argumento que escucho por no usar interfaces, no adoptar la separación de preocupaciones, copiar y pegar código, etc. Después de todo, se requiere un mínimo de competencia técnica y disposición para aprender para trabajar en un proyecto de software. (No usaré este argumento, ya que probablemente sonará ofensivo, y comenzar una guerra no ayudará a nadie)
¿Cuáles son sus argumentos favoritos en contra de analizar el estilo Cthulhu ? *
* por supuesto, si puedes convencerme de que tiene razón, también seré perfectamente feliz