2009-02-26 5 views
2

Swing開発者になる可能性のある長年のSwing開発者として、コンポーネントのレイアウトに使用するパターンが多数見つかりました。たとえば、JLabelに関連付けられたコンポーネントを作成することがよくあります。私は通常次のように書いています。静的メソッドがいっぱいのクラスのデザインに関する考慮事項

JPanel panel = new JPanel(new BorderLayout()); 
panel.add(label, BorderLayout.NORTH); 
panel.add(list, BorderLayout.CENTER);

よくあることですが、よく使うレイアウトのイディオムを含むクラスを作成することにしました。次に、私は単純に言うことができます:

JPanel panel = LayoutPatterns.createNorthLabeledPanel(label, list);

...私のタイピング負荷を大幅に軽減します。

ここで、約20の静的メソッドからなるクラスがあります。クラスには状態がありません。すべてのコンテキストはメソッドのパラメータで渡されます。

JavaのMathクラスに加えて、静的メソッドだけで構成され、状態を持たないクラスは見たことがありません。

一方で、これは正しく感じられません。一方、私はそれに間違って何も表示されません。

これは大丈夫なパターンなのでしょうか、それともCode Smellですか?このパターンが別のドメインに適用された場合、クラスの静的クラスのマルチスレッド化された使用について心配すべきですか?これを本番品質のコードで見たことがあるならば、あなたは気にしませんか?

答えて

2

私はこのようなクラスを作ることに問題はありません。クラスがそのインスタンスをインスタンス化する必要がないように、通常の使用でクラスが意味を持つ場合は、メソッドを静的にしないでください。

私はこのようなコードを自分で作成しました。

2

静的な唯一のユーティリティクラスには問題はありません。そこに配置するメソッドに状態が必要ない場合、クラスがインスタンス化される理由はありません。

実際には、.Netでは拡張メソッドが静的クラスでなければならないので、ほとんどの場合、ユーティリティ関数は静的であり、別の型の機能を拡張しようとします。

1

私はあなたのアプローチには何の問題もありません。実際、これらのユーティリティ静的クラスは常に実行します。このクラスには状態がないので、マルチスレッド環境で問題はないと思います。このクラスのサイズに関心がある場合は、いくつかのタイプのスイングコンポーネントに従って分割することを検討してください。

+0

幸いですが、はい、クラスの成長の大きさは私の心配です。私は大きいが大きすぎるのだろうか...あなたが探しているものを見つけるためにAPIをすばやく読み取るには時間がかかりすぎると思います(他の誰かがクラスを使用している場合) –

4

この種の物は、通常、悪臭の臭いがあると思います。しかし、私はあなたと一緒にいる、私は特にこの場合に何か間違って表示されません。

私はあなたがあなたのデザインを完全にうまく説明し正当化したと思います。

JPanelを継承してNorthLabelJPanelを作成することもできます(JPanelを含む新しいクラスを作成することもできます)。しかし、これが努力する価値があるかどうかはわかりません。私はあなたのコードがこの方法でもっと複雑に見えると思っています。

私の2セント:)

+0

私は悪いコードのにおいに同意します、私はそれにかなり私の指を置くことができる。しかし、あなたの選択肢に応じて、is-a関係(必要に応じて)よりもhas-a関係が優先されます。 Javaはすでにhas-a関係を使ってコンポーネントを開発しているので、元に戻す必要はありません。 – jeremyalan

+0

あなたの提案に同意するならば、これらのユーティリティクラスを整理して名前を付けておくことをお勧めします。それであなたはうまくいけば簡単に自分で作業することができます。 – Robin

+0

興味深い選択肢ですが、サブクラスがすべてコンストラクタ内で機能するが、追加/変更やメソッドではない場合は、おそらく継承の悪用です。理想的には、.add()メソッドは連鎖可能でなければなりませんが、静的なファクトリメソッドが最適な解決策としてここにあります。 –

4

私が唯一の問題はここに-gasp-グローバル関数は完全に適切なクラスを発明するためにあなたを強制的に言語があると思います。:-)

+0

+1 - 私は笑顔になりました。 –

0

VB.NETで、静的クラス(VBではモジュールと呼ばれます)の言語サポートがあるので、実際に静的であることをコンパイラがチェックできるようになりました。

0

個人的には、あなたが記述した元の形式のコードを個人的に見ることをお勧めします。これまでは、パネルのレイアウトを変更したければ、適切なメソッドを検索したり新しいものを作成したりする必要がないため、コードが何をしているかを一目で分かりやすく伝えるのはずっと簡単ですあなたが望むものを達成する方法。また、コンポーネントに多くの属性を追加すると、静的メソッドの数が指数関数的に増加します。

デザインパターンの世界では、Builderパターンがこのようなケースに適用されていることがわかります。これは、Java APIが達成しようとしているものです。

基本的な荒廃:

  1. は、オブジェクト/属性/などを追加し、簡単なオブジェクト、ほとんど、あるいはまったく装飾
  2. を作成します。それを見て/あなたがしたいことをするには

注:あなたが完了するまでの最終結果がどのように見えるかは、あなたにはわかりません。

さらに、JPanelの拡張について説明した回答を読みました。デザインの観点からは、可能な限りis-a関係の代わりにhas-a関係を好むようにしてください。さもなければ、静的メソッドと同じに見える非常に平坦なクラス構造になり、上で説明したのと同じ落とし穴があります。

これで、私は "サービス"と呼ばれる、大規模なコレクションを書いて使用しました。クラスは状態がなく、静的なメソッドしかありません(あなたが記述したように)。より重要なのは、私の基本ルーチンの多くを複製することです)。実際に使用すると便利ですが、テキストの書式設定、配列のコピー、浮動小数点配列の二重配列への変換(C++の場合)などの非常に基本的な(そして共通の)ルーチンにしか使用しない傾向があります。あなたは標準ライブラリで見つけることが期待されます。

実際には、静的メソッドが実際にどのように「静的」であるかによって異なります。頻繁にメンテナンスやアップデートが必要な人がいない場合は、説明した内容にロックを解除することができます。しかし、将来的に再要因の可能性がある場合は、可能な限り柔軟性を残すことをお勧めしたいと思います。残念ながら、毎回手動でAPI呼び出しを行うことを意味します。

幸運を祈る!

1

すべてのプロジェクトのように、まもなく静的ユーティリティークラスで終了します。あなたの特定の例では、私はおそらく工場のパターンを調べるでしょう。しかし、仕事をやり遂げるのに役立ち、他の人をあなたのチームに混乱させないなら、あなたがしていることに間違ったことは何も表示されません。私はあなたがオブジェクト指向の環境で開発している場合、あなたは2つだけの選択肢があることを考える

0

  1. は、すべてのクラスメソッドは、静的ください。
  2. 通常のクラスを作成し、シングルトンパターンを使用します。
関連する問題