1

我为一个进行电气计算的程序制作了 Swing 的“脸”。它看起来很棒,但我现在似乎面临着关于如何实现底层计算的一组令人眼花缭乱的选项。代码有点长,所以我将尝试笼统地描述。

我正在处理的面板计算电压降:

  1. 用户可以从一组两个单选按钮中进行选择,这些单选按钮选择计算公式的类型。
  2. 用户为 (7) 个不同的变量选择值,其中 (3) 个变量仅出现在公式的一种类型中。用户选择可编辑和不可编辑的组合框。
  3. 还有一个额外的 (4) 个变量,用户可以选择使用更多单选按钮来解决哪个变量。旁边还有一些额外的单选按钮可以更改变量的格式(即英尺、米)。
  4. 结果显示在文本字段中,并在用户更改值时更新。

我认为这不需要太多的处理能力,所以这一切都在事件调度线程中完成——很好,因为我对线程还不太了解。

以我对 Java 和编程的有限知识,我可以想到几种不同的方法来实现这个,可能还有一些我还不知道。即使是我所知道的那些对我来说仍然显得有点“朦胧”。

A. 使用事件监听器,当对面板进行任何合法更改时触发,并将所有变量作为字符串文字传递给一个整体逻辑类构造函数,该构造函数解析所有内容并计算结果并具有返回的方法结果。我猜它可能有不同的构造函数签名,可以帮助弄清楚要做什么。每次用户更改面板时,都会创建一个新对象来计算结果。这似乎很丑陋且难以使用。

B. “父工厂” - 除了将变量作为参数传递给抽象类中的方法外,它与 (A.) 几乎相同,该方法确定要做什么并创建其子类之一的实例。我认为,这至少会使应用程序逻辑的工作更容易一些。

C. 观察者和可观察者?我真的不太了解它是如何工作的。

D. 绑定?同样的事情-我对此还不太了解。

我还需要在不同的模块中将这种类型的计算串在一起。所以我想重用逻辑。

那么 - 我应该跳下哪个兔子洞?我不想把自己编码到一个角落里。

4

2 回答 2

0

创建单个支持对象并在数据更改时更新它(监听事件)。

然后从对象请求更改的计算(如果您计划允许在数据更改时通知多个源,则让 Swing 对象侦听“CalculationUpdate”事件)。

每次更改都构造一个新对象完全浪费内存——创建然后忽略对象是遇到 GC 问题的好方法。

于 2012-12-09T00:38:02.090 回答
0

通常,已发现将用户交互逻辑(看起来很好,与您已经描述的内容相对应)与“业务逻辑”(似乎是您所要求的)分开是有用的. 重要的是使它们彼此分开,而您似乎已经通过先编写其中一个来做到这一点。到现在为止还挺好。

我认为您不需要另一个答案所建议的“单一支持对象”,但我同意您的代码中需要一个“模型”。这可以是一个类或多个类;这里重要的是它们实现了您的逻辑,而不依赖于对用户的演示或与用户的交互。用户可以以任何方式提供数字并将它们传递给模型,模型将返回其答案,而模型之外的其他东西将决定如何呈现该答案。

例如,监听器是 Swing 应用程序的一部分(用户做某事并触发监听器方法):它们是用户交互的一部分。如果您以不同的方式获得问题的输入,则不会有这些侦听器,因此它们不是业务逻辑的一部分。

我还认为验证是您的用户交互代码的一部分,因为如果您更改某人输入数字的方式,那么验证会更改,而无需了解这些数字的使用方式。因此,在将数字输入模型进行计算之前,我会验证用户的输入;我会记录下该代码的输入应该已经过验证,以防以后没有意识到的人再次使用它们。

因此,当有人更改值时,我希望会触发一个侦听器(或类似的侦听器)来验证输入并在存在无效数据时为用户生成消息;如果输入有效,我希望它调用一个方法来进行计算并返回值,然后该侦听器(或 SwingWorker 线程的侦听器,如果您不知道,请查看它)进行更新屏幕上的结果(也应该只在用户交互逻辑中完成。

您提到传递字符串;在验证之后,我还将对用户交互代码进行编程,以将字符串值转换为应该表示数字的数字。它们是输入字符串这一事实是用户如何与您的代码交互的一部分,而不是业务逻辑的一部分。如果一个从其他地方获取数字的程序想要使用您的计算模型,那么如果仅仅因为您的模型习惯于在这种情况下从用户那里获取字符串,它就必须将其数字转换为字符串,那将是一件很奇怪和愚蠢的事情。

我希望这会有所帮助。

于 2012-12-09T03:38:57.410 回答