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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

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

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

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

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

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

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

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

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

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

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

Розглянемо використання композиції при програмуванні на 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. Лаврищева Катерина Михаліївна. Підручник "Програмна інженерія". (Видавець, рік, кількість сторінок?)

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