【发布时间】:2013-07-30 15:27:06
【问题描述】:
我一直在阅读 Robert C. Martin 的 Clean Code,无意中发现了一句臭名昭著的声明:
避免使用 Manager、Processor、Data 或 Info 之类的词 类。
所以,很自然地,我尝试将-Info 排除在我的一个班级名称之外。现在,我看到了各种各样的 StackOverflow 问题,询问在 -Manager 或 -Processor 的情况下该怎么做。我见过 cmets 表示他们想不出-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,并只给它这些成员,但这似乎更令人困惑。
对此的最佳实践解决方案是什么?
【问题讨论】:
-
如果不需要使用“非 ServerInfo 的成员群”,那么为什么要将它们放在
Server中?你能举出更多关于他们的例子吗? -
@Genzer 它们被
Server使用。包含有关每个Server的信息的地图不使用它们。只有ServerInfo中的变量需要ServerMap知道/存储。
标签: java naming-conventions code-cleanup