Java 这是否违反了德米特的法律?与可读代码
下面的代码显然违反了德米特定律,即方法Java 这是否违反了德米特的法律?与可读代码,java,law-of-demeter,Java,Law Of Demeter,下面的代码显然违反了德米特定律,即方法getServer().methodx(…)。从另一方面看,它看起来相当紧凑=可读性更好 abstract class BaseManager { ResultSet find(String searchText) { return getServer().find(searchText); } ResultSet fetch(String fetchText) { return getServer(
getServer().methodx(…)
。从另一方面看,它看起来相当紧凑=可读性更好
abstract class BaseManager {
ResultSet find(String searchText) {
return getServer().find(searchText);
}
ResultSet fetch(String fetchText) {
return getServer().fetch(fetchText);
}
void save(String saveText) {
getServer().save(saveText);
}
abstract BaseManager getServer();
}
class Server1Manager extends BaseManager {
@Override
protected BaseManager getServer() {
return server1;
}
}
class Server2Manager extends BaseManager {
@Override
protected BaseManager getServer() {
return server2;
}
}
如果违反了法律,他们如何重构代码?
非常感谢。对于我来说,在manager中实现了3种方法之后,效果会更好 您可以有一个数据管理器为两台服务器公开方法 还有一条我喜欢的规则:不要问-说 下面的代码显然是德米特定律,即。 方法getServer().methodx(…)。从另一边看,它看起来很漂亮 紧凑=可读性更好 我对你的设计失去了兴趣。如果紧凑是你的目标,那么这不是更好吗
class Manager {
private Server server;
public Manager(Server server) {
this.server = server;
}
ResultSet find(String searchText) {
server.find(searchText);
}
ResultSet fetch(String fetchText) {
server.fetch(fetchText);
}
void save(String saveText) {
server.save(saveText);
}
}
除了更加紧凑和清晰之外,这恰好符合得墨忒尔定律。此外,它遵循了优先组合而非继承的原则,我想你会看到德米特定律(但不是暗示)支持这一原则
如果违反了法律,他们如何重构代码
我仍然喜欢我上面介绍的内容
是
以下解决方案可接受(它看起来不像代码吗
复制):[…]
如果您将其提交给我进行代码审查,我肯定会问您认为从继承中获得了什么。有人可能会对您的代码在技术上是否重复有点争论,但它肯定比我介绍的非继承版本更长、更复杂。而非继承版本不存在代码重复的问题