Clean Code 04: Reinženjering Informacionih Sistema
Clean Code 04: Reinženjering Informacionih Sistema
• Metode/Funkcije (Functions)
• Komentari (Comments)
• Formatiranje (Formatting)
• Klase (Classes)
• Code Smells
Organizacija klase:
• Počinju sa listom promenljivih:
• public static
• private static
• private
• public ?
• public metode
• private metode
„Male” klase, mogu da imaju nekoliko metoda, ali mnogo odgovornosti, pa postaju „velike” klase.
…
Reinženjering informacionih sistema 2020/2021
6
Klase (Classes)
private Point t;
private Line l;
private Circle k;
private Square kv;
private Rectangle p;
private HexagonAdapter h;
…
Reinženjering informacionih sistema 2020/2021
7
Klase (Classes)
• Svaka metoda klase treba da manipuliše sa jednom ili više od tih varijabli instance.
• Što je veći broj varijabli instance, od broja dostupnih, sa kojim metode manipulišu to je veća
kohezija između metoda i klasa.
• Klase u kojima sve metode manipulišu sa svim varijablama instance ima maksimalnu koheziju.
Kohezija
• Ukoliko su metode kratke i manipulišu sa malim brojem varijabli instance, to može dovesti do
toga da je određene metode moguće grupisati po osnovu varijabli sa kojima manipulišu i to
može biti dobar pokazatelj da se te metode, zajedno sa varijablama instance mogu ekstrahovati
u novu klasu.
• Na taj način i klasa iz koje se vrši ekstrakcija, kao i novonastale klase imaju veću koheziju, što je
poželjna osobina za klase, jer prikazuje da su metode i klasa međusobno zavisne i da
predstavljaju jednu logičnu celinu.
Kohezija
• Ukoliko imate veliku metodu u kojoj ste definisali veliki broj varijabli, trebalo bi da razmišljate o
tome da se deo metode možda može izdvojiti u neku drugu, posebnu metodu.
• Potencijalni problem je u tome što ta nova metoda treba da koristi deo varijabli definisanih u
staroj, velikoj metodi, pa može izgledati da to nije dobro rešenje i da ćete morati novoj metodi da
prosleđujete sve varijable nad kojima je potrebno vršiti operacije.
• U tom slučaju, dobra praksa bi bila da potrebne promenljive budu „promovisane“ u varijable
instanci. Tada novoj metodi nećete morati da prosleđujete bilo kakve promenljive.
Kohezija
• Posmatranjem tih metoda mogu se prepoznati grupe metoda koje vrše operacije nad istim, ali ne
svim, varijablama instance.
• Ta grupa metoda i varijable instanci nad kojima se vrše operacije su kandidati za izdvajanje u
neku novu klasu.
Kohezija
• Ukoliko ne možete da opišete šta klasa radi u 25 reči, bez upotrebe „i“, „ili“, „ako“ i „ali“, klasa
verovatno ima previše odgovornosti.
• Napisati kod koji radi i kod koji je čist i pogodan za održavanje su dve različite stvari.
package literatePrimes;
int J;
int K;
boolean JPRIME;
int ORD;
int SQUARE;
int N;
int MULT[] = new int[ORDMAX + 1];
J = 1;
K = 1;
P[1] = 2;
ORD = 2;
SQUARE = 9;
while (K < M) {
do {
J = J + 2;
…
* Robert C. Martin - Clean Code: A Handbook of Agile Software Craftsmanship
if (J == SQUARE) {
ORD = ORD + 1;
SQUARE = P[ORD] * P[ORD];
MULT[ORD - 1] = J;
}
N = 2;
JPRIME = true;
while (N < ORD && JPRIME) {
while (MULT[N] < J)
MULT[N] = MULT[N] + P[N] + P[N];
if (MULT[N] == J)
JPRIME = false;
N = N + 1;
}
} while (!JPRIME);
K = K + 1;
* Robert C. Martin - Clean Code: A Handbook of Agile Software Craftsmanship
P[K] = J;
}
Reinženjering informacionih sistema 2020/2021
21
Klase (Classes)
{
PAGENUMBER = 1;
PAGEOFFSET = 1;
while (PAGEOFFSET <= M) {
System.out.println("The First " + M + " Prime Numbers --- Page " + PAGENUMBER);
System.out.println("");
for (ROWOFFSET = PAGEOFFSET; ROWOFFSET < PAGEOFFSET + RR;
ROWOFFSET++){
for (C = 0; C < CC;C++)
if (ROWOFFSET + C * RR <= M)
System.out.format("%10d", P[ROWOFFSET + C * RR]);
System.out.println("");
}
System.out.println("\f");
PAGENUMBER = PAGENUMBER + 1;
PAGEOFFSET = PAGEOFFSET + RR * CC;
* Robert C. Martin - Clean Code: A Handbook of Agile Software Craftsmanship
}
}
}
Reinženjering informacionih sistema 2020/2021
22
Klase (Classes)
tablePrinter.print(primes);
}
}
import java.io.PrintStream;
import java.util.ArrayList;
public class PrimeGenerator {
private static int[] primes;
private static ArrayList<Integer> multiplesOfPrimeFactors;
Potom su rađene male izmene i nakon svake male izmene pokretani su testovi.
• Rezultat uspešnog dizajna je aplikacija koja radi ono što joj je bila namera.
• Možda je sistem u teoriji odlično dizajniran, ali ako ne postoji jednostavan način da se testira
dizajn ne možemo biti sigurni u i dizajn.
• Samo sistem koji je detaljno testiran i koji ima testove koji prolaze i svim uslovima predstavlja
sistem koji se jednostavno može testirati.
• Kreiranje sistema koji je jednostavan za testiranje za posledicu ima kreiranje klasa koje su male,
imaju samo jednu namenu (u skladu sa Single Responsibility Principle).
• Visoka sprega čini sistem teškom za testiranjem, a kreiranje testova i njihovo stalno pokretanje
vodi do niske sprege i visoke kohezije.
Refaktoring
• Svakih nekoliko linija možete uraditi refaktoring u kojem treba da primenite sve što znate o
dobrom dizajnu.
• Povećajte koheziju, smanjite spregu, preimenujte klase i metode, smanjite metode i klase itd.