Is this a violation of the Law of Demeter? vs. readable code

134 views Asked by At

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

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

If the law is violated, them how to refactor this code? Many thanks in advance.

2

There are 2 answers

0
John Bollinger On BEST ANSWER

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

The point of your design is lost on me. If compactness is your goal, then would not this be even better?

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

In addition to being even more compact and clear, that happens to conform to the Law of Demeter. Moreover, it follows the principle of preferring composition over inheritance, which I think you'll see is favored (but not implied) by the Law of Demeter.

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

I'm still liking what I presented above.

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

If you presented that to me for code review, I would certainly ask what you think you gain from inheritance there. One might argue a bit over whether your code is technically duplicative, but it is certainly longer and more complex than the non-inheritance version I presented. And the non-inheritance version leaves no question about code duplication.

0
MicD On

For me it's much better after you have implemented 3 methods in manager.

You can have 1 data manager exposing methods for both servers.

There's another rule I like: Don't ask - tell.