为什么使用类而不是函数?

时间:2011-06-25 21:34:28

标签: oop class function

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

7 个答案:

答案 0 :(得分:12)

OOP的重点不是“在一个类中对类似的函数进行分组”。如果这就是你所做的一切,那么你就不会做OOP(尽管使用的是OO语言)。使用类而不是一堆函数会产生“变量和函数范围”的副作用,但我认为它只是副作用。

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

答案 1 :(得分:12)

  

简单的非OOP程序可能是一个   很长的命令列表。更复杂   程序将分组命令列表   分别为函数或子程序   这可能会执行特定的任务。   有了这种设计,它就是   该程序的数据通用   可从任何部分访问   程序。随着程序规模的扩大,   允许任何函数修改任何   数据意味着错误可以有   影响深远。

     相比之下,面向对象   方法鼓励程序员   将数据放在不直接的地方   可以通过该计划的其余部分访问。   而是通过访问数据   调用特别编写的函数,   通常称为方法,即   要么捆绑在数据中,要么捆绑在一起   继承自“类对象”并采取行动   作为检索的中介   或修改这些数据。该   结合的编程结构   数据与一组方法   访问和管理这些数据是   称为对象。

OOP编程的优点:

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

答案 2 :(得分:5)

主要原因是您可以更紧密地将行为与数据相关联。

请考虑以下事项:

class CoffeePot {

    private float waterOunces;
    private float coffeeOunces;
    private int scoopsOfCoffee;
    private boolean filterClean;

    void make() {
        coffeeOunces += waterOunces;
        waterOunces = 0;
        filterClean = false;
    }

    void fill(int water) {
        waterOunces += water;
    }

}

现在你可以拥有一个CoffeePot对象并随心所欲地做任何事情。传递它,扩展它的行为,任何东西。行为保持在对象内。你无法做任何事情。

class MagicCoffeePot extends CoffeePot {

   @Override
   void make() {
       // magic coffee pot makes MORE coffee
       coffeeOunces += waterOunces;
       super.make();
   }

}

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

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

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

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

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

答案 5 :(得分:0)

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

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

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

如果您是数学家,功能风格可能更直观,ML,F#。如果您以可预测的格式与数据交互,则声明式样式将更像SQL或LINQ。

答案 6 :(得分:0)

简单来说,在我看来,(除了所有人都说的话),班级最适合大型项目,特别是那些由多个程序员实施以便于保持整洁的项目;因为在这种情况下使用函数会变得相当麻烦。

否则,对于你自己实现这样或那样的简单程序/项目,那么函数就可以很好地完成。