Extras din seminar
1. S.O.L.I.D.
1.1. SINGLE RESPONSABILITY PRINCIPLE
O clasa trebuie sa aiba intotdeauna o singura responsabilitate si numai una. In caz contrar, orice schimbare de specificatii va duce la inutilitatea ei si rescrierea intregului cod.
Ex1: Implementarea de mai jos incalca principiul S, deoarece NetIncomeCalculator stie sa faca doua lucruri diferite, si anume: sa calculeze netul total si sa afiseze la consola. Aceasta clasa devine inutila in momentul in care dorim sa adaugam o alta metoda pentru afisarea rezultatul, cum ar fi displayInFile():
public class NetIncomeCalculator implements NetIncomeCalculatorInterface {
private Map<Integer, Person> persons;
public NetIncomeCalculator(Map<Integer, Person> persons) {
this.persons = persons;
}
@Override
public double calculateTotalNetIncome() throws NotFoundPersonException {
//implementare
}
public void displayConsole(NetIncomeCalculatorInterface calculator) throws NotFoundPersonException {
//implementare
}
}
Solutie: Se defineste o alta clasa, Report, care sa contina toate metodele pentru afisarea informatiilor din NetIncomeCalculator. Iar aceasta din urma, o sa implementeze, doar acele metode care prelucreaza datele incapsulate in obiectele de tip Person.
1.2. OPEN-CLOSED PRINCIPLE
Obiectele sau entitatile trebuie sa fie deschise pentru extindere, dar inchise pentru modificari.
Ex2: In momentul compilarii metodei de mai jos nu stim tipul concret al obiectelor de tip Person, ceea ce a condus la utilizarea blocurile de tip if-then-else if pentru identificarea acestuia. Modul acesta de implementare incalca principiul O, deoarece in momentul in care o sa apara un alt tip concret al clasei Person (spre exemplu InginerAtom) metoda calculateTotalNetIncome() trebuie modificata pentru a putea calcula suma si pentru noul caz.
public double calculateTotalNetIncome() throws NotFoundPersonException {
if (persons == null || persons.size() == 0)
throw new NotFoundPersonException("Not found persons");
double sum = 0;
for (Person person : persons.values()) {
if (person instanceof Programmer) {
sum += (1 - 0.13 - 0.2) * person.getGrossIncome();
} else if (person instanceof Driver) {
sum += (1 - 0.13 - 0.2 - 0.1) * person.getGrossIncome();
} else if (person instanceof ScholarshipStudent) {
sum += person.getGrossIncome();
}
}
return sum;
}
Solutie: Definirea unei metode, calculateNetIncome(), care poate sa fie abstracta sau concreta (se alege cel mai des intalnit comportament al functiei respective), in cadrul clasei Person, iar fiecare clasa concreta trebuie sa suprascrie aceasta metoda, cu comportamentul asteptat. O alta solutie o reprezinta definirea unei interfete care sa contina metoda descrisa anterior.
Forma finala a metodei calculateTotalNetIncome() ar trebui sa arate astfel:
public double calculateTotalNetIncome() throws NotFoundPersonException {
if (persons == null || persons.size() == 0)
throw new NotFoundPersonException("Not found persons");
double sum = 0;
for (Person person : persons.values()) {
sum += person.calculateNetIncome();
}
return sum;
Preview document
Conținut arhivă zip
- CleanCode.pdf