【问题标题】:Should object-oriented principles be applied in procedural languages?面向对象的原则应该应用在过程语言中吗?
【发布时间】:2011-01-21 13:49:24
【问题描述】:

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

我在这些讨论和其中的参考资料中发现缺失的是关于是否应该应用这些原则的阐述。这样做有什么具体的收获吗?这显然是可能,但这样做是否可取?在开源项目中是否有任何例子表明这种做法带来了明显的优势?

澄清

也许可以举个例子。

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

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

value = building_model('predict')

模型本身是使用 building_model 中的 MATLAB 持久变量实现的。

我将building_model 拆分为两个函数,一个用于训练,一个用于预测。过去作为持久变量实现的模型现在被外部化了,可以这么说:

model = new_model()
model = model_train(model, ...)
prediction = model_predict(model)

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

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

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

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

【问题讨论】:

  • 一般来说,这是关于面向对象实践的讨论中经常缺少的东西。您仍然必须决定 OOP 是否是正确的设计,无论它是内置在语言中还是只是您尝试采用的一种设计方法,而无需语言的任何帮助。相同的优点(和缺点)适用于任何一种方式。

标签: oop design-patterns language-agnostic paradigms design-principles


【解决方案1】:

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

我认为 Common Lisp 是一个很好的例子。它有一个非常好的 OOP 系统 (CLOS),我会说它非常完整。但是,在 Common Lisp 中 OOP 的使用仍不如在 Python 或 C++ 中那么多,因为它是一种方便的功能,而不是提供基本软件工程构建块所需的东西。

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

【讨论】:

  • +1 “我认为 GUI 的东西对于使用 OOP 处理非常有用。”。这就是 Stroustrup 博士向他的学生介绍 OOP 的方式。
【解决方案2】:

面向对象是实现软件工程目标的一种手段。

目标:易于维护、可扩展性、有组织的源代码(可搜索性等)
OO 构造:封装(只有“数据类型/结构”拥有的方法才能对其数据进行操作)

目标:能够在不修改现有功能的情况下开发新功能,代码重用
OO构造:实现继承、多态

目标:抽象(您不必提交特定类型或操作,在不更改客户端的情况下更改实现)
OO构造:接口继承、接口、抽象类

目标不需要理由。您是否需要/是否需要 OO 语言的支持取决于您的具体情况。如果您需要使用 C,您仍然可以模仿一些 OO 结构,并希望享受它的好处。

请注意,完全有可能在遵守所有 OO 原则的情况下开发出一大堆代码。

我相信其他人可以列出其他目标和示例(并且知道如何在 stackoverflow 帖子中编辑表格)

【讨论】:

  • 我真的不同意OO是实现上述目标的手段。在 OO 发明之前,这一切都是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多