I answered a question regaurding a ImmutableMap
. Я предложил использовать шаблон прокси.Как написать ImmutableMap, который следует за подпиской Лискова и другими принципами SOLID без запаха кода?
Проблема заключается в том, что Map
содержит метод put
, который бы выбрал UnsupportedOperationException
. Замена других экземпляров Map
на ImmutableMap
приведет к нарушению принципа «Подписки» Лискова. Мало того, что необходимо объявить put
и putAll
[нарушает принцип сегрегации интерфейс]
Технически, нет никакого способа, чтобы заменить Map
экземпляр с ImmutableMap
, поскольку Map
просто интерфейс. Так что мой вопрос:
Would создание ImmutableMap
с помощью интерфейса Map
считается нарушением LSP, поскольку Map
содержит метод put
и putAll
? Не будет ли реализация Map
рассматриваться как «альтернативный класс с разными интерфейсами»? Как создать ImmutableMap
, который находится в LSP еще не содержит запахов кода?
['Map.put'] (http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true#put%28K,%20V% 29) и ['Map.putAll'] (http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#putAll%28java.util.Map%29) (также как 'remove' и' clear') определяются как «необязательные операции». Кроме того, возможность указания класса UnsupportedOperationException из классов реализуется в документации по интерфейсу. –
@MickMnemonic Но это нарушает принцип разделения интерфейса [http://en.m.wikipedia.org/wiki/Interface_segregation_principle), в котором говорится: «* ни один клиент не должен зависеть от методов, которые он не использует *».Я отредактирую вопрос, включив его в то, что он должен следовать другим принципам SOLID, а также –
. Мое мнение заключалось в том, что контракты на эти методы мутации, по крайней мере, хорошо документированы в интерфейсе «Карта». Но у вас очень важный момент; интерфейс «Карта» - это _fat_. Возможно, это должно было быть разделено на «Map» и «ModifiableMap extends Map», изначально. –