Como programadores, siento que nuestro objetivo es proporcionar buenas abstracciones sobre el modelo de dominio y la lógica empresarial dados. Pero, ¿dónde debería detenerse esta abstracción? Cómo hacer una compensación entre la abstracción y todos sus beneficios (flexibilidad, facilidad de cambio, etc.) y la facilidad de comprender el código y todos sus beneficios.
Creo que tiendo a escribir código demasiado abstracto y no sé qué tan bueno es; A menudo tiendo a escribirlo como si fuera una especie de micro marco, que consta de dos partes:
- Micro módulos que están conectados en el micro marco: estos módulos son fáciles de entender, desarrollar y mantener como unidades individuales. Este código básicamente representa el código que realmente hace las cosas funcionales, descritas en los requisitos.
- Código de conexión; ahora aquí creo que se encuentra el problema. Este código tiende a ser complicado porque a veces es muy abstracto y es difícil de entender al principio; esto surge debido al hecho de que es solo pura abstracción, la base en la realidad y la lógica de negocios que se realiza en el código presentado 1; Por esta razón, no se espera que este código se cambie una vez probado.
¿Es este un buen enfoque en la programación? ¿Que, teniendo código cambiante muy fragmentado en muchos módulos y muy fácil de entender y código cambiante muy complejo desde el punto de vista de abstracción? Si todo el código es uniformemente complejo (es decir, el código 1 es más complejo e interconectado y el código 2 es más simple) para que cualquiera que lo revise pueda entenderlo en un tiempo razonable, pero el cambio es costoso o la solución presentada anteriormente es buena, donde "cambiar el código" es muy fácil de entender, depurar, cambiar y "vincular el código" es un poco difícil.
Nota: ¡no se trata de la legibilidad del código! Ambos códigos en 1 y 2 son legibles, pero el código en 2 viene con abstracciones más complejas, mientras que el código 1 viene con abstracciones simples.
fuente
Respuestas:
Las primeras palabras de TC ++ PL4:
Todos los problemas en informática pueden resolverse mediante otro nivel de indirección, excepto el problema de demasiadas capas de indirección. - David J. Wheeler
(David Wheeler fue mi asesor de tesis. La cita sin la última línea importante a veces se llama "La primera ley de la informática").
fuente
Sí definitivamente. La cuestión es que ninguna abstracción es perfecta. Todos los detalles de la capa sobre la que se ubican las abstracciones están ahí por una razón, y puede simplificar muchas cosas, pero si esa complejidad no fuera necesaria en algún momento, probablemente no estaría allí en primer lugar. Y eso significa que en algún momento, cada abstracción se filtrará de alguna manera.
Y ahí es donde radica el verdadero problema. Cuando las abstracciones fallan, mientras más capas haya colocado entre el código que escribió y lo que realmente está sucediendo, más difícil será resolver el problema y solucionarlo, porque hay más lugares donde podría estar el problema. Y cuantas más capas haya, más tienes que saber para rastrearlo.
fuente
Si, absolutamente.
La analogía que me gusta usar para explicar la programación es la de un sastre. Al hacer un traje, un buen sastre siempre dejará una pequeña cantidad de tela en lugares estratégicos dentro de la prenda para permitir que la prenda se pueda llevar dentro o fuera, sin cambiar su forma o estructura general.
Good Tailor's no deja resmas de tela en cada costura solo en caso de que crezca un tercer brazo o quede embarazada. Demasiado material en los lugares equivocados hará que la prenda no quede bien ajustada, y el uso de la prenda adicional simplemente obstaculiza el uso normal. Si tiene poca tela y la prenda es propensa a las lágrimas y no podrá ser alterada para hacer frente a cambios menores en el físico de su usuario, afectando la forma en que se sienta la prenda.
Tal vez algún día, nuestro Good Tailor tenga la tarea de hacer un vestido tan ajustado que tenga que coserlo. Y tal vez a nuestro Good Tailor se le pida que use ropa de maternidad, donde el estilo y el ajuste son segundos para la comodidad y la capacidad de expansión. Pero antes de emprender cualquiera de esos trabajos especiales, un buen Sastre sería lo suficientemente sabio como para que todos conozcan los compromisos que se están haciendo para lograr esos objetivos.
A veces, estos compromisos son el camino correcto a seguir, y las personas están dispuestas a aceptar sus consecuencias. Pero en la mayoría de los casos, el enfoque de dejar un poco donde más cuenta superará cualquier beneficio percibido.
Entonces, relacionando esto con la abstracción. Es absolutamente posible tener demasiadas capas de abstracción, al igual que es posible tener muy pocas. El verdadero arte del programador, como nuestros amigos a medida, es dejar un poco donde más cuenta.
Volviendo al tema.
El problema con el código generalmente no es la abstracción, sino las dependencias. Como ha señalado, es el código que conecta objetos discretos lo que es un problema, porque existe una dependencia implícita entre ellos. En algún momento, la comunicación entre las cosas solo debe ser concreta, pero juzgar dónde está ese punto generalmente requiere algunas conjeturas.
Dicho esto, "Micro" cualquier cosa suele ser una indicación de que ha sobregranizado el diseño de su objeto, y probablemente esté utilizando Type como sinónimo de lo que deberían ser datos . Tener menos cosas también significa menos dependencias necesarias para comunicarse entre ellas.
Soy un gran admirador de la mensajería asincrónica entre sistemas por este motivo. Termina con dos sistemas que dependen del mensaje , en lugar de uno al otro. Dándole un acoplamiento menos estrecho entre los sistemas de comunicación. En ese punto, si necesita tener una dependencia entre sistemas, debe considerar si tiene los bits que dependen de los lugares correctos. Y a menudo es el caso que no.
Finalmente, el código complicado será complicado. A menudo no hay forma de evitar eso. Pero el código que tiene menos dependencias es mucho más fácil de entender que uno que se basa en varios estados externos.
fuente
Tengo una opinión diferente: nuestro objetivo es resolver un problema de negocios. Las abstracciones son solo una técnica para organizar una solución. Otra respuesta utiliza la analogía de un sastre haciendo ropa. Tengo otra analogía en la que me gusta pensar: un esqueleto. El código es como un esqueleto, y las abstracciones son las articulaciones entre los huesos. Si no tiene articulaciones, simplemente termina con un solo hueso que no puede moverse en absoluto y es inútil. Pero si tienes demasiadas articulaciones, terminas con un montón de gelatina descuidada que no puede sostenerse por sí sola. El truco es encontrar el equilibrio adecuado: suficientes articulaciones para permitir el movimiento, pero no tanto que no haya una forma o estructura definida real.
fuente