可能是重复问题:
设计模式真的是语言弱点吗?
在花费多年时间阅读面向对象编程(OOP)的书籍和技术,并且最近越来越涉足函数式编程风格后,是否可以推断出设计模式是指向OOP整体存在系统性问题的指针。在面向对象编程(不要与设计混淆)的处理状态时,封装的方法导致了越来越多的模式来解决这种范例所带来的问题,这是一种根本性的缺陷吗?
我还没有得出任何结论,但我的“直觉”是OOP范例可能存在更加严重的问题。
封装的概念是否会引起比解决更多的问题。
可能是重复问题:
设计模式真的是语言弱点吗?
在花费多年时间阅读面向对象编程(OOP)的书籍和技术,并且最近越来越涉足函数式编程风格后,是否可以推断出设计模式是指向OOP整体存在系统性问题的指针。在面向对象编程(不要与设计混淆)的处理状态时,封装的方法导致了越来越多的模式来解决这种范例所带来的问题,这是一种根本性的缺陷吗?
我还没有得出任何结论,但我的“直觉”是OOP范例可能存在更加严重的问题。
封装的概念是否会引起比解决更多的问题。
好问题,我几周前开始对此产生了疑问,当时我更深入地学习Python和Scala。
我认为是和不是。面向对象编程(OOP)和状态封装确实存在一些内在问题,但这并不意味着OOP本身是一种不好的做事方式。我认为问题在于,当你手中只有一把锤子时,所有东西都变成了钉子。OOP非常适合某些事情,首先想到的是GUI,但函数式编程也有非常明显的优点。
值得注意的是,像Scala这样的新型函数式编程语言并没有放弃对象。
我没有深入思考这个问题,但我肯定同意OOP存在一些问题,除了设计模式之外,我还没有看到其他解决方法,而设计模式实际上是在解决症状而不是疾病。
不是的。虽然你会看到略有不同的设计模式,但在函数式代码中仍然可以看到设计模式。基本区别与缺乏状态无关,而主要源于(大多数)函数式语言在创建函数方面提供了足够的灵活性,因此在其他语言中可能成为“设计模式”的东西在函数式语言中只是一个函数。
如果您在具有状态的语言中提供了(大致)相似的灵活性,则可以获得相同的效果。例如,现代C++设计的大部分介绍都在捍卫一种观点,即设计模式可以编码为模板(该书的大部分内容都是实现为模板的设计模式)。
我在重复我的一个基本理论,即模型只是模型。面向对象编程(OOP)定义的模型是一种非常有效的程序结构方式,并且对于许多应用程序编程领域来说,它完全合适。对于某些问题领域,该模型可能会变得越来越不有效(或者效率较低,或者两者都有)。
物理学存在一个潜在的比喻。许多年来,牛顿力学在模拟运动、时间和空间定律方面做了(实际上仍然在做)出色的工作(在欧几里得几何和球面几何的帮助下)。但当科学开始探索问题领域的微观和宏观方面时,牛顿力学(以及欧几里得/球面几何学)开始崩溃。因此,我们现在有了相对论和量子力学。它们分别可以很好地模拟宏观和微观水平上的宇宙,但对于日常人类规模的事件描述来说过于复杂。
在很多情况下,面向对象编程非常有效,特别是考虑到建模现实世界问题和人类交互以被线性机器消费和处理所涉及的复杂性时。正如某些人观察到的那样,没有银弹。我的印象(从未使用过C++)是,试图成为多范式的语言也会变得更加复杂,并且不一定对更容易使用高级、更有针对性的语言处理的小问题更有效。就像量子力学和/或相对论理论一样(我是说,真的吗,在高速公路上以60英里每小时的速度行驶时,有人关心质量和速度之间的关系吗?或者洛杉矶在你到达时是否在预期位置上的概率?)。