Ось декілька аргументів щодо властивостей та моїх аргументів:
Простіший у використанні, ніж написання геттерних та сетер-методів
Пари методів Геттера та сеттера - це кодовий запах. Зробити їх легше писати - це полегшити пропуск тесту з математики, використовуючи форму Scantron і заповнивши всі "C". Об'єкти, що містять лише стан, для збереження не повинні використовувати геттери / сетери, а створювати незмінні об’єкти на час збереження.
Для споживача об'єкта важливо те, що він робить, а не як це робить. Його поведінка - це те, що робить; її стан - це, як це робиться. Якщо ви виявляєте, що дбаєте про стан об'єкта (за винятком стійкості, хоча це також порушує ОО), ви просто не займаєтесь ООП і втрачаєте його переваги.
Вони дають грубі показники ефективності для споживачів
Це щось, що може змінитися в майбутньому для будь-якого майна. Припустимо, у версії 1.0 доступ до PropertyX просто повертає поле. У випуску 1.5, якщо поле є нульовим, PropertyX використовує шаблон Null Object для створення нового об’єкта null. У випуску 2.0 поле отримує подальшу перевірку методом getter у PropertyX.
Оскільки властивість стає все більш складною, показник ефективності використання властивості здається все менш правдивим.
Вони краще, ніж громадські поля
Це правда. Але так є і методи.
Вони представляють принципово інший аспект об'єкта, ніж метод, і всі споживачі об'єкта повинні дбати про це
Ви впевнені, що обидва вищезазначені твердження є правдивими?
Їх легше набрати, чоловіче
Звичайно, вводити текст myObject.Length
простіше, ніж набирати текст myObject.Length()
, але хіба це не можна було виправити за допомогою синтаксичного цукру?
Навіщо використовувати методи замість властивостей?
Немає гарантій виконання. API залишатиметься правдивим, навіть якщо метод стане складнішим. Споживачеві потрібно буде профайлювати свій код, якщо він стикається з проблемами продуктивності, а не покладатися на API-програму Word-of-API.
Менше, щоб споживач міркував. Чи має ця власність сетер? Метод впевнений, що ні.
Споживач думає від правильного мислення OOP. Як споживач API, мені цікаво взаємодіяти з поведінкою об'єкта. Коли я бачу властивості в API, це дуже схоже на стан. Насправді, якщо властивостей робиться занадто багато, вони навіть не повинні бути властивостями, так що насправді властивості в стані API ARE, як вони здаються споживачам.
Програміст API більш глибоко подумає про методи із поверненими значеннями та уникне змінити стан об'єкта в таких методах, якщо це можливо. Наскільки це можливо, слід виконувати відокремлення команд від запитів.
Тож запитую вас, навіщо використовувати властивості замість методів? Більшість пунктів MSDN - це запахи коду і самі по собі, і не належать ні до властивостей, ні до методів.
(Ці думки прийшли до мене після роздумів про CQS.)
type GetFoo() void SetFoo()
десять тисяч разів. За весь час написання коду C # я ніколи не плутався у власності.