关于oop:面向对象的原则应该应用于过程语言吗?

Should object-oriented principles be applied in procedural languages?

我知道原则上可以将过程语言如C或MATLAB转换成面向对象的语言。这个问题在这里和这里都讨论得相当好。

我从这些讨论中发现的缺失和其中的参考是关于是否应该应用这些原则的论述。这样做有什么具体的好处吗?这显然是可能的,但这样做是明智的吗?在开放源码项目中,有没有这样的例子可以使这种做法具有明显的优势?

澄清

也许有一个例子是正确的。

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

1
building_model('train', ...) % ... stands for the data with which the model is trained

1
value = building_model('predict')

模型本身在building_model内用matlab持久变量实现。

我把building_model分解成两个功能,一个用于训练,一个用于预测。以前作为持久变量实现的模型现在被外部化了,可以说:

1
2
3
model = new_model()
model = model_train(model, ...)
prediction = model_predict(model)

粗略地说,这是我在matlab中模仿oop的一些特性所能做到的。我的构建模型模块现在的行为非常像一个类,有一个构造函数和两个方法model_trainmodel_predict。我已经实现了某种程度的封装(尽管没有什么可以阻止调用者篡改model的内部),原则上也可以适应多态性。另外,由于model_predict不返回model,因此可能不会更改model,所以我几乎可以免费获得命令/查询分离。

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

我可以想象在C中有一个类似的机制,在这里您将设计一些数据结构并编写函数,其第一个参数将是该数据结构的一个实例。

我想知道的是,我能把这种编程方式推进多远?这是一个普遍接受的模式吗(我说过这个词)?有什么性能问题我应该注意吗?


我认为这是一个很重要的讨论。我认为它是安全的说,这是面向对象的不总是最好的解决方案,在所有的语言。例如,在C++或Python的面向对象的冰,通常以自然的方式encapsulate数据。这些语言是在自行设计的两个重点班。在其他的语言中,它可能是更容易吗?质量创造良好的代码在其他的方式。

我想我是一个普通的口齿不清的好实例。它具有一个很好的面向对象系统(CLOS),我会说我真的很完整的冰。但我还是不习惯,OOP冰近多的普通AA或AA在Lisp,Python的C + +,因为它是一个便利的特征而不是东西,是要确保提供基本的软件工程的建筑块。

不管你要或不要使用面向对象的问题真的取决于你想练习。在一个实例中,可以认为贵的东西真的很有用的两个处理与面向对象的程序设计。


面向对象的冰滑的<<>>A /履约均值为软件工程目标的达成。

目的:放松的维护,可扩展性,组织源代码(搜索等)。 面向对象的构造:(只读方法encapsulation国有城市的数据类型的操作/结构可以对其数据)

能力目标:发展的新特点,没有修饰的代码重用现有的酮类化合物; 面向对象的构建:实施传承,polymorphism

目的:abstractions(你不需要提交两个或两个特殊类型的操作的实施没有变化,变化的客户) 面向对象的构造:传承的接口,接口,抽象类

《目标不需要justification。不管你想要/需要支持面向对象的语言(或不安的冰depend在你的特殊情况。如果你需要,你可以使用两个C静止mimic一些面向对象的构造和hopefully享受它的好处。

提醒你,有两个绝对可能的源代码(A bigg混乱与粘接两个好的面向对象的原则。

我在别人的酸性可以和其他战略目标(和新兴技术,在两个编辑stackoverflow posts表)