【问题标题】:Why use classes instead of functions? [closed]为什么使用类而不是函数? [关闭]
【发布时间】:2011-09-22 18:24:15
【问题描述】:

我确实知道类的一些优点,例如变量和函数作用域,但除此之外,对我来说,拥有一组函数而不是拥有许多类的实例和抽象似乎更容易。那么为什么在一个类中将相似的函数分组是“规范”呢?

【问题讨论】:

  • 如果它是一组函数,那你就错了(tm)。
  • OO 是关于将 DATA 与操纵该数据的 FUNCTIONS 分组并隐藏 HOW 它操纵它,以便您可以通过 MODIFY 进行行为 INHERITANCE
  • @Jarrod 我认为虽然信息隐藏可能有助于保护您希望扩展的类的完整性,但这绝不是扩展的先决条件。如果他们愿意,可以扩展一个只包含公共字段的类。该行为将以与具有隐藏字段的类相同的方式扩展,并且将应用相同的好处。也就是说,由于基类中不存在公共字段,扩展类中不存在缺陷。请注意,这并不是说我不强烈支持这两个原则,因为我支持。

标签: oop class function


【解决方案1】:

OOP 的重点不是“将相似的函数分组到一个类中”。如果这就是你所做的一切,那么你就没有在做 OOP(尽管使用了 OO 语言)。拥有类而不是一堆函数具有您提到的“变量和函数范围”的副作用,但我认为它只是一种副作用。

OOP 是关于封装、继承、多态、抽象和许多其他概念的。它是一种特定的软件设计方式,一种将问题映射到软件解决方案的特定方式。

【讨论】:

    【解决方案2】:

    这不是常态,这只是一种方式。类根据封装的概念将方法(函数)和数据组合在一起。

    对于较大的项目,以这种方式对事物进行分组通常会变得更容易。许多人发现用对象来概念化问题更容易。

    【讨论】:

    • OOP 的重点不是对函数进行分组。 OOP 实际上是关于封装、继承和多态性。
    【解决方案3】:

    简单的非 OOP 程序可能是其中之一 长长的命令列表。更复杂 程序将对命令列表进行分组 到每个函数或子程序中 它可能执行特定任务。 有了这样的设计, 程序的数据是通用的 可从任何部分访问 程序。随着程序规模的扩大, 允许任何功能修改任何 一条数据意味着错误可能有 影响广泛。

    相反,面向对象 方法鼓励程序员 将数据放在不直接的地方 程序的其余部分可以访问。 相反,数据由 调用专门编写的函数, 通常称为方法,它们是 与数据捆绑在一起或 从“类对象”继承并采取行动 作为检索的中介 或修改这些数据。这 结合的编程结构 具有一组方法的数据 访问和管理这些数据是 称为对象。

    OOP 编程的优点:

    • 可维护性 面向对象的编程方法使代码更易于维护。由于对象是自包含的,因此更容易识别错误来源。
    • 可重用性 因为对象包含数据和作用于数据的方法,所以可以将对象视为自包含的黑盒子。此功能使在新系统中重用代码变得容易。消息为对象的数据和功能提供了预定义的接口。使用此接口,可以在任何上下文中使用对象。
    • 可伸缩性 面向对象的程序也是可伸缩的。作为对象的接口提供了在新软件中重用对象的路线图,并提供了在不影响其他代码的情况下替换对象所需的所有信息。这样,老化的代码就可以被更快的算法和更新的技术所取代。

    【讨论】:

      【解决方案4】:

      使用类有很多原因,其中最重要的是逻辑封装。对象更接近我们生活的世界,因此通常比其他方法更直观。考虑一辆汽车,汽车具有车身颜色、内饰颜色、发动机马力、功能、当前里程等属性。它还具有 Start ()、TurnRight(.30)、ApplyBrakes(.50) 等方法。当您用点火钥匙打开车门时,它会发生叮当声等事件。

      可能最大的原因是现在大多数应用程序似乎都有一个图形组件,并且大多数图形用户界面库都是用对象模型实现的。

      多态性可能也是一个重要原因。通用处理多种类型对象的能力非常有帮助。

      如果你是数学家,函数式风格可能更直观,ML,F#。如果您以可预测的格式与数据进行交互,则声明式样式会更好,例如 SQL 或 LINQ。

      【讨论】:

        【解决方案5】:

        简单来说,在我看来(除了大家所说的)类最适合大型项目,尤其是那些由多个程序员实现以方便保持整洁的项目;因为在这种情况下使用函数会变得相当麻烦。

        否则,对于您自己实现的简单程序/项目来做一件事或另一件事,那么函数会做得很好。

        【讨论】:

          【解决方案6】:

          在一个类中对函数进行分组绝不是常态。让我分享一些我通过不同语言和范式的实验学到的东西。

          我认为这里的核心概念是命名空间。命名空间非常有用,几乎可以在任何编程语言中使用。

          命名空间可以帮助您克服一些常见问题,并对许多领域中出现的各种模式进行建模,例如,避免名称冲突、隐藏细节、表示层次结构、定义访问控制、对相关符号(函数或数据)进行分组、定义上下文或范围......我相信还有更多的应用程序。

          类是命名空间的一种类型,类的特定属性因语言而异,有时也因同一语言的版本而异,例如,有些提供访问修饰符,有些则不提供;有些允许从多个类继承,有些则不允许。人们一直在努力寻找最有用的神奇功能组合,这在一定程度上解释了不同编程语言中的大量可用选项。

          那么,为什么要使用类,因为它们以一种看似自然或直观的方式帮助解决某些类型的问题。每次我们编写计算机程序时,我们都试图抓住问题的本质,如果问题可以通过使用上面提到的一些模式来建模,那么使用语言的那些特性来帮助你做到这一点是非常有意义的.

          随着问题变得更好理解,您可能会意识到程序的某些部分可以通过使用不同的范例/功能/模式来更好地实现,然后是重构的时候了。我有机会从事的大多数程序都在不断发展,直到资金/资源用完或当我们到达收益递减的地步时,很多时候您现在有足够好的东西,并且没有动力继续工作.

          【讨论】:

            猜你喜欢
            • 2019-07-09
            • 2015-06-03
            • 2015-04-26
            • 2011-07-08
            • 1970-01-01
            • 2013-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多