Пројектни узорци

С Википедије, слободне енциклопедије

У софтверском инжењерству, пројектни узорак, шаблон или образац (енгл. design pattern) је опште, поново употребљиво решење за честе проблеме који се срећу приликом пројектовања софтвера. Пројектни узорак није готов дизајн који се може директно претворити у изворни код. Он служи само као опис или шаблон прилагођен да реши неки општији пројектни проблем у посебном контексту. Објектно оријентисани пројектни узорци су обично описи комуницирајућих објеката и класа, без одређивања конкретних класа и објеката.

Пројектни узорци припадају домену модула и веза између њих. На вишем нивоу су архитектурни узорци који су већи по опсегу, а обично описују општије обрасце који су везани за цео систем. [1]

Нису сви софтверски узорци у исто време и пројектни узорци. На пример, алгоритми не решавају пројектне проблеме, већ само рачунарске проблеме.

Историјат[уреди | уреди извор]

Узорци су првобитно настали као концепт у архитектури које је осмислио Кристофер Александер (1977-79). Године 1987, Кент Бек и Вард Канингем су почели да експериментишу са идејом примене узорака у програмирању и изнели су своје резултате исте године на OOPSLA конференцији. Наредних година су Бек, Канингем и остали наставили рад на узорцима.

Пројектни узорци су добили на популарности 1994. године, када је објављена књига Design Patterns: Elements of Reusable Object-Oriented Software коју су написали Ерих Гама, Ричард Хелм, Ралф Џонсон и Џон Влисајдс (познатији као „Gang of Four“ или често скраћено GoF). Те исте године је одржана и прва конференција о пројектним узорцима.

Пракса[уреди | уреди извор]

Пројектни узорци могу да убрзају процес развоја софтвера тако што нуде тестиране и доказане парадигме развоја. Ефективно пројектовање софтвера захтева узимање у обзир проблема који нису видљиви све до касних фаза имплементације. Поново употребљиви пројектни узорци помажу да се избегну ситна проблематична питања која касније могу да изазову огромне проблеме, а побољшавају и читљивост изворног кôда оним програмерима који су већ упознати са пројектним узорцима.

Да би се повећала флексибилност, пројектни узорци често уводе додатни ниво комплексности, који у неким случајевима може да усложни дизајн и да чак утиче и на перформансе апликације.

По дефиниције, нови узорак се мора писати од почетка за сваку апликацију која га користи. Пошто неки аутори ово виде као корак уназад од поновне употребљивости компонената, истраживачи су радили на томе да претворе пројектне узорке у готове компоненте. Мејер и Арнаут тврде са имају успешност од 66% у претварању у компоненте најпознатијих узорака. [2]

Често, људи само разумеју како да примене неки пројектни дизајн на одређени проблем. Овакве технике су тешко примењиве на шири скуп проблема. Пројктни узорци нуде општија решења, документовани на начин који не захтева везивање за специфичности одређеног проблема.

Структура[уреди | уреди извор]

Пројектни узорци су састављени од неколико делова (погледати документацију испод). Најинтересантнији одељци су „Структура“, „Учесници“ и „Колаборација“. Ови одељци описују основну дизајнерску идеју: прототип микроархитектуре коју програмери копирају и прилагођавају њиховом дизајну да би решили проблем који се изнова понавља. Микроархитектура је скуп делова програма (класа, метода...) и веза између њих. Програмери искоришћавају пројектне узорке тако што у сопствени дизајн уводе ове прототипске микроархитектуре, што доводи до тога да њихове микроархитектуре дизајном почињу да личе на основну идеју пројектног узорка.

Поред овога, узорци омогућавају програмерима да комуницирају међусобно користећи имена која су већ увелико у употреби, разумевајући се лакше на тај начин. Основни пројектни узорци се временом могу побољшавати, чинећи их тако робуснијим од ad-hoc дизајна.

Доменски специфични узорци[уреди | уреди извор]

