8

在处理需要相同变量实例的多个类时,创建一个中心类是一种好的编程实践吗?

chatWindow.variables.username = userField.getText();

例如:

  1. 我有一个带有一定数量变量的类
  2. 我有另一个需要相同变量的类
  3. 另一个需要与第一个相同的变量

所以我有三个类都使用相同的变量实例

我只使用第一个类(1)创建变量类实例

我通过类 (1) 使用类 (2)、(3) 访问这些变量

示例:(在 classTwo() 中):

classOne.variableClass.VariableName = false;

编辑:在基本形式中,我的问题是是否可以创建一个中央“变量类”并使用其他类通过主类访问它的相同实例。

我知道我的问题很难理解,但我确信还有另一种更简单的方法。我尝试通过第二类和第三类的构造函数传递第一类的相同实例,但我的解决方案似乎更简单。

4

5 回答 5

5

这闻起来像功能嫉妒……听起来你的模型有问题。

如果有一组变量需要在多个类中更改,它可能应该成为一个对象(甚至可能是一个实体)。但是您应该考虑,如果您需要在其他类中更改这些值,您可能需要在同一个类中放置一些逻辑(进行验证检查等)。

拥有一个额外的类来保存变量通常被认为是一种代码异味,称为贫血域。然而,有些情况确实需要它,无论如何这可能是一个品味问题。在这种情况下,你的类只不过是一个美化的结构。

于 2012-09-07T08:14:26.680 回答
4

最佳实践是使用依赖注入并传递您需要的所有资源,而不是让类找到它们想要的东西。

使用全局变量开始时比较简单,但是随着应用程序的增长以及您想要使用单元测试,这些是一个真正的痛苦,因为管理和维护这些变量变得更加困难。

于 2012-09-07T08:08:00.257 回答
1

这听起来不像你已经很好地隔离了你的班级。类可以修改其他类变量,但我会避免在一个地方存储可变变量。这使得事情看起来像全局变量,很难管理,最好避免。有关详细信息,请参见此处。还可以查看Dementer 法则,这有助于在您的程序中保持松散耦合。

于 2012-09-07T08:07:12.797 回答
1

每个问题都有自己的最佳折衷方案,你应该问自己一系列问题。(2) 和 (3) 是否只需要对 (1) 的准备访问,还是它们还需要写访问?

你实际上在做什么(从(1)创建(2)和(3)看起来不错,构建器模式,你创建了你永远不会直接访问的实例)

如果需要写访问权限,是否应 (2) 通知 (3) 所做的更改(反之亦然)?

一般来说,您应该尽可能多地限制“子类”的交互(最好尽量避免共享某些东西,当然如果可能的话,但通常是这样)所以从(1)内部访问它们似乎也比从 (2) 和 (3) 访问 (1)。

这种限制增加了代码的可维护性,并消除/减少了诸如值更改通知、谁拥有谁等问题。

基本上,如果用户只需要担心 (1) 并且所有其他事情都在内部处理,那么你已经做得很好了(Pimpl 成语对你什么都没说?)

您还可以将 (2) 和 (3) 像对 (1) 的扩展一样,因此完全像策略模式一样行事。其优点是,只有 (1) 需要担心距离,但如果将来您需要进一步扩展 (1) 您已经准备好策略,并且可以轻松更新。(我总是注意到,您可以编写的每个代码中总是存在多种模式)。

最后,你是唯一知道所有代码细节的人,总是问自己是否可以提高代码的可维护性、易读性等,在哪里需要升级等。

于 2012-09-07T08:23:14.400 回答
0

由于缺少示例,我不太确定您需要什么,但也许注册表模式就是您所需要的。

基本上,您创建一个静态“全局”类,它包含您在整个应用程序中需要的所有变量

public abstract final class VarRegistry {
    public static final String var1 = "val1";
    public static final int var2 = 2;
}

现在,在所有需要访问这些变量的类中,您可以轻松访问和修改它们:

VarRegistry.var1 = "test";

在开始编写代码之前请稍等片刻:不太建议使用这样的“全局”变量。它破坏了数据封装,因为您永远不知道这些变量何时以及由谁更改。

你最好重组你的程序以支持更安全的模式来正确地封装你的数据,例如依赖注入。

于 2012-09-07T08:07:52.640 回答