programming paradigm oriented language concepts class oop programming-languages terminology

class - language - paradigm object oriented



¿Qué significa "monolítico"? (5)

"Monolítico" es un término que se ha utilizado para activar un software exitoso . Este enlace expone las suposiciones inherentes al término y su utilidad limitada.

La suposición básica es que un sistema funciona mejor si está construido a partir de componentes de software que tienen una tarea individual bien definida. Intuitivamente, esto parece correcto. Si cada componente funciona, todo el sistema debe funcionar, ¿verdad?

En realidad, no es tan fácil. Un sistema composicional (no monolítico) más grande puede pasar por alto una función crítica, incluso cuando no hay un solo componente a quien culpar. Esto ocurre cuando el diseño arquitectónico no asigna una función a ningún componente específico. Esto puede suceder especialmente si se trata de una función que no se correlaciona limpiamente con un solo componente.

Ahora Linux (para continuar con el ejemplo vinculado) en realidad no es monolítico. Tiene un espacio de usuario modular sobre un kernel monolítico, un espacio de usuario que viene con muchas utilidades separadas. Excepto cuando no lo hace

Lo he visto en el contexto de las clases. Sospecho que eso significa que la clase podría ser desglosada en subunidades lógicas, pero no puedo encontrar una buena definición. ¿Podría dar algunos ejemplos?

Gracias por la ayuda.

Editar: Me encantan las respuestas inteligentes, pero obviamente me refiero a "monolítico" dentro de un contexto de software. Conozco monolitos, megalitos, dólmenes y todos los contextos relacionados con la piedra. Caramba, tengo suficientes de ellos en mi país ...


Interesante pregunta. No creo que haya definiciones formales de lo que es una clase monolítica, pero ya entendiste la idea. Una clase que contiene múltiples componentes que están desconectados lógicamente, o acoplados inútilmente, es una clase monolítica.

Si ha leído The Pragmatic Programmer , que recomiendo encarecidamente, puede definir una clase monolítica como un antipatrón que va en contra de casi todo lo de ese libro.

En cuanto a los ejemplos, encontrará más en el ámbito del diseño de chips y sistemas operativos, donde hay definiciones formales de chips / kernels monolíticos, que son similares a una clase monolítica. Aquí hay algunos ejemplos, aunque cada uno de ellos puede argumentarse en contra de estar en esta lista:

  1. JOGL - Enlaces de Java para OpenGL. Esto podría ser discutible, y con buenas razones.
  2. La mayoría de los proyectos académicos: por razones obvias.

Si comenzó a programar solo, en lugar de unirse a un equipo, entonces es probable que pueda abrir uno de sus primeros proyectos, y habrá una clase que sea monolítica.



Significa que algo es lo opuesto a modular. Una aplicación modular puede reemplazar partes, a las que se hace referencia como módulos, sin necesidad de reemplazar toda la aplicación. Mientras que una aplicación monolítica, después de tener una pieza fija o actualizada, debe ser reemplazada en su totalidad.

De Wikipedia : "La modularidad es deseable, en general, ya que admite la reutilización de partes de la lógica de la aplicación y también facilita el mantenimiento al permitir la reparación o el reemplazo de partes de la aplicación sin requerir el reemplazo total".

Por lo tanto, en el contexto de una clase monolítica, todas sus características son independientes y si desea agregar o modificar una característica a la clase, deberá modificar / agregar código en la clase y volver a compilarla. Por el contrario, una clase modular expone el acceso a la funcionalidad que se implementa externamente. Por ejemplo, una clase "Calculadora" puede usar una clase "Agregar" por separado para realmente agregar números; llamar a una función "Multiplicar" desde una biblioteca separada; o incluso llamar a una función "Amortizar" desde un servicio web. Siempre que cada una de estas partes funcionales se pueda alterar externamente de la clase, es modular.


Mi definición de un diseño monolítico en el desarrollo de software es un diseño que requiere la adición de funcionalidad adicional a un único bloque de código indivisible.

PRO:

  • Todo está en un solo lugar, y por lo tanto es fácil de encontrar
  • Puede ser más simple, dado que hay menos relaciones que considerar (también puede ser más complejo ver contras)

CONTRAS:

  • Con el tiempo a medida que se agrega la funcionalidad, la complejidad del sistema puede aumentar exponencialmente, hasta el punto de que las nuevas características son extremadamente difíciles o imposibles de implementar
  • Puede hacer que sea difícil para múltiples desarrolladores trabajar, por ejemplo, con Entity Framework. Los archivos EDMX tienen toda la base de datos en un único archivo, lo que puede ser extremadamente difícil para múltiples desarrolladores.
  • Reduce la reutilización, por definición, no tiene componentes más pequeños que luego pueden reutilizarse y reutilizarse para resolver otros problemas, a menos que se realice una copia completa del código y luego se modifique.