Уложен је посебан труд да се направе пројектни узорци за одређене домене, укључујући и постојеће пројектне узорке, али и доменски специфичне пројектне узорке. Примери оваквих узорака су пројектни узорци корисничког сучеља [3] , узорци визуелизације података [4] и узорци у веб-дизајнирању [5].

Класификација и листа[уреди | уреди извор]

Пројектни узорци су оригинално груписани у категорије: узорци креирања, узорци структуре и узорци понашања, а описани концептима делегирања, агрегације и консултације. Још једна класификација је увела и појам архитектурног узорка који се може применити на нивоу архитектуре система, а пример таквог узорка је Model-View-Controller узорак.

Име Опис У књизи Design Patterns У књизи Code Complete
Узорци креирања
Уникат Обезбеђује да класа има само једну инстанцу и даје глобални приступ тој инстанци. Да Да
Прототип Специфицира врсте објеката који се креирају коришћењем прототипске инстанце и креира нове објекте копирањем прототипа. Да Не
Фабрички метод Дефинише интерфејс за креирање објеката, али оставља поткласама да одлуче чије објекте креирају. Узорак допушта класи да делегира стварање објекта поткласи. Да Да
Апстрактна фабрика Обезбеђује интерфејс за креирање фамилија повезаних или зависних објеката без специфицирања конкретних класа фамилије објеката. Да Да
Градитељ Раздваја конструкцију комплексног објекта од његове репрезентације тако да исти процес може да креира различите репорезентације. Да Не
Лења иницијализација Тактички одлаже стварање објекта, израчунавање неке вредности или други скуп процес док он први пут не буде потребан. Не Не
Пул конекција Избегава скупе операције вишеструког конектовања и дисконектовања. ? ?
Пул објеката Избегава скупа дохватања и отпуштања ресурса поново употребљавајући објекте који се више не користе. Не Не
Узорци структуре
Композиција Компонује објекте у структуру стабла (хијерархија целина-део). Композиција омогућава клијентима да униформно третирају и индивидуалне објекте и њихове композиције. Да Да
Декоратер Динамички додаје могућности неком објекту. Декоратер представља флексибилну алтернативу извођењу за проширивање функционалности. Да Да
Мува Дељење малих објеката (објеката без стања) да би се избегла хиперпродукција објеката. Да Не
Адаптер Конвертује интерфејс класе у други интерфејс који клијенти очекују. Адаптер омогућава рад заједно класа које иначе то не би могле због различитог интерфејса. Да Да
Фасада Пружа јединствен интерфејс скупу различитих интерфејса неког подсистема. Фасада дефинише интерфејс вишег нивоа да би се подсистем лакше користио. Да Да
Прокси Реализује замену (сурогат) другог објекта који контролише приступ оригиналном објекту. Да Не
Мост Раздваја апстракцију од њене имплементације да би се могле независно мењати. Да Да
Узорци понашања
Посматрач Дефинише зависност 1:N између објеката, такву да када један објекат промени стање сви зависни објекти буду обавештени и аутоматски се ажурирају. Да Да
Итератор Обезбеђује секвенцијални приступ елементима неког агрегатног објекта без експонирања унутрашње структуре тог агрегата. Да Да
Стратегија Дефинише фамилију алгоритама, енкапсулирајући сваки и чини их међусобно замењивим. Стратегија омогућава једноставну промена алгоритма у време извршења. Да Да
Шаблонски метод Дефинише костур неког операционог алгоритма, делегирајући поједине кораке поткласама. Шаблонски метод омогућава поткласама да редефинишу одређене кораке алгоритма без измене његове структуре. Да Да
Стање Омогућава објекту да мења своје понашање када се мења његово унутрашње стање. Изгледа када да објекат мења своју класу. Да Не
Подсетник Без нарушавања енкапсулације снима и екстернализује стање неког објекат, тако да омогући да се објекат касније може вратити у дато стање. Да Не
Посредник Дефинише објекат који енкапсулира како скуп објеката интерагује. Посредник омогућава слабо спрезање објеката што постиже чувањем објеката који се међусобно реферишу, а то дозвољава да им се интеракција мења независно. Да Не
Команда Енкапсулира захтев у један објекат, омогућавајући да се клијенти параметризују различитим захтевима, да се захтеви испоручују кроз ред чекања, да се прави дневник захтева и да се ефекти извршеног захтева пониште. Да Не
Ланац одговорности Избегава непосредно везивање пошиљаоца захтева са примаоцем захтева, дајући шансу већем броју објеката да обраде захтев. Ланац одговорности повезује објекте примаоце захтева у ланац и прослеђује захтев низ ланац док га неки објекат не обради. Да Не
Посетилац Репрезентује једну операцију коју треба применити на елементе једне објектне структуре. Посетилац омогућава дефинисање нове операције без измене класа елемената над којим се извршава. Да Не
Интерпретер За дати језик дефинише репрезентацију његове граматике, као и интерпетер који користи ту репрезентацију да интерпретира исказе језика. Да Не

