Middle
Co je to soudržnost a vazba v programování?
sobes.tech AI
Odpověď od AI
Koherence (Cohesion) je míra toho, jak úzce jsou prvky uvnitř modulu (třídy, funkce) propojeny. Vysoká koherence znamená, že prvky modulu jsou zaměřeny na vykonání jednoho úkolu nebo konceptu. Dobře navržený modul má vysokou koherenci.
Příklady úrovní koherence (od nízké k vysoké):
- Náhodná (Coincidental): Prvky jsou spojeny náhodně, bez logické souvislosti.
- Logická (Logical): Prvky vykonávají sadu logicky souvisejících akcí, ale volba je provedena vnějším kódem.
- Časová (Temporal): Prvky jsou spojeny tím, že jsou vykonávány ve stejnou dobu.
- Procedurální (Procedural): Prvky následují postup provádění.
- Komunikační (Communicational): Prvky pracují se stejnými daty.
- Sekvenční (Sequential): Výstup jednoho prvku je vstupem pro jiný.
- Funkční (Functional): Všechny prvky přispívají k vykonání jednoznačně definované funkce.
Spojení (Coupling) je míra závislosti mezi různými moduly. Nízké spojení znamená, že moduly jsou relativně nezávislé. Snížení spojení činí systém flexibilnějším, lépe udržovatelným a testovatelným.
Příklady úrovní spojení (od vysokého k nízkému):
- Podle obsahu (Content): Jeden modul přímo přistupuje k vnitřním datům nebo implementaci jiného modulu.
- Obecné (Common): Moduly používají společnou globální oblast dat.
- Podle řízení (Control): Jeden modul předává řídicí vlajku, která určuje chování jiného modulu.
- Podle razítka (Stamp): Přenos složených dat (objektů, struktur), ale modul používá pouze část z nich.
- Podle dat (Data): Přenos jednoduchých dat jako parametry.
- Podle zpráv (Message): Moduly si vyměňují zprávy (například přes události, rozhraní). To je nejslabší forma spojení.
Cílem dobrého návrhu je: vysoká koherence (uvnitř modulů) a nízké spojení (mezi moduly).
<?php
// Příklad vysoké koherence (Funkční koherence)
// Tento třída je zaměřena pouze na zpracování uživatelů
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);
}
}
// Příklad nízké spojení (Data Coupling)
// 'processOrder' závisí pouze na předaných datech ($orderId, $amount)
class OrderProcessor {
public function processOrder(int $orderId, float $amount): bool {
// Logika zpracování objednávky...
// Přímo nezávisí na implementaci jiných tříd,
// pouze na vstupních datech.
echo "Processing order ID $orderId with amount $amount\n";
return true;
}
}
// Příklad, kde UserManager a OrderProcessor nemají silnou závislost na sobě.
// Mohou být použity nezávisle nebo společně, ale jejich vnitřní změny
// na sebe navzájem nemají velký vliv.
?>