java - 这是否违反了德墨忒尔法则?与可读代码

标签 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;
    }
}

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

最佳答案

The code below brakes [sic] apparently the Law of Demeter, i.e. methods getServer().methodx(...). From other side it looks pretty compact = better readable?

我不明白你的设计要点。如果紧凑性是您的目标,那么这不是更好吗?

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);
    }
}

除了更加紧凑和清晰之外,这也恰好符合德墨忒尔法则。此外,它遵循优先组合而不是继承的原则,我想您会看到德墨忒尔定律支持(但不是暗示)这一原则。

If the law is violated, them how to refactor this code?

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

Is the following solution acceptable (does it not look like a code duplication)?: [...]

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

关于java - 这是否违反了德墨忒尔法则?与可读代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47696614/

相关文章:

java - JPA、@OneToMany、@ManyToOne 没有联接表,外键从未设置?

maven - 如何使用 Maven 将 rt.jar 嵌入到我的 WAR 中

java - java 的得墨忒尔法则

java - Streaming 的多项操作能否打破 Demeter 法则?

java - Jenkins Windows Slave 无法编译,因为它使用 JRE 而不是 JDK

java - 在 java 库 "jaunt"中,如何单击不是 ="submit"类型的按钮?

java - 我可以将 saveOrUpdate 方法与 DynamicUpdate 注释一起使用吗?

java - 什么是得墨忒耳法则?

c++ - 如何在遵守 Demeter 法则的同时延迟加载?

oop - 耦合、内聚和迪米特定律