这违反了得墨忒耳法吗?与可读代码

时间:2017-12-07 13:52:14

标签: java law-of-demeter

下面的代码显然是制动了得墨忒耳定律,即方法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;
    }
}

如果法律被违反,他们如何重构这段代码? 非常感谢提前。

2 个答案:

答案 0 :(得分:1)

  

下面的代码制动[原文如此]显然是得墨忒耳法则,即   方法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);
    }
}

除了更紧凑和清晰之外,这恰好符合得墨忒耳法则。此外,它遵循优先考虑构成而不是继承的原则,我认为你会看到德米特定律有利于(但不是暗示)。

  

如果法律被违反,他们如何重构这段代码?

我仍然喜欢上面提到的内容。

  是的   以下解决方案可接受(它看起来不像代码   重复)?:[...]

如果你向我提出代码审查,我肯定会问你认为你从继承中获得了什么。有人可能会争论你的代码是否在技术上是重复的,但它肯定比我提出的非继承版本更长,更复杂。并且非继承版本不会对代码重复留下任何疑问。

答案 1 :(得分:0)

对我来说,在经理中实施3种方法之后会好得多。

您可以为两台服务器提供1种数据管理器公开方法。

还有另一条我喜欢的规则:不要问 - 告诉