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);
    }
}
除了更加紧凑和清晰之外,这恰好符合得墨忒尔定律。此外,它遵循了优先组合而非继承的原则,我想你会看到德米特定律(但不是暗示)支持这一原则

如果违反了法律,他们如何重构代码

我仍然喜欢我上面介绍的内容

是 以下解决方案可接受(它看起来不像代码吗 复制):[…]

如果您将其提交给我进行代码审查,我肯定会问您认为从继承中获得了什么。有人可能会对您的代码在技术上是否重复有点争论,但它肯定比我介绍的非继承版本更长、更复杂。而非继承版本不存在代码重复的问题