我知道原则上可以将C或MATLAB等过程语言转换为面向对象的语言。这个问题已得到很好的讨论here和here。
我发现这些讨论中缺少的内容及其中的参考资料是对是否应用此类原则的说明。这样做有什么具体的东西可以获得吗?它显然是可能的,但是否可取这样做?开源项目中是否有任何一个例子,这种做法带来了明显的优势?
澄清
也许一个例子是有序的。
我继承了一些实现一些机器学习算法的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_train
和model_predict
。我已经实现了一定程度的封装(虽然没有什么能阻止调用者摆弄model
的内部),原则上也可以容纳多态。作为额外的奖励,我几乎免费获得命令/查询分离,因为model_predict
不返回model
,因此可能不会改变model
。
(精明的读者会指出MATLAB已经有一个面向对象的系统。由于各种原因,包括性能和与旧版本的兼容性,我不能使用它。)
我可以想象在C中有一个类似的机制,你可以在其中设计一些数据结构和编写函数,其第一个参数将是该数据结构的一个实例。
我想知道的是,我可以在多大程度上推动这种编程方式?这是一种普遍接受的模式(在那里,我说过这个词)?我应该注意哪些性能问题?
答案 0 :(得分:2)
我认为这是一次非常重要的讨论。我认为可以肯定地说,OOP并不总是所有语言中的最佳解决方案。在例如在C ++或Python中,OOP通常是自然的方式,例如封装数据。这些语言旨在专注于课程。在其他语言中,以其他方式创建高质量的代码可能更容易。
我认为Common Lisp就是一个很好的例子。它有一个非常好的OOP系统(CLOS),我想说它真的很完整。但是,在Common Lisp中,OOP并没有像在Python或C ++中那样使用,因为它是一个方便的功能,而不是提供基本软件工程构建块所需的东西。
您是否应该使用OOP实际上取决于您尝试解决的问题。举一个例子,我认为GUI内容对于解决OOP非常有用。
答案 1 :(得分:-1)
面向对象 是实现软件工程目标的一种方法。
目标:易于维护,可扩展性,有组织的源代码(可搜索性等)
OO构造:封装(只有'数据类型/结构'拥有的方法才能对其数据进行操作)
目标:能够在不修改现有功能的情况下开发新功能,代码重用
OO构造:实现继承,多态性
目标:抽象(您不必承诺特定类型或操作,更改实施而不更改客户端)
OO构造:接口继承,接口,抽象类
目标不需要理由。您是否需要/需要OO语言的支持取决于您的具体情况。如果你需要使用C,你仍然可以模仿一些OO结构,并希望享受它的好处。
请注意,绝对有可能在遵守所有OO原则的情况下开发大量代码。
我确信其他人可以列出其他目标和示例(并知道如何在stackoverflow帖子中编辑表格)