Документација[уреди | уреди извор]

Документација пројектног узорка описује контекст у коме се узорак користи, проблематику које узорак треба да реши и предложено решење. Не постоји један стандардни формат за документовање пројектних узорака. Штавише, постоји доста различитих формата које су користили различити аутори узорака. Ипак, према Мартину Фаулеру, неке форме за описивање пројектних узорака су постале познатије од других, а самим тим и постале основа за описивање нових пројектних узорака. [6] Један од чешће коришћених формата документације је онај који су користили Ерих Гама и остали („Gang of Four“) при писању књиге „Design Patterns“. Тај формат садржи следеће одељке:

  • Име узорка и класификација: Јединствено описно име узорка које служи да се он идентификује.
  • Намера: Опис циља који стоји иза узорка и разлози за његово коришћење.
  • Познат и као: Остала имена узорка.
  • Мотивација: Опис проблема и контекст где је узорак применљив.
  • Применљивост: Ситуације у којима је узорак применљив; контекст узорка.
  • Структура: Графичка представа узорка. У ову сврху се могу користити дијаграми класа и/или остали дијаграми.
  • Учесници: Списак класа и објеката коришћених у узорку и њихових улога у дизајну.
  • Колаборација: Опис како класе и објекти коришћени у узорку комуницирају међусобно.
  • Консеквенце: Опис резултата и последица примене узорка, као и разумевање цене и добити примене узорка.
  • Имплементација: Опис имплементације узорка.
  • Примери кôда: Илустративни пример како се узорак може употребити у изворном кôду.
  • Примери употреба: Примери употреба узорка из стварног живота.
  • Повезани или слични узорци: Остали узорци који су на неки начин у вези са овим узорком. Дискусија између овог и осталих сличних узорака.

Референце[уреди | уреди извор]

  1. ^ Robert C. Martin. Design Principles and Design Patterns Архивирано на сајту Wayback Machine (6. септембар 2015) (језик: енглески)
  2. ^ Meyer, Bertrand; Karine Arnout (Јул 2006). "Componentization: The Visitor Example" (језик: енглески). IEEE Computer 39 (7): 23–30.
  3. ^ Laakso, Sari A. (2003-09-16). "Collection of User Interface Design Patterns" (језик: енглески). University of Helsinki, Dept. of Computer Science.
  4. ^ Heer, J.; M. Agrawala (2006). "Software Design Patterns for Information Visualization" (језик: енглески). IEEE Transactions on Visualization and Computer Graphics 12
  5. ^ Yahoo! Design Pattern Library Архивирано на сајту Wayback Machine (29. фебруар 2008) (језик: енглески)
  6. ^ Fowler, Martin (01.08.2006). "Writing Software Patterns" (језик: енглески)

Литература[уреди | уреди извор]


Спољашње везе[уреди | уреди извор]