【问题标题】:Mixed Entity and Business classes - Refactor help needed混合实体和业务类 - 需要重构帮助
【发布时间】:2013-07-30 12:37:23
【问题描述】:

我有一个项目,其中实体类和业务类混合在一起。实体 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);
        ...
    }
}

我如何完成这个重构? 我应该如何重命名我的课程?

任何想法都会非常有帮助!谢谢!

【问题讨论】:

  • 对于 findByUser 你传入一个用户,像“user.currentLanguage”或“user.getCurrentLanguage()”这样的东西会出现在“User”实体中,这使得该功能是不必要的。

标签: refactoring code-separation


【解决方案1】:

这是我的解决方案。如果它看起来不错,请查看并接受它。谢谢!

混合业务实体类被重新用作包装类。这使得可以在不需要更改的所有实现类中重用它。

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;
    }
    ....
}

在新包中创建了一个新的实体类 (LanguageEntity)。这避免了与原始混合类(语言)的包和命名冲突。混合类中的所有实体字段和方法都移到这里。

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 组合。原始语言将被弃用。

请让 cmets 继续使用此解决方案。其他解决方案非常受欢迎!

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 2012-06-18
    • 2019-07-18
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多