我的项目可以在没有面向对象的情况下生存吗?

计算科学 matlab
2021-12-21 07:42:28

我正在编写一个小的 MATLAB 包,它将解决某些类数值问题。该算法有 3 个阶段,每个阶段用户有 5 个选择。我已经使用20函数和 3 个开关案例(每个算法阶段一个)。它工作得很好,但我正在考虑让它做更多的事情(超过 5 个选择和一个阶段)并且还做一个 Python 端口(有些人感兴趣)。

我想知道我是否应该转换为 OOP 框架(我根本不擅长),或者我是否应该坚持我拥有的程序框架(我擅长)。我在我的程序代码中确保没有函数做两件事并且重叠最小(2 个代码段几乎从不做同样的事情)。

如果您觉得它更适合他们的域,请将其迁移到 SO。

3个回答

无需转换为 OOP 框架,即可从面向对象的帮助中受益。请注意,与这些函数内部和之间的代码重复或这些函数的长度相比,函数的数量并不是一个指标。(具有超过 100 行代码的函数将是“改进潜力”的典型指示。)

如果您无法发现面向对象会有所帮助的部分,那么转换为 OOP 框架并不是最好的第一步。而是询问熟悉面向对象的人可以简化或改进什么,然后尝试理解为什么它是简化或改进。

如果您想使用像 deal.II 或 PETSc 这样的框架,请在它们提供的功能对您有用的情况下使用它们,而不是因为您认为它会使您自己的代码更好或更易于维护。但是您已经在 MATLAB 框架内,因此您不太可能想要更改为 C++ OOP 框架。(MATLAB 提供完整的 OOP 支持,您可能已经知道了。)

对于 Python 端口,只需根据您当前的知识开始,然后在您学到足够的知识以使其显着更好之后再开始。

这个问题可能很适合 Stack Overflow。我认为它在这里也很合适,因为它是计算科学中的一个常见问题。

在编写算法方面,一个很好的库例子就是 PETSc,如果你能阅读 C 代码的话。面向对象的编程风格可能有助于封装数据,但作为简单的第一步,您可能只想让阶段的每个选择都成为具有通用接口的函数。然后,对于您的算法,为每个阶段传入一个函数作为输入,并让主算法为每个阶段调用该函数。

并非所有事物都可以通过对象很好地建模。考虑1+1,通常 OO 系统会将1s 视为对象,将 s 视为+方法,1.plus(1)但这不符合我们对1+1作为二进制中缀函数plus(1,1)1它在第一个作为为其定义方法的对象和第二个作为该方法的参数之间引入了一种不自然的不对称性plus(这会产生像Python 中的__plus__和那样的混乱)。__rplus__

所以不要觉得你需要将方形钉子强行插入圆孔,如果你的算法在简单的程序方式中看起来不错,那么就保持这样。如果需要将其包含在 OO 系统中,您始终可以在非 OO 代码上放置 OO 接口。C++ 编码人员每天都这样做(甚至获得报酬)。