1

我有这段代码(你可能会忽略它是 Swing 代码),但我的构造函数中通常会出现太多参数。我应该使用模型 bean 类,然后在构造函数中传递该对象吗?

public BrowserFrame(final JTextField url, final JTextArea response, final JTextField command, final JButton actionButton) {

    this.urlField = url;
    this.responseArea = response;
    this.commandField = command;
    this.actionButton = actionButton;

}     

在这段代码中,我正在考虑添加更多由此类使用的对象。我是否继续添加更多参数并将它们传递给构造函数。可能使用设置注入?

但根据米斯科的说法,这也是代码异味。

http://misko.hevery.com/code-reviewers-guide/

“对象被传入但从未直接使用(仅用于访问其他对象)”

4

6 回答 6

2

在你的构造函数中有太多的参数表明你的类有太多的责任。如果您只是在构造函数中设置字段,请查看其中一些字段是否仅由类中的部分方法使用。这表明您的论点和方法可以拆分为更小的类,并具有更集中的责任。

于 2009-12-18T16:08:41.617 回答
0

我不认为我们应该忽略这是摆动代码。GUI 以有组织的方式聚合多个不同的对象。如果您发现自己支持多个构造函数,我建议您认真考虑重构,因为理解什么是必要的和不必要的会非常混乱。但是,如果您将七个组件放入某个组织模板中,那么如果每个参数的作用是明确的,那么在构造函数中完成这一切并不一定是一个坏主意。

如果问题是“这门课有太多顾虑吗?” 不要再问“一个班级有太多担忧的迹象是什么?” 为什么不问“这个班级的关注点是什么?” 如果答案很简单,例如“它将多个表单元素组织到一个视图中”,这是我(以及浏览您的代码的其他方)在逻辑上所假设的,那么就不要再担心像构造函数这样的修饰了。在这种情况下很明显。添加更多类只会混淆它。

于 2009-12-18T17:18:53.983 回答
0

同意比尔的观点,这可能表明责任过多。但是,如果您真的无法摆脱这些责任,那么Introduce Parameter Object是一种清理繁忙的构造函数/方法的方法。

于 2009-12-18T16:21:48.047 回答
0

BrowserFrame往往表明您正在扩展一个JFrame不需要的类 ( )。那很不好。

我倾向于有一个关于JComponent/view 层的布局层。

class ThingView {
    [...]
    public JTextField /*or JComponent*/ createURL() { /* or geURL */
        return new JTextField(...); // Or from a field if using get.
    }
    [...]
}

class ThingLayout {
    private final ThingView view; 
    [...]
    public JPanel createBrowsePanel() {
        JPanel panel = new JPanel();
        [...]
        panel.add(view.createURL());
        [...]
        return panel;
    }
}
于 2009-12-18T16:06:36.640 回答
0

既然您想清理您的代码并提高其可测试性,也许您可​​以进行 setter 初始化。这样,您的对象就会有一个更简洁的构造函数。如果您可以只设置“一些”字段而不是全部,那么测试代码也更容易。测试变得更具可读性。

值得研究一下 Spring,因为即使你不使用它,你也可以从这个框架的指导方针中受益。

于 2009-12-18T16:04:46.647 回答
0

该问题被视为创造/机械问题,但正如许多先前的答案所指出的那样,这实际上是一个设计问题。

我认为从长远来看,重新评估对象组合方案可能更有用,例如重新调整抽象以便 BrowserFrame 由部分(例如,AddressSection、ActionSection、InputSection、FeedbackSection 等)而不是单个 Swing 对象组成,

您还可以改用子类化重构 BrowserFrame 构造的过度参数化。

于 2009-12-18T19:03:27.220 回答