Недеља 13 — Пројектовање, рефакторисање и тестирање
Код: GitHub · преузми пројекат (ZIP) · задатак за самостални рад
Циљ
Одредити који објекат је одговоран за понашање и проверити да промена дизајна чува договорени уговор. Више класа само по себи није бољи дизајн.
Редослед
primer01_pocetni_kod: ради, али користи стринг ознаке и расуту логику.primer00_karakterizacija: забележити цену и нормалан животни циклус ПРЕ мењања.primer02_refaktorisano_resenje: погледати по једну издвојену одговорност.- Поново покренути карактеризацију: проверава исти сценарио на обе верзије.
primer03_testiranje: мале провере обрачуна, животног циклуса и система.
Тестове за постојеће исправно понашање чувамо током рефакторисања. Исправке грешака (дупле ознаке, заобилажење транзиција) засебно мењају уговор и имају регресионе провере.
Одговорности и јавни API
Vozilo: идентитет, цена по дану, депозит и доступност.rezervisi/oslobodiсу package-private операције модела, нису део јавног API-ја апликације.Rezervacija: валидира аргументе и затим заузима возило. И директан конструктор одбија већ заузето возило. Не треба претходно ручно позивати rezervisi().NacinObracunaCene: Strategy за стандардни/члански обрачун. У овом примеру стратегије су без променљивог стања; примењују се на непроменљиву цену и број дана.SistemIznajmljivanja: регистар возила и резервација. Дупла ознака се одбија; неуспешно креирање не мења доступност и не троши број резервације.
State и стварна енкапсулација
StanjeRezervacije и четири имплементације су приватни угњеждени типови
унутар Резервација. Имплементације су static nested класе; резервацију добијају
као аргумент. Клијент види само preuzmi(), vrati(), otkazi() и упит о стању.
Не постоји јавни promeniStanje/postaviStanje. State класе више нису јавни фајлови
у засебном пакету. Пакет стање садржи само јавни доменски изузетак.
| Стање | преузми | врати | откази |
|---|---|---|---|
| KREIRANA | AKTIVNA | одбиј | OTKAZANA, ослободи возило |
| AKTIVNA | одбиј | ZAVRSENA, ослободи возило | одбиј |
| ZAVRSENA | одбиј | одбиј | одбиј |
| OTKAZANA | одбиј | одбиј | одбиј |
Одбијање баца NedozvoljenaOperacijaException без промене стања. Јединственост регистрације возила гарантује један систем; ово није модел конкурентних резервација, базе података или распореда резервација по датумима.
Тестирање
Прво очекивање, затим акција и провера. Користимо мали Provera помоћник уместо
увођења нове библиотеке. JUnit може бити наставак истог принципа касније.
Промене захтева
Додати тротинет (IS-A), викенд обрачун (Strategy) или чување података у фајл (посебна одговорност). За сваки избор образложити одлуку. За веома мали животни циклус enum може бити довољно добар; циљ је разумети цену апстракције.