Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції 2012-2013ооп.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.61 Mб
Скачать

6.10. Закон Деметри

Закон Деметри (англ. Law of Demeter, LoD) - правило дизайну при розробленні програмного забезпечення, зокрема об' єктно - орієнтованих програм. Узагальнено, Закон Деметри є специфічним випадком слабкої зв' язності. Правило було винайдено у Північносхідному Університеті (Бостон, Масачусетс, США) наприкінці 1987 та може бути сформульованим одним з наступних способів:

Кожен модуль має володіти обмеженним знанням про інші модулі: тільки про модулі, які мають "близьке" відношення до даного модуля.

Кожен модуль має розмовляти тільки зі своїми друзями, не розмовляти з незнайомцями.

Звертатись тільки до безпосередніх друзів

Фундаментальною ідеєю є ті, що об' єкт має мати якнайменше уявлення про структуру та властивості чого завгодно (включаючи власні підкомпоненти). Назва походити з проекту "Деметра", що використовував ідеї аспекто- орієнтованого та адаптивного програмування. Проект було названо на честь Деметри, грецької богині землеробства, щоб підкреслити переваги філософії програмування "знизу-нагору".

У контексті об' єктно - орієнтованого програмування, Закон Деметри більш точно називати "Закон Деметри для функцій\методів". У цьому разі, об' єкт А може використовувати сервіс (викликати метод) об' єкта B, та об' єкт А не може "через" об' єкт В отримати доступ до іншого об' єкта, З, та використовувати його сервіси. Якби це було можливо, це означало б, що об' єкт А явно потребує більшого знання про внутрішню структуру об' єкта В. Замість цього, інтерфейс В має бути змінено, якщо необхідно, таким чином, щоб напряму оброблювати запити об' єкта А, передаючи їх відповідним підкомпонетам. Як альтернатива, А може мати пряме посилання на об' єкт З та викликати методи безпосередньо з нього. Якщо слідувати закону, тільки об' єкт В знає свою внутрішню структуру.

Більш формально, Закон Деметри для функцій вимагає, що метод М об' єкта Про має викликати методи тільки наступних типів об' єктів :

  • власне самого Про

  • параметрів М

  • будь-яких об' єктів, створених у межах М

  • прямих компонентних об' єктів Про

  • глобальних змінних, доступних О, у межах М

Практично, об' єкт - клієнт має уникати викликів методів об' єктів, внутрішніх членів, повернених методом об' єкта - сервісу. Для багатьох сучасних об' єктно - орієнтованих мов програмування, що використовують крапку, як кваліфікатор члена класу, закон може бути перефразовано як "Використовуйте лише одну крапку". Таким чином, код a.b.Method() порушує Закон Деметри, а код a.Method() є коректним.

Переваги та недоліки

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

Недоліком Закону Деметри є ті, що іноді потребує створення великої кількості малих методів - адаптерів (делегатів), для передачі викликів методу до внутрішніх компонентів. Більше того, інтерфейс класу може статі перевантаженим, так як вміщує методи внутрішніх класів, що порушує принцип високої зв' язності. Та це також може бути сигналом поганого об' єктно - орієнтованого дизайну.

Багатоярусна архітектура може розглядатися, як приклад імплементації Закону Деметри у програмній системі. У такій архітектурі код шкірного з ярусів може викликати тільки код свого ярусу та код з нижчого ярусу. Виклик "через ярус" є порушенням багатоярусної архітектури.

Література

  1. Катаев М.Ю. Объектно-ориентированное программирование: Учебное пособие. - Томск: Томский межвузовский центр дистанционного образования, 2000. - 145 с.

  2. Кент Рейсдорф и Кен Хендерсон BORLAND C++BUILDER. ОСВОЙ САМОСТОЯТЕЛЬНО

  3. Лафоре Р. Обьектно–ориентированное программирование в С++. 4-е изд.: – СПб: Питер, 2004 – 902 с.

  4. Львов М.С., Співаковський О.В. Вступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  5. М.С. Львов. О.В. СпіваковськийВступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  6. Шилдт Герберт. Искусство программирования на С++. Санкт-Питербург, 2005.-496 с., ил.

  7. Шилдт, Герберт. C++: руководство для начинающих, 2-е издание. : Пер. с англ. — М. : Издатель- ский дом "Вильяме", 2005. — 672 с. : ил. — Парал. тит. англ.

  8. Эккель Брюс. Философия С++. Введение в стандартный С++ (2-е издание). - СПб: Питер, 2004 – 573 с.

  9. Эккель Брюс. Философия С++. Практическое программирование (2-е издание). - СПб: Питер, 2004 – 610 с., ил.

  10. Юркова Т. А., Ушаков Д. М., Паскаль для школьников. — СПб.: Питер, 2010. — 256 с.: ил.

  11. Visual Studio 2010 и введение в .NET 4.0 и для профессионалов. Макки, Алекс : Пер. с англ. — М. : ООО И. Д. Вильямс". 2010. — 416 с. : ил. — Парал, тит. англ.