Правила щодо конкретності типів параметрів методу, типів повернення та типів властивостей


9

Деякий час тому я читав своєрідне "велике правило" про конкретність типів параметрів методу, типів повернення та типів властивостей, але просто не пам’ятаю цього.

Це щось говорило про те, щоб зберегти типи повернення максимально конкретними, а типи параметрів - максимально абстрактними ... або навпаки.

Я не знаю, чи це насправді хороша чи погана порада, тому якщо у вас є свої думки з цього приводу, будь ласка, дайте коментар.

Ура.

Відповіді:



7

Наявність абстрактних входів та конкретних результатів робить вашу функцію більш загальною. Це означає, що його можна використовувати більше способів. З іншого боку, він ставить сильніші обмеження вашого методу, обмежуючи, як можуть працювати майбутні його втілення. Тож це компроміс між різними цілями.


4

Можливо, ви почули екстраполяцію закону Постеля : "Будьте консервативними в тому, що ви надсилаєте, ліберальним у тому, що ви приймаєте".

Переважно йдеться про максимальне використання коду. Легко придумати випадки, щоб продемонструвати, чому це допомагає. Розглянемо Iterable<T>приклади Java . Якщо єдиним вашим методом є ітерація всіх 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>, і він буде працювати , як очікувалося.


Закон Postel досить високий у моєму списку "найбільших помилок в інженерній програмі".
CodesInChaos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.