为什么我看到这么多没有状态的可实例化类?


18

我在C ++和Java世界中看到许多没有任何状态的可实例化类。

我真的不知道为什么人们这样做,他们只能在C ++中使用带有自由函数的名称空间,或者在Java中使用具有私有构造函数和仅静态方法的类。

我能想到的唯一好处是,如果您以后决定在某些情况下需要不同的实现,则不必更改大多数代码。但这不是过早设计的情况吗?当/如果合适的话,以后可以将其变成一堂课。

我搞错了吗?如果我不将所有内容都放入对象(即实例化类)中,这不是OOP吗?那么,为什么在C ++和Java的标准库中有如此多的实用程序名称空间和类?

更新: 在以前的工作中,我当然已经看过很多这样的例子,但是我一直在努力寻找开放源代码的例子,因此也许毕竟不是那么普遍。不过,我想知道人们为什么这么做,以及这种做法有多普遍。


2
不量化“如此普遍”就很难回答。我不能说我经常看到。考虑将Q更改为“没有ivars的类如何有用?”之类的东西。
Caleb 2012年

@Caleb我将在开源项目中查找示例。在我工作过的Java商店中,我肯定见过很多。
futlib 2012年

@futlib:是的,很常见。stackoverflow.com/questions/4692845/...
晃龙

您是否考虑仅包含例如的类。EntityManager不包含状态?
user470365

Answers:


22

我在C ++和Java世界中看到许多没有任何状态的可实例化类。

一些可能的原因来创建没有自已的类的类:

  • 状态是或可以包含在超类中。

  • 类实现一些接口,并且需要实例化,以便可以将实例传递给其他对象。

  • 类打算被子类化。

  • 分组相关功能的便捷方法。(是的,可能有更好的方法或不同的方法来做同样的事情。)

我搞错了吗?如果我不将所有内容都放入对象(即实例化类)中,这不是OOP吗?

OOP是一种范式,而不是自然法则。在某些语言中,所有事物都是对象,因此您别无选择。其他语言(例如C)根本不提供对OOP的任何支持,但是您仍然可以以面向对象的方式进行编程。我说你可以有OOP,如果你不这样做的一切在班......你可能会说,你只需要较少在这种情况下OOP。


4

Caleb和Robert Harvey已经指出了什么是实用程序类,以及拥有“无数据”类的一些合理原因。这些描述是现场介绍,但涉及积极方面。

我只想提一提,实用程序类的滥用肯定是一种OO反模式(请参阅c2wiki的说明)。这句话很好地总结了一下:

大量这样的类(尤其是那些只有一种方法的类)表明设计者正在颠倒思维,即。考虑对象可以完成的操作,而不是对象可以完成的操作。

如果您声称正在练习面向对象的设计,但是您的代码库几乎完全由实用程序类组成,那么我想您肯定做错了什么。话虽这么说,一种功能性方法具有许多优点,并且也可以很好地配合使用。只是不要声称自己遵循其中一个,而是全心全意地实施另一个。


2

Java和C ++中的实用程序类用于维护使用一个或多个输入参数并返回结果的方法库。如果只返回一个值,它们就不需要保持状态。在这方面,这些方法可以被视为函数式编程的一种粗略形式,具有所有优点(一方面,并​​发性没有问题)。

无论如何,这些类仅用于将相关方法组合在一个容器中,这些方法不需要实例化对象即可正常工作。此类的一个示例是包含SINE和COSINE(以及其他数学)函数的Math类。


2

这些类中有很多确实与数据进行交互,即使它们未明确包含数据也是如此,并且需要以需要同时激活多个实例的方式进行交互。例如,与数据库存储过程进行交互的无状态会话bean,将传入的数据传递给某些PL / SQL包,并将结果传递回调用应用程序。该事物需要存在于多个实例中,但它本身并不包含任何数据字段。


0

在类不是对象的面向对象的语言中,使用对象可以比类做更多的事情。

您可以将对象作为参数传递,可以替换类型兼容的对象,可以实现接口(我想有些语言中类是对象,但是您可以做某些事情,但是无论如何...) 。所有这些事情都非常重要,因此默认决策通常是使一个类可实例化。

对于某些类,似乎不太需要实例化授予的功能。例如,您可能不需要将Cosine的一种实现换成另一种实现。事实证明,大多数实用程序功能不需要这些功能,因此,大多数实用程序功能具有无法实例化的类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.