Композиційне програмування

Основні аспекти ред.

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

Наукова школа ред.

Школа програмології та її застосувань ред.

Наукові керівники школи — Редько Володимир Нікіфорович, доктор фізико-математичних наук, професор, академік НАН України, Нікітченко Микола Степанович, доктор фізико-математичних наук, професор, завідувач кафедри теорії та технології програмування.

Основні напрями наукових досліджень: композиційне програмування та його сучасні варіанти (експлікативне та еталонне програмування) — теорії дескриптивних та декларативних програмних алгебраїчних структур, які виступають формальними та адекватними моделями структур даних, програм та засобів їх конструювання; теорія композиційно-номінативних логік, орієнтованих на моделювання предметних областей та специфікацію програмних систем; теорія баз даних та знань; теорія абстрактної обчислюваності; розробка наукомістких інформаційних технологій та систем різноманітного призначення.

Композиційний підхід в об'єктно-орієнтованому програмуванні ред.

Ще однією особливістю об'єктно-орієнтованого програмування є можливість реалізовувати так званий композиційний підхід. Полягає він в наступному: є клас-контейнер, який включає в себе виклики інших класів. У результаті виходить, що створюючи об'єкт класу-контейнера, ми одночасно створюємо і об'єкти включених до нього класів.

Щоб зрозуміти навіщо потрібна композиція в програмуванні, можна як завжди провести аналогію з реальним світом. Так переважна більшість природних, біологічних і технічних об'єктів складаються з інших більш простих частин, по своїй суті, які також є об'єктами. Наприклад, людина складається з різних органів (серце, шкіра та ін.), Комп'ютер — з різного «заліза» (процесор, ОЗУ, диск і т. д.).

Слід розуміти, що «композиція» та «спадкування» — досить різні властивості реальних і віртуальних систем. Спадкування передбачає приналежність до якоїсь спільності (схожість), а композиція — формування цілого з частин.

Ще раз: при створенні об'єкта, що належить класу-контейнеру, автоматично створюються об'єкти-частини, з яких він ніби складається. Властивості і методи об'єктів частин визначаються в їх класах. Програмісти можуть створювати цілі колекції вбудованих класів.

Розглянемо використання композиції при програмуванні на Python за допомогою конкретного прикладу.

Опис завдання ред.

Для початку вирішимо це завдання логічно. Кімната — це прямокутний паралелепіпед, що складається з шести прямокутників. Його площа являє собою суму площ складових його прямокутників. Площа прямокутника дорівнює добутку його довжини на ширину. Шпалери клеяться тільки на стіни, отже площі верхнього і нижнього прямокутників нам не потрібні. Площа одного прямокутника дорівнює x * z, другого — у * z. Протилежні прямокутники рівні, значить загальна площа чотирьох прямокутників буде дорівнює S = 2xz + 2yz = 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. Лаврищева Катерина Михаліївна. Підручник "Програмна інженерія". (Видавець, рік, кількість сторінок?)

Зовнішні посилання ред.