Object Orientation Abusers je još jedna klasa code smell-a. Neki od code smell-ova koji potpadaju ovde su:
- Switch Statements
- Temporary Field
- Refused Interface
- Inappropriate Static
Switch Statements
Standardan code smell u dizajnu je česta upotreba switch case-a. Ako se switch-case naredba upotrebljava više puta za jednu promenljivu (flag), onda se ona može zameniti polimorfizmom, gde bi data promenljiva (obično enumeracija) mogla biti konvertovana u zasebnu strukturu klasa, gde bi vrednosti te enumeracije predstavljale zasebne klase. Sve metode koje su do tada bile definisane za datu klasu i koje su uzimale u obzir enum promenljivu, potrebno je prebaciti u zasebne klase i telo svake od njih predstavlja telo case dela za datu enumeraciju u datoj (staroj) metodi.
Postoje situacije koje dovode do naglog povećanja klasa kod zamene switch-case-a, polimorfizmom, a ne postoji puto switch-case-eva u telu date klase, pa bi trebalo u ovom slučaju razmisliti da li je potrebno sprovesti ovo refaktorisanje.
Postoje situacije koje dovode do naglog povećanja klasa kod zamene switch-case-a, polimorfizmom, a ne postoji puto switch-case-eva u telu date klase, pa bi trebalo u ovom slučaju razmisliti da li je potrebno sprovesti ovo refaktorisanje.
Temporary Field
Ako se neki atribut klase koristi samo da bi prenosio neko stanje izmedju metoda, to je code smell (npr. u okviru jedne klase, postoje dve metode, koje se moraju pozvati u odredjenom redosledu, da bi atribut(i) te klase bili validni)
Ovaj code smell se refaktoriše u:
Primer:
class Employee { private decimal _earningsForBonus; // other fields and methods private decimal CalculateBonus() { return _earningsForBonus * BonusPercentage(); } private void CalculateEarningsForBonus() { _earningsForBonus = YearToDateEarnings() + OvertimeEarnings() * 2; } }
se može refaktorisati u:
class BonusCalculator { private decimal _earningsForBonus; private decimal _bonusPercentage; public BonusCalculator(Employee employee) { CalculateEarningsForBonus(employee.YearToDateEarnings(), employee.OvertimeEarnings()); _bonusPercentage = employee.BonusPercentage(); } public decimal CalculateBonus() { return _earningsForBonus * _bonusPercentage; } private void CalculateEarningsForBonus(decimal ytdEarnings, decimal ytdOvertimeEarnings) { _earningsForBonus = ytdEarnings + ytdOvertimeEarnings * 2; } }
Refused Inheritance
Ako klasa koja nasledjuje parent klasu i override-uje većinu public metoda parent klase, onda je to code smell i ta izvedena klasa verovatno ne treba da bude u tom delu hijerarhije. U tom slučaju, veza između izvedene i parent klase, najverovatnije treba da bude kompozicija (izvedena klasa -> parent klasa), umesto nasleđivanja. Takođe, moguće je da te public metode parent klase, koje override-uje izvedena, treba prebaciti u izvedenu.
Inappropriate Static
Statičke metode se ne mogu naslediti i dovode to tight couplinga sa klijentskim kodom, pa ih treba pažljivo koristiti. Njihovo korišćenje treba rezervisati za:
- ponašanje koje nikad neće biti potrebno redefinisati i
- za stateless operacije
Primeri su:
- Proste matematičke operacije
- Globalne konstante