Middle
Čo je to kohezia a väzba v programovaní?
sobes.tech AI
Odpoveď od AI
Kohezivnost (Cohesion) je mera toga koliko su elementi unutar modula (klasa, funkcija) tesno povezani. Visoka kohezivnost znači da su elementi modula fokusirani na izvršavanje jedne zadatke ili koncepta. Dobro dizajniran modul ima visoku kohezivnost.
Primeri nivoa kohezivnosti (od niske ka visokoj):
- Slučajna (Coincidental): Elementi su povezani slučajno, bez logičke veze.
- Logička (Logical): Elementi izvršavaju skup logički povezanih radnji, ali izbor vrši spoljašnji kod.
- Vremenska (Temporal): Elementi su povezani time što se izvršavaju u isto vreme.
- Proceduralna (Procedural): Elementi slede proceduru izvršenja.
- Komunikaciona (Communicational): Elementi rade sa istim podacima.
- Sekvencijalna (Sequential): Izlaz jednog elementa je ulaz za drugi.
- Funkcionalna (Functional): Svi elementi doprinose izvršenju jedne jasno definisane funkcije.
Povezanost (Coupling) je mera zavisnosti između različitih modula. Niska povezanost znači da su moduli relativno nezavisni. Smanjenje povezanosti čini sistem fleksibilnijim, lakšim za održavanje i testiranje.
Primeri nivoa povezanosti (od visoke ka niskoj):
- Po sadržaju (Content): Jedan modul direktno pristupa unutrašnjim podacima ili implementaciji drugog modula.
- Običan (Common): Moduli koriste zajedničku globalnu oblast podataka.
- Po upravljanju (Control): Jedan modul prenosi kontrolnu zastavicu koja određuje ponašanje drugog modula.
- Po pečatu (Stamp): Prenos složenih podataka (objekata, struktura), ali modul koristi samo deo od njih.
- Po podacima (Data): Prenos jednostavnih podataka kao parametara.
- Po porukama (Message): Moduli razmenjuju poruke (npr. putem događaja, interfejsa). Ovo je najslabiji oblik povezanosti.
Cilj dobrog dizajna: visoka kohezivnost (unutar modula) i niska povezanost (između modula).
<?php
// Primer visoke kohezivnosti (Funkcionalna kohezivnost)
// Ovaj klasa je fokusirana samo na obradu korisnika
class UserManager {
private array $users = [];
public function addUser(string $name): void {
$this->users[] = $name;
}
public function getUsers(): array {
return $this->users;
}
public function deleteUser(string $name): void {
$this->users = array_filter($this->users, fn($user) => $user !== $name);
}
}
// Primer niske povezanosti (Data Coupling)
// 'processOrder' zavisi samo od prosleđenih podataka ($orderId, $amount)
class OrderProcessor {
public function processOrder(int $orderId, float $amount): bool {
// Logika obrade porudžbine...
// Ne zavisi direktno od implementacije drugih klasa,
// samo od ulaznih podataka.
echo "Processing order ID $orderId with amount $amount\n";
return true;
}
}
// Primer gde UserManager i OrderProcessor nemaju jaku zavisnost jedni od drugih.
// Mogu biti korišćeni nezavisno ili zajedno, ali njihove unutrašnje promene
// ne utiču značajno jedno na drugo.
?>