Нарушает ли ActivityMapper GWT принцип подстановки Лисков?

В моем приложении GWT у меня есть такой класс:

public class AppActivityMapper implements ActivityMapper {

    @Override public Activity getActivity(Place place) {

        if(place instanceof ThisPlace) {
            return new ThisActivity((ThisPlace)place);
        }
        if(place instanceof ThatPlace) {
            return new ThatActivity((ThatPlace)place);
        }
        if(place instanceof AnotherPlace) {
            return new AnotherActivity((AnotherPlace)place);
        }
        // you get the idea
    }
}

Объекты ActivityMapper, Activity и Place являются частью фреймворка, и интерфейс подразумевает, что именно так он и предназначен.

Однако, согласно принципу подстановки Лисков, метод, который принимает тип, но не проверка типа для подклассов, чтобы определить, какое действие следует предпринять, является нарушением принципа.

Поощряет ли интерфейс GWT ActivityMapper нарушение LSP по своей природе? Или есть другой LSP-совместимый способ кодирования этого метода, о котором я не подумал?


person Jay    schedule 03.12.2011    source источник


Ответы (1)


Роль ActivityMapper состоит в том, чтобы сопоставить Place с Activity, при этом правила сопоставления остаются полностью свободными.
Что делает этот тип каскада if/else тем, что Java не поддерживает множественная отправка, но, на мой взгляд, это не означает нарушение LSP (или, по крайней мере, у вас нет другой выбор в Java, так что это не проблема; вы можете использовать шаблон посетителя — это то, что генерирует Spring Roo — но это мало что меняет).

person Thomas Broyer    schedule 03.12.2011
comment
При дальнейшем чтении я думаю, что нарушение LSP зависит от того, сможете ли вы сломать клиент, заставив его вызывать этот метод с подклассом. И это, кажется, на самом деле является целью метода сопоставления, поэтому в этом случае, возможно, каскад if/else instanceof не является автоматически нарушением LSP. Спасибо за упоминание шаблона посетителя... похоже, здесь обсуждается больше реализации этого метода здесь. - person Jay; 04.12.2011