Vous êtes sur la page 1sur 5

Temporary field

(Privremeno Polje)

Privremena polja se koriste samo u odredjenim situacijama. U ostalim situacijama su neiskoriscena i postavljena na null. Ponekad je tesko naci smisao tih polja, posto je za klasu tipicno da koriste sve metode i polja unutar nje. U slucaju da ne koristimo privremena polja, ona mogu da zbune programera. Refaktoring tehnike koje koristimo za ovaj problem su Exctrat Class i Introduce Null Object.

Extract Class
Extract Class koristimo kada imamo jednu kasu koja obavlja posao koji bi trebalo da obavljaju dve klase. Pravimo novu klasu i ubacujemo metode i polja koja zelimo da izdvojimo iz stare klase. Zatim povezemo staru klasu sa novom klasom.

Primer:
class Person... public String getName() { return _name; } public String getTelephoneNumber() { return ("(" + _officeAreaCode + ") " + _officeNumber); } String getOfficeAreaCode() { return _officeAreaCode; } void setOfficeAreaCode(String arg) { _officeAreaCode = arg; } String getOfficeNumber() { return _officeNumber; } void setOfficeNumber(String arg) { _officeNumber = arg; } private String _name; private String _officeAreaCode; private String _officeNumber;

U novu klasu mogu da izdvojim deo sa telefonskim brojem. Definisemo novu klasu: class TelephoneNumber { } Sada povezujemo novu klasu sa ostatkom stare klase: private TelephoneNumber _officeTelephone = new TelephoneNumber(); Sada cemo iskoristiti Move Field na jedno od polja : class TelephoneNumber { String getAreaCode() { return _areaCode; } void setAreaCode(String arg) { _areaCode = arg; } private String _areaCode; } class Person... public String getTelephoneNumber() { return ("(" + getOfficeAreaCode() + ") " + _officeNumber); } String getOfficeAreaCode() { return _officeTelephone.getAreaCode(); } void setOfficeAreaCode(String arg) { _officeTelephone.setAreaCode(arg); }

Sada mozemo prebaciti ostala polja i iskoristiti Move Method na telephoneNumber: class Person... public String getName() { return _name; } public String getTelephoneNumber(){ return _officeTelephone.getTelephoneNumber(); } TelephoneNumber getOfficeTelephone() { return _officeTelephone; } private String _name; private TelephoneNumber _officeTelephone = new TelephoneNumber(); class TelephoneNumber... public String getTelephoneNumber() { return ("(" + _areaCode + ") " + _number);

} String getAreaCode() { return _areaCode; } void setAreaCode(String arg) { _areaCode = arg; } String getNumber() { return _number; } void setNumber(String arg) { _number = arg; } private String _number; private String _areaCode; Extract Class je tehnika koja omogucava bolju preglednost programa, zato sto omogucava pregled dve razlicite klase.

Null Object
Introduce Null Object refaktorisanje nam sluzi da bismo zamenili null vrednosti sa null objektima a kasnije i da se oslobodimo ponavljajucih logickih provera. Kako je promenljiva rez referencijalnog tipa, nas cilj je da uvedemo novi objekat (odnosno null objekat) i oslobodimo se provera tipa rez == null i rez != null.

Primer:
Agencija zna za lokacije kuca i stanova koji koriste njene usluge. Svaka lokacija ima svog klijenta. class Site... Customer getCustomer() { return _customer; } Customer _customer; Informacije o klijentu: class Customer... public String getName() {...} public BillingPlan getPlan() {...} public PaymentHistory getHistory() {...} Podaci o placanju: public class PaymentHistory... int getWeeksDelinquentInLastYear()

Sledece get metode omogucavaju klijentima da preuzmu svoje podatke. Medjutim ponekad se desi da nemamo klijenta za odredjenu lokaciju. Desi se da se neko odseli i da ne znamo ko se novi uselio. Zbog moramo obezbediti da bilo koji deo koda koji koristi klijent moze da podrzi null vrednosti. Customer customer = site.getCustomer(); BillingPlan plan; if (customer == null) plan = BillingPlan.basic(); else plan = customer.getPlan(); ... String customerName; if (customer == null) customerName = "occupant"; else customerName = customer.getName(); ... int weeksDelinquent; if (customer == null) weeksDelinquent = 0; else weeksDelinquent = customer.getHistory().getWeeksDelinquentInLastYear(); Prvi korak je kreiranje null customer klase i modifikovanje customer klase da moze da podrzi upit za null test: class NullCustomer extends Customer { public boolean isNull() { return true; } } class Customer... public boolean isNull() { return false; } protected Customer() {} //needed by the NullCustomer

Sada treba da vratimo novi null objekat kada god ocekujem null vrednost i da zamenimo test sa forme foo==null na test sa formom foo.isNull(). class Site... Customer getCustomer() { return (_customer == null) ? Customer.newNull(): _customer; } Takodje treba da zamenimo da uvek koristim isNull() umesto ==null. Customer customer = site.getCustomer(); BillingPlan plan; if (customer.isNull()) plan = BillingPlan.basic(); else plan = customer.getPlan(); ...

String customerName; if (customer.isNull()) customerName = "occupant"; else customerName = customer.getName(); ... int weeksDelinquent; if (customer.isNull()) weeksDelinquent = 0; else weeksDelinquent = customer.getHistory().getWeeksDelinquentInLastYear();

U ovoj situaciji nismo dobili nista koriscenjem isNull() umesto ==null. Prednost ovog refaktoringa primecujemo kada premestimo celokupan deo koda vezan za costumere do null Customer u null Customer i uklonimo uslovne promenljive. String customerName; if (customer.isNull()) customerName = "occupant"; else customerName = customer.getName(); Dodajem metod odgovarajuceg imena u null customer class NullCustomer... public String getName(){ return "occupant"; } Sada mogu da izbrisem sve uslovne promenljive String customerName = customer.getName();

Vous aimerez peut-être aussi