При спробі формально міркувати про правильність програми, орієнтованої на об'єкти , типово використовувати модульний підхід, що включає об'єктні інваріанти . У такому підході
- Методи пов'язані з ними до і після умов (контрактів).
- Об'єкти асоціювали з ними інваріанти.
Модульне міркування про об'єкт протікає наступним чином (спочатку приблизно наближенням)
- Доведіть, що конструктор об’єкта встановлює інваріант
- Для кожного неприватного методу припустіть, що об'єкт інваріантний та попередня умова методу утримуються при введенні, а потім доведіть, що тіло коду передбачає, що постійна умова та інваріант утримуються при виході методу
Уявіть, що ми перевіряємо, object A
використовуючи підхід вище. А тепер хочу перевірити method g
з object B
яких вимагає method f
від object A
. Модульне міркування дозволяє нам міркувати, method g
не переглядаючи реалізацію method f
. За умови, що ми можемо встановити інваріантність object A
та передумову method f
на сайті виклику, method g,
ми можемо сприйняти умову повідомлення method f
як підсумок поведінки виклику методу. Крім того, ми також будемо знати, що після виклику повертається інваріант A
досі утримується.
Ця модульність міркувань - це те, що дозволяє нам формально думати про великі програми. Ми можемо розмірковувати про кожен із методів окремо, а потім складати результати цього міркування, в свою чергу, міркуючи про більші частини програми.
Приватні поля дуже корисні в цьому процесі. Для того, щоб знати, що інваріант об'єкта продовжує утримуватися між двома викликами методів на цьому об’єкті, ми зазвичай покладаємось на те, що об'єкт не змінюється протягом періоду, що проходить.
Щоб модульне міркування працювало в контексті, коли об’єкти не мають приватних полів, тоді ми повинні були б мати певний спосіб переконатись у тому, що те, що трапилося поле, встановлене іншим об'єктом, щоб інваріант завжди відновлювався (після поля набір). Важко уявити об'єкт інваріантним, який обидва має значення незалежно від того, яке значення мають поля об'єкта, а також корисний при міркуванні про правильність програми. Нам, мабуть, доведеться вигадувати якусь складну умову щодо доступу на місця. І, ймовірно, також втрачають частину (в гіршому випадку навіть усі) нашої здатності міркувати модульно.
Захищені поля
Захищені поля відновлюють частину нашої здатності міркувати модульно. Залежно від мови protected
може обмежувати можливість встановлення поля для всіх підкласів або всіх підкласів і класів того ж пакету. Часто буває так, що у нас немає доступу до всіх підкласів, коли ми міркуємо про правильність об'єкта, про який пишемо. Наприклад, ви можете написати компонент або бібліотеку, які згодом будуть використовуватися в більшій програмі (або декількох більших програмах) - деякі з яких, можливо, ще не були написані. Зазвичай ви не знатимете, якщо і якими способами це може бути підкласифіковано.
Однак зазвичай підклас підтримує об'єкт, інваріантний класу, який він розширює. Так, мовою, де захист означає лише "підклас", і коли ми дисципліновані, щоб підкласи завжди підтримували інваріанти свого суперкласу, ви можете стверджувати, що вибір використання захищеного замість приватного втрачає лише мінімальну модульність .
Хоча я вже говорив про формальне міркування, часто вважається, що, коли програмісти неофіційно міркують про правильність свого коду, вони також іноді покладаються на подібні типи аргументів.