我有一个项目,其中实体类和业务类混在一起。实体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);
...
}
}
如何通过此重构工作? 我应该如何重命名我的课程?
任何想法都会非常有用!谢谢!
答案 0 :(得分: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)。这避免了包和命名与原始混合类(语言)的冲突。混合类中的所有实体字段和方法都移到此处。
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。原语言将被弃用。
请对此解决方案发表评论。其他解决方案非常受欢迎!