在旧代码中使用 SOLID 原则实现新功能
Implementing new feature using SOLID principles in old code
我只是想更多地了解 SOLID
原则,但由于在我的旧(不是 SOLID
)代码中实现新结构而陷入困境。
我有这个Room.Class
public class Room {
private String roomCode;
private String roomDescription;
// getter/setter
}
现在我需要 roomDescription
的翻译。我开始创建一个 interface
public interface ITranslation {
String findTranslation();
}
和一个implementation
public class RoomDescriptionTranslation implements ITranslation {
@Override
public String findTranslation() {
return "translated Room";
}
在现有的代码中有一个服务 class,它使用 codes
和 descriptions
创建了一些 Rooms
。这些 Rooms
也在视图中使用(作为 jsp bean)。
新的要求是在视图上有翻译的描述。
所以对我来说,问题是我应该在哪里实现现有 Rooms
的翻译逻辑。
- 我应该在创建
Rooms
的现有服务 class 中实施它吗?
- 或者
RoomDescriptionTranslation
应该是 Room
中的一个字段吗?
- 或者我应该创建一个新服务 class 只翻译
description
吗?
只需要一个指向正确方向的指针。
我会创建一个模型 TranslatedRoom extends Room
仅在查看 SOLID 中的 L 时使用,并且在这个新模型内部会处理翻译。
当然,如果可以重构为视图等创建模型的服务
还有一件事(可能是 SOLID 的 S)如果我们只需要在 this/these 视图中显示翻译后的房间,这个想法很好。
它可能是第一或第三个选项,但我认为不是第二个选项。我认为一个重要的问题,通常对于设计任何 class 是这样的:
对于属性p和classC,是p一个属性 of C?
那么,在您的情况下,问题就变成了:翻译是 属性 房间吗?从语义上讲,它听起来不是。
然后,您可以在 Room Service class 上询问同样的问题。答案取决于您如何定义服务 class。同样,另一个有助于确定 属性 是否属于 class 的规则是:
用一个词或词组描述这个 class?
这涉及到 OOP 中的 class 以及 SOLID 中的 S 的概念。有一次,你问这个问题,可以描述你的class的一个单一目的,然后你可以回去问第一个问题,某个属性是否属于这个class。
现在,如果您的服务 class 是这样的,"Handle all room related actions"(不是说这是对的,但如果是这样的话)那么您可以向其添加一个动作,即翻译.但是,如果不是,那么您可以创建一个新服务,翻译。
考虑到所有这些,我更倾向于使用新的翻译服务
- 独立的东西
- 将很容易扩展(与其他选项相比),例如添加更多语言
- 不需要更改现有代码
同样,可能还有其他因素会影响整个事情。
如果您想翻译文本,您应该使用 java 中已经存在的国际化解决方案。
在您的解决方案中,您将产生痛苦的维护问题,并且您 return 的每个字符串都将被 if
包围。
我只是想更多地了解 SOLID
原则,但由于在我的旧(不是 SOLID
)代码中实现新结构而陷入困境。
我有这个Room.Class
public class Room {
private String roomCode;
private String roomDescription;
// getter/setter
}
现在我需要 roomDescription
的翻译。我开始创建一个 interface
public interface ITranslation {
String findTranslation();
}
和一个implementation
public class RoomDescriptionTranslation implements ITranslation {
@Override
public String findTranslation() {
return "translated Room";
}
在现有的代码中有一个服务 class,它使用 codes
和 descriptions
创建了一些 Rooms
。这些 Rooms
也在视图中使用(作为 jsp bean)。
新的要求是在视图上有翻译的描述。
所以对我来说,问题是我应该在哪里实现现有 Rooms
的翻译逻辑。
- 我应该在创建
Rooms
的现有服务 class 中实施它吗? - 或者
RoomDescriptionTranslation
应该是Room
中的一个字段吗? - 或者我应该创建一个新服务 class 只翻译
description
吗?
只需要一个指向正确方向的指针。
我会创建一个模型 TranslatedRoom extends Room
仅在查看 SOLID 中的 L 时使用,并且在这个新模型内部会处理翻译。
当然,如果可以重构为视图等创建模型的服务
还有一件事(可能是 SOLID 的 S)如果我们只需要在 this/these 视图中显示翻译后的房间,这个想法很好。
它可能是第一或第三个选项,但我认为不是第二个选项。我认为一个重要的问题,通常对于设计任何 class 是这样的:
对于属性p和classC,是p一个属性 of C?
那么,在您的情况下,问题就变成了:翻译是 属性 房间吗?从语义上讲,它听起来不是。
然后,您可以在 Room Service class 上询问同样的问题。答案取决于您如何定义服务 class。同样,另一个有助于确定 属性 是否属于 class 的规则是:
用一个词或词组描述这个 class?
这涉及到 OOP 中的 class 以及 SOLID 中的 S 的概念。有一次,你问这个问题,可以描述你的class的一个单一目的,然后你可以回去问第一个问题,某个属性是否属于这个class。
现在,如果您的服务 class 是这样的,"Handle all room related actions"(不是说这是对的,但如果是这样的话)那么您可以向其添加一个动作,即翻译.但是,如果不是,那么您可以创建一个新服务,翻译。
考虑到所有这些,我更倾向于使用新的翻译服务
- 独立的东西
- 将很容易扩展(与其他选项相比),例如添加更多语言
- 不需要更改现有代码
同样,可能还有其他因素会影响整个事情。
如果您想翻译文本,您应该使用 java 中已经存在的国际化解决方案。
在您的解决方案中,您将产生痛苦的维护问题,并且您 return 的每个字符串都将被 if
包围。