Является ли это нарушением Закона Деметры? по сравнению с читаемым кодом

Код ниже явно тормозит Закон Деметры, т.е. методы 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;
    }
}

Если закон нарушается, как им рефакторить этот код? Спасибо заранее.


person partinis    schedule 07.12.2017    source источник


Ответы (2)


Код ниже тормозит [так в оригинале], по-видимому, Закон Деметры, то есть методы 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);
    }
}

Помимо того, что это еще более компактно и ясно, это соответствует Закону Деметры. Более того, он следует принципу предпочтения композиции наследованию, что, я думаю, как вы увидите, приветствуется (но не подразумевается) Законом Деметры.

Если закон нарушается, как им рефакторить этот код?

Мне все еще нравится то, что я представил выше.

Допустимо ли следующее решение (не похоже ли это на дублирование кода)?: [...]

Если бы вы представили это мне для обзора кода, я бы, конечно, спросил, что, по вашему мнению, вы получаете от наследования. Можно немного поспорить о том, является ли ваш код технически дублирующим, но он определенно длиннее и сложнее, чем версия без наследования, которую я представил. А версия без наследования не оставляет вопросов о дублировании кода.

person John Bollinger    schedule 07.12.2017

Для меня это намного лучше после того, как вы реализовали 3 метода в менеджере.

У вас может быть 1 менеджер данных, предоставляющий методы для обоих серверов.

Мне нравится еще одно правило: Не спрашивай — рассказывай.

person MicD    schedule 07.12.2017