Middle
Šta su kohezija i povezanost u programiranju?
sobes.tech АИ
Одговор од АИ
Kohezija (Cohesion) je mera toga koliko su elementi unutar modula (klase, funkcije) usko povezani. Visoka kohezija znači da su elementi modula fokusirani na izvršenje jednog zadatka ili koncepta. Dobro dizajniran modul ima visoku koheziju.
Primeri nivoa kohezije (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.
- Zajednički (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 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 kohezija (unutar modula) i niska povezanost (između modula).
<?php
// Primer visoke kohezije (Funkcionalna kohezija)
// Ova 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.
?>