私は現在、単純に文字列として表されるデータベース パスなど、変数のクラスがいくつかあるコードベースに取り組んでいます。これらの (非) 型に対する操作のほとんどは、ユーティリティ クラスで定義されます。
従来の OOP スタイルで、操作をインスタンス メソッドとして定義して、データベースを表す新しいクラスを作成しました。ただし、大規模なコードベースを調べて、新しい型を使用するようにリファクタリングするのは非常に面倒です。これを迅速かつ効果的に行う方法について誰かアドバイスはありますか?
私は現在、単純に文字列として表されるデータベース パスなど、変数のクラスがいくつかあるコードベースに取り組んでいます。これらの (非) 型に対する操作のほとんどは、ユーティリティ クラスで定義されます。
従来の OOP スタイルで、操作をインスタンス メソッドとして定義して、データベースを表す新しいクラスを作成しました。ただし、大規模なコードベースを調べて、新しい型を使用するようにリファクタリングするのは非常に面倒です。これを迅速かつ効果的に行う方法について誰かアドバイスはありますか?
ユーティリティ クラスを移行して、新しいクラスを使用します。その場合、ユーティリティ クラス メソッドには 2 つのステートメントのみを含める必要があります。1 つはクラスを作成するためのもので、もう 1 つはクラスを呼び出すためのものです。その後、ユーティリティ クラス メソッドをインライン化して、その必要性をなくすことができます。
それが終わったら、新しいクラスを何度もインスタンス化しない方法を探す必要があります。これは、構築時に初期化されるインスタンス フィールドにローカル変数をリファクタリングすることによって行う必要があります。
データベースパスは、私には文字列である必要があるように聞こえます。他に何が理にかなっていますか?また、構成ファイルまたはデータベースのいずれかで外部化する必要があります。それはあなたの問題の中で最も少ないものです。
永続性は何度も繰り返されてきたので(Hibernate、Spring JDBC、iBatisなど)、どうすればそれらを改善できるのだろうかと思います。リファクタリングの問題に取り組まなければならない場合、そしてあなたがしなければならない場合、私はあなたがしたこと以外のものを使用することをお勧めします。
あなたが何かを書かなければならないなら、「一般的なDAO」のためのグーグル。あなたはこのようなものを手に入れるでしょう:
http://www.ibm.com/developerworks/java/library/j-genericdao/index.html
あなたの作品がそのようなものにパターン化されていない場合は、それを捨てて、物事を再考してください。
私が C# で使用した (Java に移植したばかりです - 私が Java を初めて使用するので、エラーが発生した場合は申し訳ありません) 手法は、StringlyTyped クラス、たとえば基本クラスを作成することです。
public abstract class StringlyTyped {
private String value;
public StringlyTyped (String value){
if (value == null){
throw new IllegalArgumentException("value must not be null");
}
this.value = value;
}
public String getValue() { return value; }
@Override
public boolean equals(Object other){
if (other == this) {
return true;
}
if (other == null || !this.getClass().equals(other.getClass())){
return false;
}
StringlyTyped o = (StringlyTyped)other;
return o.getValue().equals(this.getValue());
}
@Override
public int hashCode(){ return this.getValue().hashCode(); }
@Override
public String toString() { return this.getValue(); }
}
次に派生クラス
public class ProviderName extends StringlyTyped {
public ProviderName(String value) {
super(value);
}
}
そして使い方
public void Foo(ProviderName provider) {
}
多くの文字列パラメーターを持つメソッドがある場合は理にかなっています。たとえば、回避できます
public void Foo(String username, String password, String db, String table, String constraint)
代わりに、次のように強く型付けされたコードがあります。
public void Foo(UserName username, Password password, DatabasePath db, TableName table...)
等...