如果一个矩阵软件库有一个根类(例如,MatrixBase
),从该多个专门(或更受约束)矩阵的类(例如,SparseMatrix
,UpperTriangluarMatrix
等)推导出?如果是这样,派生类应该公开/保护性/私人性派生吗?如果不是,它们是否应该与封装了通用功能的实现类组合,否则无关联?还有别的吗?C++矩阵类层次结构
我和一位软件开发人员(我本人并不是这样)谈过这件事,他提到从一个更普通的类派生更受限制的类是一种常见的编程设计错误(例如,他使用了例如,如何从Ellipse
类中推导类似于矩阵设计问题的Circle
类并不是一个好主意的例子),即使它确实是一个“真实”“IS A”MatrixBase
。基本操作和派生类所呈现的接口对于基本操作应该是相同的;对于专门的操作,派生类将具有可能无法实现的任意MatrixBase
对象的附加功能。例如,我们可以只为PositiveDefiniteMatrix
类对象计算cholesky分解;然而,乘以标量应该对基类和派生类都以相同的方式工作。此外,即使底层数据存储实现不同,operator()(int,int)
应该可以像任何类型的矩阵类一样按预期工作。
我已经开始寻找一些开源矩阵库,看起来像这是一种混合包(或者我正在寻找一堆混合的库)。我计划帮助重构一个数学库,这是一个争论的焦点,我希望有意见(这是除非真的有客观的权利回答这个问题)关于什么设计哲学将是最好的,任何合理的方法有什么优点和缺点。
+1对于“仅当观察时圆是椭圆”。 – avakar 2010-05-03 16:15:48
这是使用不可变数据的“投票”吗? – bpw1621 2010-05-03 17:28:20
是的,我更喜欢不可变的数据,尽管我知道这在C++中并不常见。 – starblue 2010-05-03 20:32:42