Правила о конкретности типов параметров метода, возвращаемых типов и типов свойств

9

Некоторое время назад я читал своего рода «практическое правило» о конкретности типов параметров метода, типов возвращаемых данных и типов свойств, но я просто не помню его.

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

Я не знаю, был ли это на самом деле хороший или плохой совет, поэтому, если у вас есть свои мысли по этому поводу, пожалуйста, оставьте комментарий.

Приветствия.

NullOrEmpty
источник

Ответы:

7

Наличие абстрактных входов и конкретных выходов делает вашу функцию более общей. Это означает, что его можно использовать по-разному. С другой стороны, это накладывает более жесткие ограничения на ваш метод, ограничивая возможности его будущей реализации. Так что это компромисс между разными целями.

CodesInChaos
источник
4

Возможно, вы слышали экстраполяцию закона Постеля : «Будь консервативным в том, что ты посылаешь, либеральным в том, что ты принимаешь».

В основном речь идет о максимизации повторного использования кода. Легко придумать случаи, чтобы продемонстрировать, почему это помогает. Рассмотрим Java Iterable<T>в качестве примера. Если единственное, что делает ваш метод, это перебирает все Ts, то в Iterable<T>качестве типа параметра можно использовать этот метод с более чем 60 встроенными классами, не говоря уже о каких-либо пользовательских классах, которые реализуют интерфейс. Если вы ограничите его, скажем,, Vector<T>то любой код, который вызывает ваш метод, должен был бы быть преобразован в Vector<T>первый.

С другой стороны, возвращаясьIterable<T> из метода ограничивает объем кода , который может использовать ваше возвращаемое значение тем , что принимает Iterable<T>параметр. Если вы возвращаете очень конкретный тип, как Vector<T>, то ваше возвращение значение может быть передано в любой метод , который принимает Serializable, Cloneable, Iterable<T>, Collection<T>, List<T>, RandomAccess, Vector<T>, AbstractList<T>, или AbstractCollection<T>, и он будет работать , как ожидалось.

Карл Билефельдт
источник
Закон Постеля довольно высок в моем списке "самых больших ошибок разработки программного обеспечения".
CodesInChaos