1

エンティティ クラスとビジネス クラスが混在しているプロジェクトがあります。エンティティ Bean はビジネスの一部であり、すべてプロジェクト全体で使用されます。

これらのクラスをリファクタリングして、これらのレイヤーを分離するにはどうすればよいでしょうか。また、実装者への変更を最小限に抑えたいと考えています。変更がないことが望ましいです。それ以外の場合は、何百もの参照を更新する必要があります。クラスの名前を変更して、これを処理するにはどうすればよいですか?

混合コードの例:

// Mixed business-entity class
public final class Language {
    private final Long id;
    private final String code;
    private final String description;

    //Constructor
    public Language() {
    }

    //getters and setters
    public String getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    ...

    //Business is a part of this class
    public static Language findByUser(User user) {
        Language language;
        ...implementation to find user language...
        return language;
    }

    ....
}

// Implementing class
public class Messenger {
    public Messenger() {
    }

    public static void sendEmail() {
        ...
        Language emailLanguage = Language.findByUser(user):
        ...
    }
}

これらのレイヤーを次のように分離したい:

// Entity Class
public final class Language {
    private final Long id;
    private final String code;
    private final String description;

    //Constructor
    public Language() {
    }

    //getters and setters
    public String getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...
}

// ビジネスクラス

public final class LanguageImpl {
    public LanguageImpl() {
    }
    public static Language findByUser(User user) {
        Language language;
        ...implementation to find user language...
        return language;
    }
    ....
}

実装クラスに最小限の変更を加えます。できれば変更しないでください。そうしないと、コードベース全体の参照のために多くの作業が発生します。

// Implementing class
public class Messenger {

    public Messenger() {
    }

    public static void sendEmail() {
        ...
        Language emailLanguage = Language.findByUser(user);
        ...
    }
}

このリファクタリングを行うにはどうすればよいですか? クラスの名前を変更するにはどうすればよいですか?

どんな考えでも非常に役に立ちます!ありがとう!

4

1 に答える 1

0

これが私の解決策です。よろしければ、これを確認して承認してください。ありがとう!

混合ビジネス エンティティ クラスは、ラッパー クラスとして再利用されます。これにより、変更が不要なすべての実装クラスでこれを再利用できます。

public final class Language Extends LanguageImpl{
    private final LanguageEntity languageEntity;
    //Constructor
    public Language(LanguageEntity le) {
        languageEntity = le;
    }

    //Wrapper method
    public static Language findByUser(User user) {
        LanguageEntity le = findEntityByUser(user);
        Language language = new Language(le);
        return language;
    }
    ....
}

新しい Entity クラスが新しいパッケージに作成されます (LanguageEntity)。これにより、元の混合クラス (Language) とのパッケージおよび名前の競合が回避されます。混合クラスのエンティティ フィールドとメソッドはすべてここに移動されます。

package com.test.entity;
public final class LanguageEntity {
    private final Long id;
    private final String code;
    private final String description;
    //Constructor
    public LanguageEntity() {    }
    //getters and setters
    public String getId() { return this.id;  }
    public void setId(Long id) {  this.id = id;    }
    ...
}

新しいパッケージで新しいビジネス クラスが作成されます (LanguageImpl)。すべてのビジネス メソッドがここに移動されます。元の混合クラスは、この新しいビジネス クラスを拡張します。

package com.test.impl
public final class LanguageImpl {
    //Constructor
    public LanguageImpl() {     }
    //Business is a part of this class
    public static LanguageEntity findEntityByUser(User user) {
        LanguageEntity language;
        ...implementation to find user language...
        return language;
    }
    ....
}

これは、変更を必要としない実装クラスです。何百もの実装場所が変更されないため、多くの作業が節約されます。万歳!

public class Messenger {
    public Messenger() {    }
    public static void sendEmail() {
        ...
        Language emailLanguage = Language.findByUser(user):
        ...
    }
}

また、将来の開発では、LanguageEntity と LanguageImpl の新しい組み合わせが使用されます。元の言語は非推奨になります。

このソリューションについてコメントを残してください。他のソリューションは大歓迎です!

于 2013-07-31T07:41:46.470 に答える