cru*_*ush 6 java naming-conventions code-cleanup
我一直在读Robert C. Martin的清洁代码,并且发现了臭名昭着的声明:
避免使用类名称中的管理器,处理器,数据或信息等字样.
所以,很自然地,我试图-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() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
还有就是HashMap存储的像另一个远程服务器上的以下这些服务器的信息:
public class ServerMap {
ConcurrentHashMap<Integer, Server> serverMap = /* ... */;
}
Run Code Online (Sandbox Code Playgroud)
但是,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;
}
Run Code Online (Sandbox Code Playgroud)
而ServerMap现在变成ConcurrentHashMap<Integer, ServerInfo>.
问题是这显然违反了清洁法典的规定.我可以换成-Info某个同义词,但那么,是不是真的没有解决问题呢?例如,我可以调用它,ServerDetails但我没有看到它与ServerDataor 有什么不同ServerInfo.
我可以Server在不同的命名空间中重新定义,并给它只是这些成员,但这似乎更令人困惑.
这是什么最佳实践解决方案?
我认为该声明的重点是避免在类命名时使用像-Data和-Info这样的重载术语.我不认为使用像ServerDetails这样的东西来命名你正在命名的对象.毕竟,那就是它们不是吗?
如果ServerDetails过于通用,请问自己它们是什么类型的信息/细节......在这种情况下,它们都看起来与网络或连接相关.ServerConnectionProperties或类似的东西怎么样?
使用作者提出的准则就是这样; 准则.请记住,有很多人有很多意见,很少有人适用100%的时间.你会疯狂地试图在信中应用每一个"最佳实践".