Sobes.tech
Middle

Kas yra kohesiškumas ir sujungimas programavime?

sobes.tech AI

Atsakymas iš AI

Sąsaja (Cohesion) – tai matas, kiek glaudžiai susiję elementai yra modulyje (klase, funkcijoje). Aukšta sąsaja reiškia, kad modulio elementai yra sutelkti į vieną užduotį ar koncepciją. Gerai suprojektuotas modulis turi aukštą sąsają.

Pavyzdžiai sąsajos lygių (nuo žemo iki aukšto):

  • Atsitiktinė (Coincidental): Elementai atsitiktinai susiję, be loginės ryšio.
  • Loginė (Logical): Elementai atlieka loginškai susijusių veiksmų rinkinį, bet pasirinkimas atliekamas išorinį kodą.
  • Laiko (Temporal): Elementai susiję dėl to, kad jie vykdomi tuo pačiu metu.
  • Procedūrinė (Procedural): Elementai seka vykdymo procedūrą.
  • Komunikacinė (Communicational): Elementai dirba su tais pačiais duomenimis.
  • Sekvinė (Sequential): Vieno elemento išvestis yra kito įvestis.
  • Funkcinė (Functional): Visų elementų tikslas – įvykdyti vieną aiškiai apibrėžtą funkciją.

Sąsaja (Coupling) – tai priklausomybės nuo kitų modulių laipsnis. Mažas sąsajos laipsnis reiškia, kad moduliai yra santykinai nepriklausomi. Sumažinus sąsają, sistema tampa lankstesnė, lengviau prižiūrima ir testuojama.

Pavyzdžiai sąsajos lygių (nuo aukšto iki žemo):

  • Pagal turinį (Content): Vienas modulis tiesiogiai prieina prie kito vidinių duomenų ar įgyvendinimo.
  • Bendras (Common): Moduliai naudoja bendrą globalų duomenų sritį.
  • Pagal valdymą (Control): Vienas modulis perduoda valdymo žymeklį, kuris nustato kito elgesį.
  • Pagal žymeklį (Stamp): Perduoda sudėtinius duomenis (objektus, struktūras), bet modulis naudoja tik jų dalį.
  • Pagal duomenis (Data): Perduoda paprastus duomenis kaip parametrus.
  • Pagal žinutes (Message): Moduliai keičiasi žinutėmis (pvz., per įvykius, sąsajas). Tai yra silpniausia sąsajos forma.

Geros dizaino tikslas – aukšta sąsaja (modulių viduje) ir žema sąsaja (tarp modulių).

<?php

// Aukštos sąsajos pavyzdys (Funkcinė kohesija)
// Šis klasė yra sutelktas tik į vartotojų apdorojimą
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);
    }
}

// Žemos sąsajos pavyzdys (Duomenų sąsaja)
// 'processOrder' priklauso tik nuo perduotų duomenų ($orderId, $amount)
class OrderProcessor {
    public function processOrder(int $orderId, float $amount): bool {
        // Užsakymo apdorojimo logika...
        // Nėra tiesiogiai priklausomas nuo kitų klasių įgyvendinimo,
        // tik nuo įvesties duomenų.
        echo "Processing order ID $orderId with amount $amount\n";
        return true;
    }
}

// Pavyzdys, kur UserManager ir OrderProcessor neturi stiprios priklausomybės vienas nuo kito.
// Jie gali būti naudojami nepriklausomai arba kartu, bet jų vidiniai pakeitimai
// nesukelia didelių pasekmių vienas kitam.

?>