Minimizar los efectos secundarios (idealmente no tener ninguno)
Una función que causa 3 cambios en estados fuera de su propio alcance es mucho más difícil de razonar y mantener que una que simplemente ingresa algo y genera algo más. No solo puede saber qué hace la función, debe recordar lo que hizo y cómo afecta a todas las demás funciones relevantes.
Para OOP, minimizar los efectos secundarios también significa clases con menos miembros, y especialmente menos miembros que pueden modificar el estado de la clase, ya que las funciones de los miembros pueden modificar estados más allá de los suyos y tener efectos secundarios (pueden manipular los elementos internos de la clase, por ejemplo). También significa clases con menos miembros de datos propios para que haya menos estado para que esos métodos puedan manipularlos y menos efectos secundarios que puedan causar.
Como un ejemplo simple, imagine tratar de diseñar una estructura de datos elegante que pueda mantener un sorted
estado que utiliza para determinar si se realizan búsquedas binarias o lineales. En tal caso, podría ser útil separar el diseño en dos clases. Llamar sorted
a la clase no ordenada podría devolver una estructura de datos de otra clase que siempre mantiene su contenido ordenado. Ahora tiene menos efectos secundarios (por lo tanto, es menos propenso a errores y es más fácil de comprender el código), así como un código más ampliamente aplicable (el diseño anterior sería un desperdicio tanto en el procesamiento como en la eficiencia intelectual humana para arreglos pequeños que nunca necesitan ser ordenados).
Evitar dependencias externas superfluas
Es posible que pueda implementar el código más conciso imaginable con la máxima reutilización de código utilizando 13 bibliotecas diferentes para realizar una tarea relativamente simple. Sin embargo, eso transfiere la sobrecarga intelectual a sus lectores al tener que hacerles entender al menos partes de 13 bibliotecas diferentes. Esta complejidad inherente debe ser apreciada de inmediato por cualquiera que haya intentado construir y comprender una biblioteca de terceros que requirió ingresar y construir una docena de otras bibliotecas para funcionar.
Esta es probablemente una visión muy controvertida, pero preferiría una modesta duplicación de código al extremo opuesto siempre que el resultado final esté bien probado (nada peor que el código defectuoso no probado duplicado muchas veces). Si la opción es entre 3 líneas de código duplicado para calcular un producto vectorial cruzado o extraer una biblioteca matemática épica solo para eliminar 3 líneas de código, sugeriría la primera a menos que todo su equipo esté a bordo con esta biblioteca matemática , en ese momento aún podría considerar escribir 3 líneas de código en lugar de 1 si es lo suficientemente trivial a cambio de los beneficios de desacoplamiento.
La reutilización del código es un acto de equilibrio. Reutilice demasiado y transfiera la complejidad intelectual de una manera de uno a muchos, ya que en esas 3 líneas de código simple que guardó anteriormente tiene el costo de exigir a los lectores y mantenedores que comprendan mucha más información que 3 líneas de código . También hace que su código sea menos estable, ya que si la biblioteca matemática cambia, también podría cambiar su código. Reutilice muy poco y también multiplique la sobrecarga intelectual y su código deja de beneficiarse de las mejoras centrales, por lo que es un acto de equilibrio, pero vale la pena mencionar la idea de que es un acto de equilibrio, ya que tratar de eliminar cada pequeña forma de duplicación modesta puede generar para un resultado que es tan difícil de mantener, si no más, que el extremo opuesto.
Pon a prueba la mierda
Esto es un hecho, pero si su código no maneja todos los casos de entrada y pierde algunos casos extremos, ¿cómo puede esperar que otros mantengan el código que escribió que ni siquiera entendió antes de que se transfiriera a sus ojos y manos? Es bastante difícil hacer cambios en el código que funciona perfectamente, mucho menos código que nunca fue del todo correcto en primer lugar.
Además de eso, el código que pasa pruebas exhaustivas generalmente encontrará menos razones para cambiar. Eso se relaciona con la estabilidad que es aún más un santo grial para lograr que la mantenibilidad, ya que el código estable que nunca necesita ser modificado no conlleva ningún costo de mantenimiento.
Documentación de interfaz
Priorice "qué hacen las cosas" sobre "cómo las hacen" si no puede dedicar el mismo tiempo a documentar ambas. Una interfaz clara que sea obvia en sus intenciones sobre lo que hará (o al menos, lo que se supone que debe hacer) en todos los casos de entrada posibles dará una claridad de contexto a su propia implementación que guiará en la comprensión no solo de cómo usar el código, pero también cómo funciona.
Mientras tanto, el código que carece de estas cualidades donde las personas ni siquiera saben lo que se supone que debe hacer es SOL, sin importar cuán bien documentados estén sus detalles de implementación. Un manual de 20 páginas sobre cómo se implementa el código fuente no tiene ningún valor para las personas que ni siquiera pueden entender exactamente cómo se supone que se debe usar en primer lugar y qué se supone que debe hacer en todos los escenarios posibles.
Para el lado de la implementación, priorice documentar lo que hace de manera diferente a los demás. Como ejemplo, Intel tiene una jerarquía de volumen límite para sus núcleos de trazado de rayos. Como trabajo en este campo, puedo reconocer la mayor parte de lo que hace su código de un vistazo sin examinar la documentación. Sin embargo, hacen algo único, que es la idea de atravesar el BVH y realizar intersecciones en paralelo utilizando paquetes de rayos . Ahí es donde quiero que prioricen su documentación porque esas partes del código son exóticas e inusuales en la mayoría de las implementaciones históricas de BVH.
Legibilidad
Esta parte es muy subjetiva. Realmente no me importa mucho la legibilidad de un tipo cercano a los procesos de pensamiento humano. El código más bien documentado que describe las cosas al más alto nivel aún me resulta difícil de seguir si el autor utiliza procesos de pensamiento extraños y complicados para resolver un problema. Mientras tanto, el código breve que usa nombres de 2 o 3 caracteres a menudo puede ser más fácil de entender para mí si la lógica es muy sencilla. Supongo que podrías hacer una revisión por pares y ver qué prefieren otras personas.
Estoy principalmente interesado en la mantenibilidad y, lo que es más importante, en la estabilidad. El código que no encuentra razones para cambiar es uno que tiene cero costos de mantenimiento.