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

質問は創造的/機械的な懸念として組み立てられていますが、以前の多くの回答が指摘しているように、これは実際には設計上の問題です。

個々のSwingオブジェクトではなく、セクション(AddressSection、ActionSection、InputSection、FeedbackSectionなど)でBrowserFrameが構成されるように抽象化を再調整するなど、オブジェクト構成スキームの再評価が長期的にはより役立つと思います。 、

代わりにサブクラス化を使用して、BrowserFrame構築の過度のパラメーター化をリファクタリングすることもできます。

于 2009-12-18T19:03:27.220 に答える
0

これがスイングコードであることを無視すべきではないと思います。GUI は、いくつかの異なるオブジェクトを組織化された方法で集約します。複数のコンストラクターをサポートしている場合は、リファクタリングを真剣に検討することをお勧めします。必要なものと不要なものを理解するのが非常に混乱するからです。しかし、7 つのコンポーネントを何らかの編成テンプレートに入れる場合、各引数が何をするかが明確であれば、コンストラクターですべてを行うことは必ずしも悪い考えではありません。

質問が「このクラスには懸念事項が多すぎますか?」の場合 「クラスに懸念事項が多すぎることを示す兆候は何ですか?」と尋ねるのはやめましょう。「このクラスの関心事は何ですか?」と尋ねてみませんか? 答えが「複数のフォーム要素を 1 つのビューにまとめる」のような単純なものである場合、これは私 (ひいては、あなたのコードを閲覧している他の関係者) が論理的に想定するものであり、コンストラクターなどの装飾について心配するのはやめてください。この場合、それは十分に明白です。クラスを追加すると、それが難読化されます。

于 2009-12-18T17:18:53.983 に答える
0

これは責任が多すぎることを示している可能性があることにビルに同意しました。しかし、本当にそれらの責任を取り除くことができない場合は、Introduce Parameter Objectは、そのような忙しいコンストラクター/メソッドをクリーンアップする 1 つの方法です。

于 2009-12-18T16:21:48.047 に答える
0

コードをクリーンアップしてテスト容易性を向上させたいので、おそらくセッターの初期化に進むことができます。このようにして、オブジェクトのよりクリーンなコンストラクターが得られます。また、すべてのフィールドではなく「一部」のフィールドを設定できると、コードのテストが容易になります。テストがより読みやすくなります。

Spring を使用していない場合でも、このフレームワークのガイドラインから恩恵を受けることができるため、Spring について調べる価値があります。

于 2009-12-18T16:04:46.647 に答える
0

BrowserFrameJFrame必要のないところでクラス ( ) を拡張していることを示す傾向があります。それは悪いことです。

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 に答える