Refaktorisanje if/else uslova sa obrtanjem vrednosti

Na poslu sam nedavno u sklopu redovnog pregleda koda naišao na sledeći primer bespotrebnog if/else uslova, čije uklanjanje prilično dobro oslikava vrednost refaktorisanja.

Primer je dat u programskom jeziku CoffeeScript, ali rešenje je opšte primenljivo.

If/else uslov


if $scope.checkAll is false
  $scope.checkAll = true
  _.forEach $scope.clips, (item) - >
    item.DownloadSelected = true
else
  $scope.checkAll = false
  _.forEach $scope.clips, (item) - >
    item.DownloadSelected = false

Ovde vidimo da oba ishoda imaju zajednički izvršni deo koji je identičan, različita je samo bulova varijabla koja se dodeljuje (true/false). Dakle, kao prvi korak, izvlačimo zajednički deo koda van iz uslova:

Prvo refaktorisanje


if !$scope.checkAll
  $scope.checkAll = true
else
  $scope.checkAll = false

_.forEach $scope.clips, (item) - >
  item.DownloadSelected = $scope.checkAll

Već nakon prvog refaktorisanja kod je znatno kraći i čitljiviji za nas i naše kolege, ali moguće ga je dodatno uprostiti. Sad jasno vidimo da u oba ishoda varijabla obrće samu sebe. U sledećem koraku ćemo to eksplicirati:

Drugo refaktorisanje


$scope.checkAll = !$scope.checkAll
_.forEach $scope.clips, (item) - >
  item.DownloadSelected = $scope.checkAll

Kao što vidite, if/else uslov je potpuno nestao (magija)! Međutim, ostao je konfuzan naziv varijable checkAll, koja zbog imperativnog gramatičkog oblika zvuči kao funkcija. Potrebno je još i to promeniti kako ne bismo dovodili ljude u zabludu:

Konačna verzija


$scope.allChecked = !$scope.allChecked
_.forEach $scope.clips, (item) - >
  item.DownloadSelected = $scope.allChecked

Eto, nakon pospremanja, naš kod je postao duplo kraći i čitljiviji! Zato, čistimo uvek svoj kod kao što čistimo kuhinjski sto.

P.S. Kome je ostalo nejasno iz naslova, obrtanje vrednosti podrazumeva bulove (binarne) vrednosti koje se jedine mogu obrtati.

Happy coding 🙂

refactor

Advertisements

Ostavi komentar

Molimo vas da se prijavite koristeći jedan od sledećih načina da biste objavili svoj komentar:

WordPress.com logo

Komentarišet koristeći svoj WordPress.com nalog. Odjavite se / Promeni )

Slika na Tviteru

Komentarišet koristeći svoj Twitter nalog. Odjavite se / Promeni )

Fejsbukova fotografija

Komentarišet koristeći svoj Facebook nalog. Odjavite se / Promeni )

Google+ photo

Komentarišet koristeći svoj Google+ nalog. Odjavite se / Promeni )

Povezivanje sa %s