Alkalmazásaink működése során különböző feltételek teljesülése (nem teljesülése) esetén más és más műveletek elvégzésére lehet szükségünk.
A feltételes kifejezés legyen
- könnyen olvasható, beszédes,
- többször felhasználható.
Ezt a két feltételt teljesítő refactoring-folyamatot mutatja be a következő példa.
Képzeljünk el egy feladatkezelő alkalmazást.
Ennek egy részlete:
...
if( task::getNumberOfOpenTask() != 0 ) { ... }
...
if( task::getNumberOfOpenTask() == 0 ) { ... }
...
Az üzleti logika szerint bizonyos tevékenységeket kell elvégeznünk attól függően, hogy vannak-e nyitott feladatok.
A lekérdező statikus hívás kétszer is szerepel a kódban, vagyis kódismétléssel van dolgunk.
Emeljük ki változóba a nyitott feladatok értékét.
$numberOfTaskOpen = task::getNumberOfOpenTask();
if( $numberOfOpenTask != 0 ) { ... }
...
if( $numberOfOpenTask == 0 ) { ... }
A feladatok száma 0, vagy annál nagyobb szám - legalábbis az üzleti logika szerint most ez a mérvadó.
A könnyebb érthetőség érdekében alakítsuk át a feltételvizsgálatot.
$numberOfTaskOpen = task::getNumberOfOpenTask();
if( 0 < $numberOfOpenTask ) { ... }
...
if( !( 0 < $numberOfOpenTask ) ) { ... }
Azt látjuk, hogy a két feltétel gyakorlatilag megegyezik.
Emeljük ki a feltételvizsgálatot egy függvénybe.
function isOpenTask() {
if( 0 < task::getNumberOfOpenTask() ) {
return true;
}
return false;
}
if( isOpenTask() ) { ... }
...
if( !isOpenTask() ) { ... }
A kiemelt függvényt most már szabadon meg tudjuk hívni, viszont egyelőre csak az adott forráson belül.
Helyezzük a függvényünket egy osztályba, hogy máshol is fel tudjuk használni.
Legjobb helye - már a neve alapján is -, a task osztályban van.
class task {
public static function isOpenTask() {
if( 0 < self::getNumberOfOpenTask() ) {
return true;
}
return false;
}
public static function getNumberOfOpenTask() { ... }
}
if( task::isOpenTask() ) { ... }
...
if( !task::isOpenTask() ) { ... } // nincs nyitott feladat
A fenti kódban most már csak a "nincs nyitott feladat" rész szorul továbbgondolásra.
A tagadást jelölő "!"-jel gondolkodásra késztet, nem is biztos, hogy elsőre feltűnik, így hibás értelmezésre vezethet. (Ezért is kommentezhettük be.)
Készítsünk egy tagadó formájú metódust.
class task {
public static function isOpenTask() {
if( 0 < self::getNumberOfOpenTask() ) {
return true;
}
return false;
}
public static function getNumberOfOpenTask() { ... }
public static function isNotOpenTask() {
return !self::isOpenTask();
}
}
if( task::isOpenTask() ) { ... }
...
if( task::isNotOpenTask() ) { ... }
A kód most már tiszta, és beszédes.
A "nincs nyitott feladat" megjegyzést is kitörölhetjük. A kód magáért beszél.