Композиційне програмування
Основні аспекти
Серед найважливіших програмних понять і принципів виділяються поняття композиції і принцип композиційності, який тлумачить програми як функції, що будуються з інших функцій за допомогою спеціальних операцій, названих композиціями. Принцип композиційності став основним в композиційному програмуванні. Композиції класифікуються рівнями даних і функцій, а також типами аргументів. Експлікація композицій відповідає абстрактному розгляду функцій як слабоаплікативних функцій, а їх уточнення будується на основі поняття детермінанта композиції як відображення спеціального типу. Клас аплікативних композицій призначений для конструювання широкого класу програм.
Наукова школа
Школа програмології та її застосувань
Наукові керівники школи — Редько Володимир Нікіфорович, доктор фізико-математичних наук, професор, академік НАН України, Нікітченко Микола Степанович, доктор фізико-математичних наук, професор, завідувач кафедри теорії та технології програмування.
Основні напрями наукових досліджень: композиційне програмування та його сучасні варіанти (експлікативне та еталонне програмування) — теорії дескриптивних та декларативних програмних алгебраїчних структур, які виступають формальними та адекватними моделями структур даних, програм та засобів їх конструювання; теорія композиційно-номінативних логік, орієнтованих на моделювання предметних областей та специфікацію програмних систем; теорія баз даних та знань; теорія абстрактної обчислюваності; розробка наукомістких інформаційних технологій та систем різноманітного призначення.
Композиційний підхід в об'єктно-орієнтованому програмуванні
Ще однією особливістю об'єктно-орієнтованого програмування є можливість реалізовувати так званий композиційний підхід. Полягає він в наступному: є клас-контейнер, який включає в себе виклики інших класів. У результаті виходить, що створюючи об'єкт класу-контейнера, ми одночасно створюємо і об'єкти включених до нього класів.
Щоб зрозуміти навіщо потрібна композиція в програмуванні, можна як завжди провести аналогію з реальним світом. Так переважна більшість природних, біологічних і технічних об'єктів складаються з інших більш простих частин, по своїй суті, які також є об'єктами. Наприклад, людина складається з різних органів (серце, шкіра та ін.), Комп'ютер — з різного «заліза» (процесор, ОЗУ, диск і т. д.).
Слід розуміти, що «композиція» та «спадкування» — досить різні властивості реальних і віртуальних систем. Спадкування передбачає приналежність до якоїсь спільності (схожість), а композиція — формування цілого з частин.
Ще раз: при створенні об'єкта, що належить класу-контейнеру, автоматично створюються об'єкти-частини, з яких він ніби складається. Властивості і методи об'єктів частин визначаються в їх класах. Програмісти можуть створювати цілі колекції вбудованих класів.
Розглянемо використання композиції при програмуванні на Python за допомогою конкретного прикладу.
Опис завдання
Для початку вирішимо це завдання логічно. Кімната — це прямокутний паралелепіпед, що складається з шести прямокутників. Його площа являє собою суму площ складових його прямокутників. Площа прямокутника дорівнює добутку його довжини на ширину. Шпалери клеяться тільки на стіни, отже площі верхнього і нижнього прямокутників нам не потрібні. Площа одного прямокутника дорівнює x * z, другого — у * z. Протилежні прямокутники рівні, значить загальна площа чотирьох прямокутників буде дорівнює S = 2xz + 2уz = 2z (x + y). Потім з цієї площі треба буде відняти загальну площу дверей і вікон. Двері і вікна — це прямокутники (як обчислити їх площу має бути зрозуміло).
Створення класів-частин
Тепер приступимо до створення програми. У відповідність з досліджуваної темою написати її треба використовуючи об'єктно-орієнтовану парадигму програмування, та ще й застосовуючи «композиційний підхід».
Можна помітити, що фактично у нас є три типи об'єктів — це об'єкти-вікна, об'єкти-двері і об'єкти-кімнати. Виходить три класи. Вікна та двері є частинами приміщення, а значить можуть створюватися усередині класу «кімнати». Крім того, для даної задачі істотне значення мають лише дві властивості: довжина і ширина. Тому класи «вікна» і «двері» можна об'єднати в один. Зрозуміло, що якщо для завдання були б важливі інші властивості (наприклад, товщина скла, матеріал), то можливо варто було б створити два класи.
class Win_Door:
def __init__(self,x,y): self.square = x * y
Тут при виклику класу Win_Door буде автоматично створений атрибут square об'єкта, який є посиланням на значення площі об'єкта.
Створення класу-контейнера
Можна по-різному реалізувати клас-контейнер. Є підозра, що багато залежить від задачі, розв'язуваної програмістом, його майстерності і смаку. Класи-частини можна викликати в методі __init__, тим самим об'єкти-частини будуть автоматично створюватися при створенні об'єкта-контейнера. Проте в даній задачі ми підемо іншим шляхом: вікна і двері будуть створюватися спеціальним для цих цілей методом. Також клас повинен містити метод для обчислення площі необхідних шпалер (wallpapers). В кінці можна додати метод, в якому реалізований висновок тих чи інших даних.
class Room:
def __init__(self,x,y,z): self.square = 2 * z * (x + y) def win_door(self, d,e, f,g, m=1,n=1): self.window = Win_Door(d,e) self.door = Win_Door(f,g) self.numb_w = m self.numb_d = n def wallpapers(self): self.wallpapers = self.square - \ self.window.square * self.numb_w \ - self.door.square * self.numb_d def printer(self): print ("Площадь стен комнаты равна "\ ,str(self.square)," кв.м") print ("Оклеиваемая площадь равна: ", \ str(self.wallpapers), " кв.м")
У методі __init__ створюється атрибут square об'єкта, який представляє собою площу стін кімнати. Метод приймає три аргументи: довжину, ширину і висоту приміщення.
У методі win_door створюються два об'єкти: window і door, а також атрибути numb_w і numb_d (в останніх будуть міститися значення про кількість вікон і дверей). Якщо при виклику даного методу в програмі не буде вказано кількість вікон і дверей, то за замовчуванням будуть підставлені значення рівні 1.
Метод wallpapers обчислює площа_необхідних_шпалер = площа_кімнати — площа_вікна * кількість_вікон — площа_двері * кількість_дверей. У коді даний рядок розбит на кілька рядків за допомогою знака \ (так роблять, якщо рядок дуже довгий). Також зверніть увагу, як відбувається звернення до властивостей square об'єктів-частин: вказується об'єкт класу Room (в класі його замінює self), далі об'єкт-частина, і нарешті, сам атрибут (властивість) об'єкта-частини.
Література
1. Лаврищева Катерина Михаліївна. Підручник "Програмна інженерія". (Видавець, рік, кількість сторінок?)
Зовнішні посилання
- Підручник "Програмна інженерія", aвтор: Лаврищева Катерина Михаліївна[недоступне посилання з 11.04.2018]
- Програмологія та її застосування, 2013
- (рос.)Композиционный подход в объектно-ориентированном программировании. Урок 7
- (рос.)Редько В.Н. Основания композиционного программирования. Журнал "Программирование" , 1979, №3: (С. 3-13)