Я в середине чтения кода Завершен, и в конце книги, в главе о рефакторинге, автор перечисляет множество вещей, которые вы должны сделать, чтобы улучшить качество своего кода во время рефакторинга.Вернуться конкретные или абстрактные типы данных?
Один из его пунктов было всегда возвращаются в определенные типы данных, как это возможно, особенно при возвращении коллекции, итераторы и т.д. Так что, как я понял, вместо того, чтобы вернуться, скажем, Collection<String>
, вы должны вернуться HashSet<String>
, если вы используете этот тип данных внутри метода.
Это меня смущает, потому что похоже, что он поощряет людей нарушать правила информации, скрывающиеся. Теперь, я понимаю это, когда говорю об аксессуарах, это четкий случай. Но, вычисляя и искажая данные, а уровень абстракции метода не подразумевает прямой структуры данных, я считаю, что лучше всего вернуть как абстрактный тип данных, насколько это возможно, если данные не разваливаются (я бы 't return Object
вместо Iterable<String>
, например).
Итак, мой вопрос: есть ли более глубокая философия советов полный код о всегда возвращаются в конкретный тип данных, как это возможно, и позволяют понижающее приведение, вместо поддержания необходимости к ноу-базис, что я просто не понял?
Да, в некоторых случаях есть веская причина в возвращении LinkedList. Но я бы изменил тип возврата, как только возникнет конкретная потребность, после хорошего рассмотрения, а не по умолчанию. –
Это неправильный подход, вы всегда должны возвращать List. Если вы знаете, что клиенты будут удалять много из вашего списка, тогда разумно вернуть LinkedList. Возвращение конкретного типа, а не интерфейса, в большинстве случаев никогда не будет правильным. Методы заключаются в контрактах, и в контракте говорится, что им возвращается список X. Как список делает свою вещь несущественной. –
Да, но что, если (например), клиент должен перебирать список? Сделав подпись (и, следовательно, документы), используйте LinkedList в качестве типа возврата, клиент знает, что они не должны рассматривать список как список произвольного доступа. Таким образом, даже если все списки имеют List.get (индекс int), они будут знать, чтобы избежать использования этого метода с возвращаемым списком. В принципе, указанный тип возврата должен предоставлять информацию, когда вызывающий абонент имеет законную необходимость знать. –