【问题标题】:What is the best Pro OOP argument? [closed]最好的 Pro OOP 论点是什么? [关闭]
【发布时间】:2010-02-25 15:50:57
【问题描述】:

我正在尝试让几个团队成员了解 OOP 思维方式,他们目前考虑的是过程式编程。

但是,我很难说出“为什么”这一切都很好,以及“为什么”他们应该希望从中受益。

他们使用的语言与我不同,而我缺乏沟通技巧来向他们解释这一点,从而使他们“想要”学习 OOP 的做事方式。

有哪些优秀的独立于语言的书籍、文章或任何人都可以给出或指出的论点?

【问题讨论】:

  • 我认为这个讨论是在大约 15 年前发生的。
  • @Roman:我会把它放在 25 年前 C++ 出来的时候。
  • 这些家伙使用什么语言,TurboBasic?现在是 2010 年,此时 OOP 已经相当成熟。
  • 什么? Turbo Basic 有一个新的 OO 版本??我必须拥有它!
  • @soulmerge:它被巧妙地重命名为“VB.Net”。

标签: language-agnostic oop


【解决方案1】:

OOP 非常适合多开发人员团队,因为它可以轻松实现抽象、封装、继承和多态性。这些是 OOP 的热门词汇,它们是有充分理由的热门词汇。

抽象:允许您团队的其他成员使用您编写的代码,而无需了解实现细节。这减少了必要的通信量。想想神话人物月,其中详细说明了沟通是开发团队面临的最高成本之一。

封装:允许您在不影响代码用户的情况下更改实现细节。因此,它降低了代码维护成本。

继承:允许您的团队以更低的成本重用和扩展您的实现。

多态性:允许您的团队使用给定抽象的不同实现。如果您的团队正在编写代码来读取和解析来自 Stream 的数据,那么由于多态性,它现在可以与 FileStreams、MemoryStreams 和 PigeonStreams 无缝协作,而且成本显着降低。

OOP 不是圣杯。这对某些团队来说是不合适的,因为使用它的成本可能高于不使用它的成本。例如,如果您尝试为多态性进行设计,但从未有过给定抽象的多个实现,那么您可能会增加成本。

【讨论】:

  • +1 这是我一直在寻找的回复
  • 好答案。评论:抽象和封装一起工作,目标是接口和实现的分离。一种扩展是通过合同将接口与设计形式化。
【解决方案2】:

总是举例。

取一些你认为不好的代码。重新编写它会更好。解释为什么它更好。你的同事要么同意,要么不同意。

没有人使用(或应该使用)技术,因为它们是好的技术,他们(应该)使用它们是因为它们产生了好的结果。非常简单地使用类和对象的优点通常很容易看出,例如,当您有一个具有n 属性的对象数组而不是n 数组时,您关心的每个字段都有一个,等等。

【讨论】:

    【解决方案3】:

    将程序与 OOP 相比,迄今为止最大的赢家是封装。 OOP 并不是说​​你会自动得到封装,但与过程式代码相比,这样做的过程是免费的。

    【讨论】:

    • +1 封装是面向对象编程的灰姑娘——漂亮,但经常被忽略。我会继续称继承为邪恶的继母。
    • @MusiGenesis,是的,多态性和多重继承呢?
    • @Earlz:当然是邪恶的继姐妹(虽然我不确定她们是否像他们的母亲一样正式“邪恶”)。
    【解决方案4】:

    抽象有助于管理应用程序的复杂性:只公开所需的信息。

    有很多方法可以解决这个问题:OOP 并不是推广这一策略的唯一学科。

    当然,并不是因为声称要做OOP,所以构建一个没有大量“抽象泄漏”的应用程序从而打败了策略......

    【讨论】:

      【解决方案5】:

      我有点奇怪的想法。我不知道,但可能存在一些不需要 OOP 甚至不好的领域(恕我直言:javascript 编程)。

      您和您的团队可能在这些领域之一工作。在其他情况下,由于使用 oop 的团队以及它的所有好处(如不同的框架、UML 等),你在多年前就失败了,它们只会更有效地完成他们的工作。

      我的意思是,如果你在没有 oop 的情况下仍然工作得很好,那么也许,就离开它吧。

      【讨论】:

      • 如果您认为 javascript 中的 OOP 是不必要的,甚至是不好的,那么您显然没有尝试过 jQuery。我会鼓励你善待自己。 :]
      • 我使用 jQuery 并在那里发现了很多函数式编程特性。我不知道它是如何提供 OOP 的,但我听说 ExtJS 有一些很好的 OOP 支持。但是现在我真的没有用Ext了。
      【解决方案6】:

      杀手锏:使用 OOP,您可以“按原样”建模世界*咳嗽*。

      【讨论】:

      • 这就是我使用的原因。世界就是这样运作的。世界不是一系列管子
      • 我一直认为世界是程序化的。我一次只能做一件事。
      • 很难说这个世界是什么样的。如果你连世界是怎样的都不能定义,那你怎么能说你可以建模呢?
      • 最后我*咳嗽* - 你没听到吗? :D
      • 不,我们不会照原样模拟世界。我们对世界的抽象建模。此外,OOP 并不是生成世界抽象模型所必需的。
      【解决方案7】:

      在我开发连接到两个不同数据库的应用程序之前,OOP 对我没有意义。对于两个数据库,我都需要一个名为 getEmployeeName() 的函数。我决定为每个数据库创建两个对象,以封装针对每个对象运行的函数(没有同时针对两个对象运行的函数)。不是 OOP 的缩影,但对我来说是一个好的开始。

      我的大部分代码仍然是程序性的,但我更清楚对象在我的代码中有意义的情况。我不认为一切都需要以一种方式或另一种方式。

      【讨论】:

        【解决方案8】:

        通过层次结构重用现有代码。

        【讨论】:

          【解决方案9】:

          杀手论点是恕我直言,重新设计代码所需的时间要少得多。这是similar question explaining why

          【讨论】:

            【解决方案10】:

            具有传递整个对象的能力,该对象具有一堆可以使用该对象调用的方法/函数。例如,假设您想要传递一条消息,您只需要传递一个对象,并且获得该对象的每个人都可以访问它的所有功能。

            此外,您可以将一些对象的函数声明为公共的,而将一些对象的函数声明为私有的。还有友元函数的概念,其中只有通过 OO 层次结构相关的对象才能访问其友元的函数。

            对象有助于将函数保持在它们使用的数据附近,并将其全部封装到一个可以轻松传递的实体中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-26
              • 1970-01-01
              • 2010-10-04
              • 2011-05-04
              • 2010-09-13
              • 2010-09-15
              • 2011-06-29
              • 2011-04-07
              相关资源
              最近更新 更多