Re: Возвращать или не возвращать из метода конкретный класс, а не интерфейс
От: vmpire Россия  
Дата: 29.01.14 06:15
Оценка: 1 (1)
Здравствуйте, Dziman, Вы писали:

D>Столкнулся тут с такими принципами:

D>- метод должен принимать параметры как можно более общего типа
D>- метод должен возвращать объект как можно более конкретного класса

D>Первый принцип, можно сказать, классика и позволяет избегать большой связности. Со вторым же у меня трудности с пониманием приемуществ такого подхода(недостаток в виде большей связности весьма очевиден).


...

D>Ну и на закуску, 'опасный' код:

D>
D>void method1() {
D>    ArrayList<String> names = getNames(...);
D>    // делаем что-то
D>    names.trimToSize(); // специфический для ArrayList метод 
D>    // делаем что-то
D>}
D>


D>- 'опасный код': в этом случае мы отгребаем за связность и нам приходится не только менять тип переменной, но и переписывать логику. Тут я могу придумать для чего так можно было сделать: например, для оптимизации когда известно, что конкретная рализация в данном случае будет эффективнее намного другой.


D>Не упустил ли я какую-то деталь, которая доказывает полезность 'конкретного' принципа?

Упустили, причём в своём же примере.
В примере наличие конкретного типа ArrayList позволяет делать trimToSize() без извращений по пересозданию списка.

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

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

Кстати, в первом случае присутствует аналогичный недостаток, но он не такой очевидный и не так часто встречается: если при расширении метода нам понадобится от его параметров что-то большее, чем то, что мы заявили в параметрах изначально, то нам точно так же придётся переписывать вызывающий код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.