面向对象的原则应该应用于程序语言吗?

lin*_*lof 6 language-agnostic oop paradigms design-patterns design-principles

我知道原则上可以将C或MATLAB等过程语言转换为面向对象的语言.这个问题在这里这里都得到了很好的讨论.

我在这些讨论及其中的参考文献中找不到的是对是否应该应用这些原则的说明.这样做有什么具体的东西可以获得吗?这显然是可能的,但建议这样做吗?开源项目中是否有任何例子,这种做法带来了明显的优势?

澄清

也许一个例子是有序的.

我继承了一些实现一些机器学习算法的MATLAB代码.building_model根据传递的标志,基本上只有一个函数可以训练模型或使用它来预测未来值:

building_model('train', ...) % ... stands for the data with which the model is trained
Run Code Online (Sandbox Code Playgroud)

value = building_model('predict')
Run Code Online (Sandbox Code Playgroud)

模型本身是用MATLAB持久变量实现的building_model.

我已经building_model分成两个功能,一个用于训练,一个用于预测.以前用作持久变量的模型现在被外部化了,可以这么说:

model = new_model()
model = model_train(model, ...)
prediction = model_predict(model)
Run Code Online (Sandbox Code Playgroud)

粗略地说,就我可以在MATLAB中管理模拟OOP的某些功能而言.我的建筑模型模块现任很像一类,有一个构造函数和两个方法model_trainmodel_predict.我已经实现了一定程度的封装(虽然没有什么可以阻止调用者摆弄内部的内容model),并且原则上也可以容纳多态性.作为额外的奖励,我几乎免费获得命令/查询分离,因为model_predict不返回model,因此可能不会改变model.

(精明的读者会指出MATLAB已经有一个面向对象的系统.由于各种原因,包括性能和与旧版本的兼容性,我不能使用它.)

我可以想象在C中有一个类似的机制,你可以设计一些数据结构和编写函数,其第一个参数是该数据结构的一个实例.

我想知道的是,我可以在多大程度上推动这种编程方式?这是一种普遍接受的模式(在那里,我说过这个词)?我应该注意哪些性能问题?

Joh*_*ski 2

我认为这是一个非常重要的讨论。我认为可以肯定地说,OOP 并不总是所有语言中的最佳解决方案。例如,在 C++ 或 Python 中,OOP 通常是封装数据等的自然方式。这些语言旨在专注于课堂。在其他语言中,通过其他方式创建高质量的代码可能会更容易。

我认为 Common Lisp 就是一个很好的例子。它有一个非常好的 OOP 系统(CLOS),我想说它非常完整。但是,OOP 在 Common Lisp 中的使用并不像在 Python 或 C++ 中那样频繁,因为它是一种便利功能,而不是提供基本软件工程构建块所需的功能。

是否应该使用 OOP 实际上取决于您要解决的问题。举个例子,我认为 GUI 的东西对于使用 OOP 来解决非常有用。