在旧代码中使用 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,它使用 codesdescriptions 创建了一些 Rooms。这些 Rooms 也在视图中使用(作为 jsp bean)。

新的要求是在视图上有翻译的描述。

所以对我来说,问题是我应该在哪里实现现有 Rooms 的翻译逻辑。

只需要一个指向正确方向的指针。

我会创建一个模型 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"(不是说这是对的,但如果是这样的话)那么您可以向其添加一个动作,即翻译.但是,如果不是,那么您可以创建一个新服务,翻译。

考虑到所有这些,我更倾向于使用新的翻译服务

  1. 独立的东西
  2. 将很容易扩展(与其他选项相比),例如添加更多语言
  3. 不需要更改现有代码

同样,可能还有其他因素会影响整个事情。

如果您想翻译文本,您应该使用 java 中已经存在的国际化解决方案。

在您的解决方案中,您将产生痛苦的维护问题,并且您 return 的每个字符串都将被 if 包围。