2012-02-28 4 views
12

古いjdk 1.4をベースにした巨大なプロジェクトがあります。私たちはJDK 1.6にWebアプリケーションを移行しましたが、非効率的なプラクティスとデザインの悪い点がまだ多くあります。Java定数を構成する理想的な方法

大規模な痛みの点では、巨大なJavaクラスは、1つのjavaファイル内の2500行以上のコードです。これほど多くのファイルがあります。

私はクラスをリファクタリングしようと試みましたが、定数を削除し、定数を別のConstants.javaファイルに入れて始めました。アプリケーション全体には非常に多くの定数が存在するため、定数ファイルは膨大な割合に成長するリスクがあります。

開発者がコードをきれいに保守するために採用している戦略についてフィードバックをいただければ幸いです。

+6

単一の 'Constants'クラスは反パターンのように聞こえます。定数の意味に応じて分割するか、必要に応じて列挙型に置き換えます。 – millimoose

+2

予防措置として、LOC * 0.01Vのようなもので衝撃を与える開発者の電極を、いつでもファイルを保存するためにフックします。 – millimoose

+0

解決すべき具体的な問題は何ですか?ファイルが大きすぎるという事実だけ?それがあれば、すべてのリファクタリングのコストはそれに値するものではありません。 –

答えて

13

関連するクラスに定数を保存し、それらを抽出する義務はありません。クラスのコードをクリーンアップするかもしれませんが、無関係な定数をファイルに混ぜても改善されません。

関連するものをまとめてください。

また可能であればEnumsに変換できます(ただし、リファクタリングが必要な場合もあります)。

+1

しかし、常に定数の値が重複する危険があります。テーブル名 "user_profile"は、EMPLOYER_USER_PROFILEやWEB_USER_PROFILEのような複数の定数に格納されます。 –

+1

なぜDAOクラス(そのテーブルのクラス)に定数としてテーブル名を格納して、その定数を他のクラスから使用できないのですか? (パブリックとして定数を宣言する必要があります) –

+0

@RegMem checkstyleと他の静的コードアナライザを使用して同じ文字列を見つけ、重複に警告(または私が使用しているように 'タグ')することができます。 –

0

私はすべての定数を1つのjavaファイルに入れることについて聞いたことがありません。最も良い方法は、クラスに割り当てられた定数を自分自身に入れることですが、大文字とこのようなアンダースコアで名前を付けます:EXAMPLE_CONSTANT

+1

私のdownvoteではありませんが、問題は複数のクラスで定数が必要な場合です。つまり、定数はクラス間のやりとりであり、クラスの内部動作ではありません。 – DNA

+0

@DNA次に最も論理的なクラスに入れてmakeそれらは公開されます。 –

+0

@wlstead言うのは簡単ですが、「最も明白なクラス」はないかもしれません。複数のクラスがコラボレーションのために定数に頼っている場合、それらの定数はすべて同じように共有され、どのクラスを含むべきかを決める方法はありません。それは_all_定数がもちろん_one_ファイルに入るべきであることを意味しません。共有された定数は、共有されたインターフェースの中で最も良いかもしれません。 http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingConstants.htmlたとえば – DNA

0

すべての定数に対してEnumを使ってみましたか?私はそれがJava 1.5以降の好ましい方法であると言われてきました。ただ、(それだけで問題を離れて移動)私の意見ではSENSを行わないConstant.javaファイルに定数を置く

http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html

+1

列挙型は素晴らしいですが、常に定数を置き換えることができるとは限りません - 適用可能な場合はそれぞれを使用してください。 –

2

。しかし、時々私はそれらを再編成して、それらを再グループ化し、再編成するためにいくつかのファイルを使用します:DatabaseConstants.javaGraphicConstants.javaなど... もちろん、enumsも便利です。

編集:正確には、私は実際にJava MEアプリケーションで動作しますので、抽象クラスで「制御された語彙」を持つことができない列挙型を「模倣する」方法ですEE機能...)

+0

私はこの戦略を使用することを考えていましたが、その戦略を採用するかどうかについて議論していたので、私の質問には反映されません。 150以上のモデル固有のオブジェクトを持つアプリケーション(SpringやStrutsなどを使用しているわけではありません)。これらのモデルオブジェクトには、あまりにも多くの定数が散在していますが、そのアプローチはありません。 –

8

すべての定数を1つのファイルに入れるのはひどい考えです!特に、すべての定数がInterfaceにあるuber-Constantアンチパターンは、すべてのクラスがimplementであることが必要です。日曜日にひどい10の方法!これは、人々がJavaの前に1990年代初めにそれをやり直すときに悪い考えでした! 2012年は間違いですね!

