Middle
Czym są spójność i sprzężenie w programowaniu?
sobes.tech AI
Odpowiedź od AI
Spójność (Cohesion) — to miara tego, jak ściśle powiązane są elementy wewnątrz modułu (klasy, funkcji). Wysoka spójność oznacza, że elementy modułu skupiają się na realizacji jednego zadania lub koncepcji. Dobrze zaprojektowany moduł ma wysoką spójność.
Przykłady poziomów spójności (od niskiej do wysokiej):
- Przypadkowa (Coincidental): Elementy są powiązane przypadkowo, bez logicznego związku.
- Logiczna (Logical): Elementy wykonują zbiór logicznie powiązanych działań, ale wybór jest dokonywany przez kod zewnętrzny.
- Czasowa (Temporal): Elementy są powiązane tym, że są wykonywane w tym samym czasie.
- Proceduralna (Procedural): Elementy podążają za procedurą wykonania.
- Komunikacyjna (Communicational): Elementy pracują na tych samych danych.
- Sekwencyjna (Sequential): Wyjście jednego elementu jest wejściem dla innego.
- Funkcjonalna (Functional): Wszystkie elementy przyczyniają się do realizacji jednej jasno określonej funkcji.
Załączanie (Coupling) — to miara zależności między różnymi modułami. Niskie załączanie oznacza, że moduły są względnie niezależne od siebie. Obniżenie załączania czyni system bardziej elastycznym, łatwym w utrzymaniu i testowaniu.
Przykłady poziomów załączania (od wysokiego do niskiego):
- Po zawartości (Content): Jeden moduł bezpośrednio odwołuje się do danych wewnętrznych lub implementacji innego modułu.
- Wspólne (Common): Moduły korzystają z wspólnej globalnej przestrzeni danych.
- Sterujące (Control): Jeden moduł przekazuje flagę sterującą, która określa zachowanie innego modułu.
- Stemplujące (Stamp): Przesyłanie danych złożonych (obiektów, struktur), ale moduł korzysta tylko z części z nich.
- Dane (Data): Przesyłanie prostych danych jako parametrów.
- Przez wiadomości (Message): Moduły wymieniają wiadomości (np. przez zdarzenia, interfejsy). To najsłabsza forma załączania.
Cel dobrego projektu: wysoka spójność (wewnątrz modułów) i niskie załączanie (między modułami).
<?php
// Przykład wysokiej spójności (spójność funkcjonalna)
// Ta klasa skupia się wyłącznie na obsłudze użytkowników
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);
}
}
// Przykład niskiego załączania (łączenie danych)
// 'processOrder' zależy tylko od przekazanych danych ($orderId, $amount)
class OrderProcessor {
public function processOrder(int $orderId, float $amount): bool {
// Logika przetwarzania zamówienia...
// Nie zależy bezpośrednio od implementacji innych klas,
// tylko od danych wejściowych.
echo "Przetwarzanie zamówienia ID $orderId z kwotą $amount\n";
return true;
}
}
// Przykład, gdzie UserManager i OrderProcessor nie mają silnej zależności od siebie.
// Mogą być używane niezależnie lub razem, ale ich wewnętrzne zmiany
// nie wpływają na siebie nawzajem.
?>