据我所知,尽管花费了数百万或数十亿美元用于OOP教育,语言和工具,但OOP并未提高开发人员的工作效率或软件可靠性,也没有降低开发成本.很少有人在任何严格的意义上使用OOP(很少有人坚持或理解LSP等原则); 人们对问题域建模所采用的方法几乎没有统一性或一致性.这个课程常常仅用于语法糖; 它将记录类型的函数放入它们自己的小命名空间中.
我为各种各样的应用程序编写了大量代码.虽然有些地方真正的可替代子类型在应用程序中发挥了重要作用,但这些都非常特殊.总的来说,虽然谈到"重复使用"的口号很多,但实际情况是,除非一段代码完全符合您的要求,否则几乎没有成本效益的"重复使用".设计类以正确的方式扩展是非常困难的,因此扩展的成本通常很高,以至于"重用"根本就不值得.
在许多方面,这并不让我感到惊讶.现实世界是不是"OO",这种想法在OO隐含的 - 我们可以用一些类分类模型的事情 - 在我看来非常根本性的缺陷(我可以坐在桌子上,一个树桩,一个车盖某人的膝盖 - 但不是其中一个 - 一把椅子).即使我们转向更抽象的领域,OO建模通常也很困难,违反直觉,最终无益(考虑圆/椭圆或正方形/矩形的经典例子).
那我在这里错过了什么?哪里是OOP的价值,为什么所有的时间和金钱,没有作出任何软件好?
根据这篇论文,差异化对数据结构起作用.
根据这个答案:
区分,数据类型D的导数(给定为D')是具有单个"洞"的D结构的类型,即,不包含任何数据的区别位置.这令人惊讶地满足了与微积分差异相同的规则.
规则是:
1 = 0
X? = 1
(F + G)? = F' + G?
(F • G)? = F • G? + F? • G
(F ? G)? = (F? ? G) • G?
Run Code Online (Sandbox Code Playgroud)
参考文章对我来说有点过于复杂以获得直觉.这在实践中意味着什么?一个具体的例子太棒了.
这两个概念都允许创建新的数据类型.我能看到的唯一区别是,在函数式语言中,可以对代数数据类型执行模式匹配.但OO语言没有类似的简洁功能.这是一个准确的陈述吗?