Смешанные классы Entity и Business - нужна помощь Refactor

У меня есть проект, в котором перепутаны классы сущностей и бизнес-классы. Бины сущностей являются частью бизнеса, и все они используются на протяжении всего проекта.

Как лучше всего провести рефакторинг этих классов, чтобы разделить эти слои. Я также хочу сохранить минимальные изменения для разработчиков. Желательно без изменений, в противном случае сотни ссылок должны быть обновлены. Как мне переименовать классы и пройти через это?

Пример смешанного кода:

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

Как мне работать через этот рефакторинг? Как мне переименовать мои классы?

Любые мысли будут очень полезны! Спасибо!

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

Новый класс 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. Исходный язык будет устаревшим.

Пожалуйста, оставьте комментарии к этому решению. Другие решения приветствуются!

Другие вопросы по тегам