これは、このuber-Constantsファイルをインポートするたびに、関連性のない多くの情報が混ざり合っていて、必要のない依存関係を作成していることを意味します。一緒になるものは、Enumまたは少なくともClassにそれらのメソッドの引数として使用する必要があります。変更されたときに影響分析を簡単に行う方法を知っておく必要があります。

の定数は、他のビジネスドメイン定数と混合された定数で、DaysOfTheWeekと混在しており、数千もの場合もありますが、数千ものファイルが1つのファイルにあります。これまでどのようにして良いアイデアと考えることができますか?すべての非考案の場合、public innerのメンバーであるEnumClassの方が良い解決策です。

これはまた、競合しない名前を作成して作成するための単一のフラットな名前空間を持っていることを意味しています。これは決して肯定的な運動ではありません。

いつもあなたをすべき設計とリファクタリング:

高い凝集のために努力、これは可能な限り一緒に近くに関連するものを維持意味します。

努力するルーズカップリングこれは、関係のないものが他の関連しないスコープに漏れないようにすることを意味します。

保守可能なコードを自己文書化するために努力すると、数多くのprivate static final String/int宣言がすべて一緒に混在しても、誰の標準でもこの定義に適合しません!

Enumをツールとして使用すると、2012年のCスタイルの定数は役に立たないため、できるだけ多くの定数のグループをEnumに変換することに焦点を当てる必要があります。 Enumはタイプセーフで、他の属性やプロパティ、動作を添付してintelligentにすることができます。それが下に行く道です。

+0

おそらく、関連性のあるものを追加すると便利です。 – reinierpost

+0

(定数が 'interface'にあるからといって、そのインタフェース*が実装されていることを意味しているわけではありません) –

-1

私はあなたが2500 LOCs以上の複数のJavaファイルを持っている場合、定数を配置する決定はあなたの問題の中で最小であるべきだと思います。再構成されたシステムがどのように見えるかを明確に把握する必要があります。 これはおそらく、定数や他の構文上の考慮事項をどこに置くべきかを決めるのははるかに難しくなりますが、最初にやる必要があります。

+0

はい、私は知っていますが、怖いチームとひどいステークホルダー(通常のケース)私の "リファクタリング旅行"を最短サイクルと最低リスクで開始しました。私は複数の段階でコード内の "駄洒落"を取り除くことを計画しています –

+0

これを別の方法で入れてみると、いったん設計をしたら、絶え間ない質問が消えてしまいます。 –

1

このページにアクセスしている人のために。

複数の定数ファイルを管理したくない場合は、以下のように整理するのが良い方法です。

public interface Constants { 
    public static final String CREATE_USER = "createUser"; 
    // Nested Interface. 
    public interface ProjectConstants { 
     public static final String CREATE_PROJECT = "createProject"; 
     public static final String INVALID_SESSION = "Invalid Session"; 
     // As you know they are implicity public static final. 
    } 
}// Accessed as: 
Constants.ProjectConstants.CREATE_PROJECT 
+0

ええ、私たちはそれをやり始めました、あなたの応答のおかげで –

1

私は数年前に見た定数のデザインパターンを共有したいと考えています。

まず、BaseConstantファイルを作成します。これは、すべてのパッケージが使用できるすべてのグローバル定数を保持します。

あなたのアプリの各サブパッケージに、サブパッケージにのみ関連する定数ファイルを作成します。もしあなたがいたら。ログインと呼ばれるサブパッケージは、ログインに関連する定数だけをそこに入れます。しかし、鍵はBaseConstantsを拡張することです。この方法では、IDEチューザー内のグローバル定数をすべて見ることができますが、ファイルを開くとパッケージ定数のみが表示されます。それは、私は定数ファイルが本当に重く重複した値と読みにくいことができると言われている。ここで

は、すべての他のパッケージに今..私が何を意味するか

public class BaseConstants{ 

public static final String GLOBAL1= "GLOBAL string"; 

public static final String GLOBAL2= "another GLOBAL string"; 
} 

である。このようなファイルを作成します:あなたが入力したときに、あなたのIDEで

class MyPackageConstants extends BaseConstants{ 

public static final String LOCAL1 = "local String" 
public static final String LOCAL2= "ANOTHER LOCAL string"; 
} 

を "MyPackageConstantsを。"アプリケーション全体のすべての定数が表示されます。

関連する問題