*GRASP* (англ.: general responsibility assignment software patterns — агульныя шаблоны размеркавання адказнасцей; таксама існуе англійскае слова "**grasp**" — «кантроль, хватка») — шаблоны, якія выкарыстоўваюцца у аб'ектна-арыентаваным праектаванні для вырашэння агульных задач па прызначэнню адказнасцей класам і аб'ектам.

У кнізе Крэга Лармана «Ужыванне *UML* *і шаблонаў праектавання»* 9 такіх шаблонаў: кожны дапамагает вырашыць некаторую праблему, якая ўзнікае як у аб'ектна-арыентаваным аналізе, гэтак і ў практычна ўсякім праекце па распрацоўцы праграмнага забяспечвання. Такім вобразам, шаблоны «G.R.A.S.P.» — добра дакументаваныя, стандартызаваныя і правераныя часам прынцыпы аб'ектна-арыентаванага аналізу, а не спроба прыўнесці нешта прынцыпова новае.

Каталог шаблонаў
----------------

Сціслая характарыстыка дзевяці шаблонаў:

### 1. Інфармацыйны эксперт (Information Expert)

Шаблон вызначае базавы прынцып размеркавання адказнасцей: 

> Адказнасць мае быць прызначана таму, хто валодае максімумам патрэбнай інфармацыі для выканання — **інфармацыйнаму эксперту**.
> 
> 

Гэты шаблон — самы яскравы і важны з дзевяці. Калі яго не ўлічыць — атрымаецца спагеці-код, у якім цяжка разабрацца. 

Лакалізацыя ж адказнасцей, якая праводзіцца згодна шаблону:

* Павялічвае:
	+ Інкапсуляцыю;
	+ Прастату ўспрымання;
	+ Гатоўнасць кампанентаў да паўторнага выкарыстання;
* Зніжае:
	+ ступень зачэплівання.

### 2. Стваральнік (Creator)

Клас павінен ствараца экзэмпляры тых класаў, якія ён можа:

* Змяшчаць ці агрэгаваць;
* Запісваць;
* Выкарыстоўваць;
* Ініцыялізаваць, маючы патрэбныя даныя.

Можна сказаць, што шаблон «Creator» - гэта інтэрпрэтацыя шаблону «Information Expert» (глядзіце пункт № 1) у пытаннях стварэння аб'ектаў.

Альтэрнатыва — шаблон «Фабрыка» (стварэнне аб'ектаў канцынтруецца ў асобным класе).

### 3. Кантролер (Controller)

* Адказвае за аперацыі, запыты на якія прыходзяць ад карыстальніка, і можа здзяйсняць сцэнарыі аднаго ці некалькіх варыянтаў выкарыстання (напрыклад, стварэнне і выдаленне);
* Не выконвае працу самастойна, а дэлегуе кампетэнтным выканаўцам;
* Можа ўяўляць сабой:
	+ Сістэму ў цэлым;
	+ Падсістэму;
	+ Каранёвы аб'ект;
	+ Прыладу.

### 4. Слабае зачэпліванне (Low Coupling)

«Ступень зачэплівання» — мера неадрыўнасці элемента ад іншых элементаў (альбо мера даных, якую ён мае пра іх).

«Слабае» зачэпліванне з'яўляецца ацэначнай мадэллю, якая дыктуе, як размеркаваць абавязкі, якія трэба падтрымваць. 

«Слабае» зачэпліванне — размеркаванне адказнасцей і даных, якія забяспечваюць узаемную незалежнасць класаў. Клас з «слабым» зачэпліваннем:

* Мае слабую залежнасць ад іншых класаў;
* Не залежыць ад знешніх змяненняў (змяненне ў адным класе аказвае слабы ўплыў на іншыя класы);
* Просты для паўторнага выкарыстання.

### 5. Высокая злучанасць (High Cohesion)

**Высокая злучанасць класа** — гэта ацэнкавая мадэль, скіраваная на ўтрыманне аб'ектаў належным чынам сфакусаванымі, кіраванымі і зразумелымі. Высокая злучанасць звычайна выкарыстоўваецца для падтрымання нізкага зачаплення. Высокая злучанасць азначае, што абавязкі дадзенага элемента цесна злучаны і сфакусаваны. Разбіццё праграм на класы і падсістэмы з'яўляецца прыкладам дзейнасці, якая павялічвае злучанасць сістэмы.

І наадварот, нізкая злучанасць — гэтая сітуацыя, пры якой дадзены элемент мае замнога незвязаных абавязкаў. Элементы з нізкай злучанасцю часта пакутуюць ад таго, што іх цяжка зразумець, цяжка скарыстаць, цяжка падтрымваць.

**Злучанасць** **класа** — мера сфакусаванасці прадметных абласцей яго метадаў:

* «Высокая» злучанасць — *сфакусаваныя* падсістэмы (прадметная вобласць вызначаная, кіруемая і зразумелая);
* «Нізкая» злучанасць — *абстрактныя* падсістэмы абцяжараны:
	+ Успрыманне;
	+ Паўторнае выкарыстоўванне;
	+ Падтрымка;
	+ Устойлівасць да знешніх змяненняў.

### 6. Полімарфізм (Polymorphism)

Будова і паводзіны сістэмы:

* Вызначаюцца данымі;
* Зададзены паліморфнымі аперацыямі яе інтэрфейсу.

**Прыклад**: Адаптацыя камерцыйнай сістэмы да *разнастайнасці* сістэм уліку падаткаў можа быць забяспечана праз знешні інтэрфейс аб'ектаў-адаптараў.

### 7. Чыстая выдумка (Pure Fabrication)

Не адносіцца да прадметнай вобласці, але: 

* Змяншае зачэпліванне;
* Павялічвае злучанасць;
* Спрашчае паўторнае выкарыстанне.

«Pure Fabrication» адлюстроўвае канцэпцыю сэрвісаў у мадэлі праблемна-арыентаванага праектавання. 

**Прыклад задачы**: Не выкарыстоўвая сродкі класа «А», унесці яго аб'екты ў базу даных.

**Вырашэнне**: Стварыць клас «Б» для запісу аб'ектаў класа «А».

### 8. Перанакіраванне (Indirection)

Слабае зачэпліванне між элементамі сістэмы (і магчымасць паўторнага выкарыстання) забяспечваецца прызначэннем прамежкавага аб'екта іх **пасярэднікам**.

**Прыклад**: У архітэктуры Model-View-Controller, *кантролер* (*англ. controller*) саслабляе зачэпліванне даных (*англ. model*) з іх прадстаўленнем (*англ. view*).

### 9. Устойлівасць да змяненняў (Protected Variations)

Шаблон бароніць элементы ад змянення іншымі элементамі (аб'ектамі ці падсістэмамі) з дапамогай вынясення ўзаемадзеяння ў фіксаваны іінтэрфейс, праз які (і толькі праз які) магчыма ўзаемадзеянне між элементамі. Паводзіны могуць вар'іравацца толькі праз стварэнне іншай рэалізацыі інтэрфейса.

Зноскі
------

1. ↑  Larman, Craig. Applying UML and Patterns — Third Edition.