我一直在阅读Robert C. Martin的 Clean Code ,并且发现了臭名昭着的声明:
在a的名称中避免使用管理器,处理器,数据或 Info 等字样 类。
所以,很自然地,我试图从我的一个类名中考虑-Info
。现在,我已经看到了各种StackOverflow问题,询问在-Manager
或-Processor
的情况下该怎么做。我看到评论表明他们无法想到-Data
是一个好的班级名称的时间。嗯,在我看来,-Data
和-Info
似乎更难以分解。特别是,例如在下面的类中。
我有一个Server
类,如下所示:
public class Server {
//What I would call ServerInfo
private int id;
private String name;
private String address;
private int port;
private int connections;
private int maxConnections;
private int status;
//Bunch of members that aren't ServerInfo, for example:
private ConcurrentHashMap<String, File> files = new ConcurrentHashMap<String, File>();
private List<String> filePaths = new List<String>();
/* ... */
public void start() { /* ... */ }
public void stop() { /* ... */ }
}
在另一台远程服务器上存储了HashMap
这些服务器的信息,如下所示:
public class ServerMap {
ConcurrentHashMap<Integer, Server> serverMap = /* ... */;
}
但是,这个HashMap
只需要知道我上面说的是ServerInfo
。它不需要通过存储一堆永远不会使用的变量来浪费内存。因此,需要一个Data类来容纳这些变量。
public class ServerInfo {
private int id;
private String name;
private String address;
private int port;
private int connections;
private int maxConnections;
private int status;
}
ServerMap
现在变为ConcurrentHashMap<Integer, ServerInfo>
。
问题是这显然违反了清洁代码的规则。我可以将-Info
更改为某个同义词,但是,那不是真的没有解决问题吗?例如,我可以将其称为ServerDetails
,但我看不出它与ServerData
或ServerInfo
有何不同。
我可以在另一个名称空间中重新定义Server
,并只给这些成员,但这似乎更令人困惑。
最佳做法 解决方案是什么?
答案 0 :(得分:6)
我认为该语句的目的是避免在类命名时使用像-Data和-Info这样的重载术语。我不认为使用像ServerDetails这样的东西来命名你正在命名的对象。毕竟,这就是它们不是吗?
如果ServerDetails过于通用,请问自己它们是什么类型的信息/细节......在这种情况下,它们都看起来与网络或连接相关。 ServerConnectionProperties或类似的东西怎么样?
使用作者提出的指南正是如此;准则。请记住,有很多人有很多意见,很少有人适用100%的时间。你会发疯地试图在信中应用每一个“最佳实践”。
答案 1 :(得分:2)
我认为你以错误的方式看待重构。他们的正确名称(在我看来)ServerInfo
将是Server
,因为这就是服务器的实际内容。当我们处理OOP时,“基础”对象是具有数据的对象。例如,我们不会使用用户名,电子邮件和密码UserInfo
或UserData
来调用类,因为数据是由具有成员的类隐含的。
显然,这条规则有一些例外。通常的做法是让ProfileData
对象包含某些不太重要的用户信息。
我可以通过两种方式思考个人如何重新考虑此服务器问题。
一个是我将基础(serverInfo)重命名为Server
,将更高级别的对象重命名为ServerCommands
之类的其他东西(我很难找到合适的名称,因为我不知道该类是否已经完成)
我的下一个建议是基于“概括”的概念。我们不想为这个名字命名的最大原因是因为它概括了编程的隐含方面。几乎所有类都倾向于将“信息”和“数据”关联起来。这些信息或数据是什么?我想引用SO主题讨论“助手”和“经理”的重新因素。
原因:像“ThreadHelper”这样的类名让人们想知道为什么会这样 需要以及为什么它不能只是“Thread”类的一部分。是吗 实际上是适配器或装饰器?如果是这样,那就这样命名。是上课 “线程”已承担过多责任?如果是这样,重构和 给新类一个有意义的名字。 “助手”没有说什么 它在做什么或它如何帮助。
关于什么是类的实际预期目的。如果我看到一个名为serverInfo的类,我可能会或可能不会理解信息是什么。
我个人会将其命名为ServerProperties
。听起来它可能只是信息的同义词,但实际上更具体。当我们考虑属性时,我们会想到“一次性设置”不会改变的细节。 (或者如果他们确实改变了,那是因为我们正在改变设置)。你也可以称之为ServerSettings
,但我个人更喜欢属性。