Смешанные классы 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. Исходный язык будет устаревшим.
Пожалуйста, оставьте комментарии к этому решению. Другие решения приветствуются!