Documente Academic
Documente Profesional
Documente Cultură
BAD CODE
Clasa Customer face lucruri care nu ar trebui sa le faca. Clasa ar trebui sa faca
validari de date a clientilor, sa accese layerul de acces a clientului, dar daca
observati, in blocul catch mai face activitatea de Logging (inscrie in fisier erorile). In
alte cuvinte, clasa este supraincarcata cu responsabilitati. Pe viitor, daca o sa se
adauge un eveniment de logger ca vizualizator de loguri, atunci ar trebui sa
schimbam clasa Customer, ceia ce nu este bine.
class Customer {
public void Add() {
try {
// Database code goes here
}
catch (Exception ex) {
System.IO.File.WriteAllText(@"c:\Error.txt", ex.ToString());
}
}
}
Principiul spune ca clasa trebuie sa aiba doar o singura responsabilitate. Deci ca
sa urmam principiul, noi vom separa activitate de logging in alta clasa, care o sa se
ocupe ea de logging
GOOD CODE
class FileLogger {
public void Handle(string error) {
System.IO.File.WriteAllText(@"c:\Error.txt", error);
}
}
class Customer {
private FileLogger obj = new FileLogger();
publicvirtual void Add() {
try {
// Database code goes here
}
catch (Exception ex) {
obj.Handle(ex.ToString());
}
}
}
Acum Clasa Customer poate delega activitate catre clasa FileLogger, si deci,
poate sa se concentreze la activitatile cu clientii dar nu si cu tratarea erorilor.
O- OCP (Open closed principle)
BAD CODE
Avem clasa Customer, in care avem o proprietate ce indica tipul clientului.
Proprietatea decide daca clientul este Gold sau Silver. In dependenta de
aceasta, ea calculeaza reducerea (in functia getDiscount).
class Customer {
private int _CustType;
BAD CODE
GOOD CODE
BAD CODE
Spre exemplu avem o clasa care deserveste 1000 de clienti, si toti din ei sunt
bucurosi ca o utilizeaza. Acum haideti sa adaugam clienti noi, care ne spun ca
doresc o metoda, care ajuta de a citi date despre alti clienti. Deci, programatorii
sunt foarte entuziasti si vor schimba interfata IDatabase asa cum in exemplul de
mai jos:
interface IDatabase {
void Add(); // clientii vechi sunt multumiti cu aceasta metoda
voidRead(); // a fost adaugata pentru clienti noi
}
Daca vom vizualiza cerintele care au fost adaugate, vom observa ca deja exista 2
tipuri de clienti:
Deoarece am schimbat interfata curenta, noi impunem acei 1000 clienti satisfacuti,
sa utilizezer metoda Read.
GOOD CODE
Deci pentru a solutiona problema, este mai bine de a pastra acei 1000 clienti cu
interfata veche, si sa cream alta interfata pentru clienti noi. Pentru asta vom crea
interfata noua care actualizeaza interfata curenta. Se va pastra IDatabase asa
cum ea este, si se va adauga interfata IDatabaseV1 cu metoda adaugatoare
Read().
Acum veti putea crea clase care implementeaza metoda Read() si satisfac clienti
noi, cit si cei vechi, deoarece ei au ramas neatinsi si sunt satisfacuti cu interfata lor
veche, care nu include metoda Read().
BAD CODE
Sa presupunem ca avem un sistem de notificare care salveaza careva detalii in baza
de date
Acum clasa Notification total depinde de clasa Email, deoarece numai ea trimite
tipul notificarii. Daca noi dorim sa introducem alta de genul SMS, atunci ce ? Atunci
noi vom avea nevoie de a schimba si sistemul de notificare.
GOOD CODE