Софтверски обрасци и компоненте

Увод

Проф. др Игор Дејановић (igord at uns ac rs)

Креирано 2025-11-04 Tue 10:57, притисни ESC за мапу, Ctrl+Shift+F за претрагу, "?" за помоћ

Садржај

1. Увод

1.1. Развој софтвера

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

1.2. Искуство

  • Искусни пројектанти, тј. експерти, ипак праве добар дизајн.
  • Експерти знају нешто што почетници не знају. Шта је то?

1.3. Поновно коришћење добрих решења

Експерти ће поново примењивати решења која су се показала као добра у прошлости.

1.4. Поновна искористљивост - Reusability

Дефиниција са The Free Dictionary:

The ability to use all or the greater part of the same programming code or system design in another application.

1.5. Поновна искористљивост - Зашто?

  • Да не би измишљали топлу воду.
  • Употреба већ постојећих решења - бржа изградња софтвера.
  • Већ коришћен софтвер је боље тестиран - робусност.

1.6. Поновна искористљивост - Како?

  • На нивоу кода - библиотеке, оквири за развој (frameworks), софтверске компоненте итд.
  • На нивоу дизајна - дизајн обрасци.

2. Софтверски обрасци

2.1. Шта је образац?

Christopher Alexander и сар. су написали*:

Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice.

2.2. …ili у слободном преводу

Сваки образац описује проблем који се појављује наново у нашем окружењу, и затим описује суштину решења датог проблема на такав начин да решење можете применити милион пута а да никада не решите проблем на потпуно идентичан начин.

2.3. Шта је софтверски образац?

Рецепт настао на бази кумулираног експертског знања и искуства у решавању одређеног рекурентног проблема у развоју софтвера који описује проблем, решење и контекст у коме је решење примењиво као и предности и мане решења.

2.4. Градивни елементи софтверског образца

  • Назив - Обезбеђује лако референцирање на образац. Чини део вокабулара и омогућава комуникацију.
  • Проблем - Опис проблема и контекста у коме се образац може применити. Често се наводи и листа предуслова за употребу обрасца.
  • Решење - Елементи, међусобне везе, сарадња и одговорност. Апстрактно је да би могло бити примењено у различитим конкретним контекстима.
  • Последице - описују шта је то што добијамо а шта губимо употребом датог обрасца (trade-offs).

2.5. У чему је предност употребе софтверских образаца?

  • Учење на туђим грешкама.
  • Мање искусни пројектанти могу правити добар дизајн.
  • Лакша комуникација. Конзистентан вокабулар.
  • Лакша анализа дизајна сложеног софтвера. Обрасци имају своју мустру.
  • Лакше укључивање нових људи на пројекат.
  • Познавање унапред свих евентуалних проблема које решење може да изазове.

2.6. Избор програмског језика

Избор програмског језика и програмске парадигме са становишта софтверских образаца је важан!

2.7. Организација

  • Класификација и каталогизација у циљу лакшег проналажења.
  • Различити аутори - различите класификације.
  • Различити домени - различити обрасци.

2.8. Класификација ОО дизајн образаца

patternspace.png

2.9. Класификација ОО дизајн образаца

Класификација ОО дизајн образаца према [1]:

  • Фундаментални
  • Креациони
  • Партициони
  • Структурални
  • Обрасци понашања
  • Обрасци за конкурентни дизајн

3. Софтверски антиобрасци

3.1. Софтверски антиобрасци

  • У развоју софтвера антиобрасци представљају обрасце који су се показали неефикасним и контрапродуктивним у пракси*.
  • Још се зову и pitfalls или dark patterns.

3.2. Како их препознати?

Антиобрасци исказују следеће особине:

  • Рекурентан образац акције, процеса или структуре који је иницијално изгледао као добар али је у пракси показао да доноси више проблема него решења,
  • Рефакторисано решење проблема постоји, јасно је документовано и доказано у пракси.

3.3. Неки од примера антиобразаца

Примери антиобразаца су*:

  • Cargo cult programming - Коришћење образаца и метода без разумевања због чега се користе.
  • God object - Концентрисање превише функционалности у један елемент дизајна (најчешће класу).
  • Big ball of mud - Систем без јасне структуре.
  • Copy and paste programming - Копирање и измена постојећег кода уместо креирања генеричког решења.
  • Not Invented Here (NIH) sindrom - Тенденција ка измишљању топле воде уместо коришћења постојећег, опробаног решења.
  • Premature optimization - Оптимизовање софтвера прерано на уштрб доброг дизајна и функционалности.
  • Dependency hell - Проблеми са верзијама зависних компоненти и софтвера.

3.4. Литература

  • E. Gamma, R. Helm, R. Johnson, and J. M. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Professional, 1994
  • M. Grand, Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML, John Wiley & Sons, Inc., vol. 1, 2002
  • Anti-pattern, From Wikipedia, the free encyclopedia