caso de una biblioteca de software matriz de tener una clase de raíz (por ejemplo, MatrixBase
) de la que más especializado (o más limitados) clases de matriz (por ejemplo, SparseMatrix
, UpperTriangluarMatrix
, etc.) derivar? En caso afirmativo, ¿deberían derivarse las clases derivadas públicamente/de forma protectora/privada? Si no, ¿deberían estar compuestos con una clase de implementación que encapsule la funcionalidad común y que de otro modo no esté relacionada? ¿Algo más?jerarquía de clases C++ Matrix
Estaba conversando sobre esto con un colega desarrollador de software (no soy per se) que mencionó que es un error común de diseño de programación derivar una clase más restringida de una más general (por ejemplo, utilizó el ejemplo de cómo no fue una buena idea derivar una clase Circle
de una clase Ellipse
como similar al problema de diseño de la matriz) incluso cuando es cierto que un SparseMatrix
"ES A" MatrixBase
. La interfaz presentada por las clases base y derivada debe ser la misma para las operaciones básicas; para operaciones especializadas, una clase derivada tendría funcionalidad adicional que podría no ser posible implementar para un objeto arbitrario MatrixBase
. Por ejemplo, podemos calcular la descomposición de Cholesky solo para un objeto de clase PositiveDefiniteMatrix
; sin embargo, la multiplicación por un escalar debería funcionar de la misma manera tanto para la base como para las clases derivadas. Además, incluso si la implementación de almacenamiento de datos subyacente difiere, el operator()(int,int)
debería funcionar como se espera para cualquier tipo de clase de matriz.
He comenzado a buscar en algunas bibliotecas de matriz de código abierto y parece que esto es una especie de mezcla (o tal vez estoy buscando en una mezcla de bibliotecas). Estoy planeando ayudar con una refacturación de una biblioteca matemática donde este ha sido un punto de discusión y me gustaría tener opiniones (a menos que realmente haya una respuesta correcta a esta pregunta) en cuanto a qué diseño la filosofía sería lo mejor y cuáles son los pros y los contras de cualquier enfoque razonable.
+1 para "Circle is-a Ellipse only when al observar". – avakar
¿Es esto un "voto" para usar datos inmutables? – bpw1621
Sí, prefiero datos inmutables, aunque sé que eso no es tan común en C++. – starblue