Закон Деметры и модели данных?


Вдохновленный этот вопрос, но, надеюсь, не дубликат.

Я понимаю, что закон Деметры-это очень полезно в случае услуг, взаимодействия с другими службами, например, гораздо легче издеваться над другими службами в модульных тестах. Насчет сервисов, взаимодействующих с моделями данных, правда?

Допустим, у меня есть иерархия неизменяемые классы:

public final class Document {
    private final List<Page> pages;
    // Constructor, getter, ...
}

public final class Page {
    private final List<Paragraph> paragraphs;
    // Constructor, getter, ...
}

public final class Paragraph {
    private final List<Line> lines;
    // Constructor, getter, ...
}

Допустим, я хочу сделать что-то с определенной строки в документ в DOC:

public void doSomething(Document doc) {
    for (Page page : doc.getPages()) {
        for (Paragraph para : page.getParagraphs()) {
            for (Line line : para.getLines()) {
                if (someCondition(line)) {
                    someAction(line);
                }
            }
        }
    }

Сейчас, насколько я понимаю, приведенный выше код не соблюдать закон Деметры. Однако, я не хочу силу закон по всей стоимости и загромождать модель (здесь документ класса) с десятками методов, как:

public List<Line> filterWrtSomeCondition();
public List<Line> filterWrtSomeOtherCondition();

Или может есть третий путь? Я подозреваю, что закон Деметры в первую очередь относится к службам взаимодействие с другими службами. Это действительное толкование?



2196
22
задан 21 января 2011 в 04:01 Источник Поделиться
Комментарии
1 ответ

Я бы сказал, что это не захламление модель лично. Вы на самом деле защищаете себя, не раскрывая внутренней реализации класса документа. Вся идея в том, чтобы поместить все ваше поведение в классе вместо того, чтобы внешний код изменить класс так, что он не может передать свои внутренние инварианты.

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

2
ответ дан 21 января 2011 в 05:01 Источник Поделиться