Sobes.tech
Middle

Ar naudojate dizaino šablonus savo praktikoje?

sobes.tech AI

Atsakymas iš AI

Taip, naudoju juos. Jie padeda spręsti įprastas užduotis, pagerinti kodo struktūrą, jo skaitomumą ir palaikymą.

Pagrindiniai modeliai, kuriuos naudoju:

  • Kūrimo:
    • Singleton: Siekiant apriboti klasę vienu egzemplioriumi.
    • Factory Method: Objektų kūrimui be konkrečios klasės nurodymo.
    • Abstract Factory: Susijusių objektų šeimų kūrimui.
    • Builder: Sudėtingų objektų žingsnis po žingsnio kūrimui.
  • Struktūriniai:
    • Adapter: Sąsajų suderinamumui.
    • Decorator: Dinamiškai pridedant elgseną prie objekto.
    • Facade: Teikiant vieningą sąsają į subsistemą.
    • Proxy: Valdyti prieigą prie objekto.
  • Elgsenos:
    • Observer: Įgyvendinti prenumeratos ir pranešimo mechanizmą.
    • Strategy: Apibrėžti šeimas algoritmų ir jų keičiamumą.
    • Template Method: Apibrėžti algoritmo skeletą pagrindiniame klasėje.
    • Command: Objektu įsikūnyti užklausą.

Pavyzdžiui, dažnai naudoju Singleton duomenų bazei:

<?php
// Database.php
class Database {
    private static ?Database $instance = null;
    private ?PDO $pdo = null;

    private function __construct() {
        // Prisijungimo konfigūracija
        $dsn = 'mysql:host=localhost;dbname=mydatabase;charset=utf8';
        $user = 'myuser';
        $password = 'mypassword';

        try {
            $this->pdo = new PDO($dsn, $user, $password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection(): ?PDO {
        return $this->pdo;
    }

    private function __clone() {}
    public function __wakeup() {}
}

Taip pat galiu naudoti Factory Method, kad sukurtų įvairių tipų žinutes ar objektus priklausomai nuo įvesties duomenų:

<?php
// MessageFactory.php
interface Message {
    public function send(): string;
}

class EmailMessage implements Message {
    public function send(): string {
        return "Sending email...";
    }
}

class SmsMessage implements Message {
    public function send(): string {
        return "Sending SMS...";
    }
}

class MessageFactory {
    public function createMessage(string $type): Message {
        switch ($type) {
            case 'email':
                return new EmailMessage();
            case 'sms':
                return new SmsMessage();
            default:
                throw new InvalidArgumentException("Unknown message type.");
        }
    }
}

// Naudojimas:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Išves "Sending email..."

Modelio pasirinkimas priklauso nuo konkrečios užduoties ir konteksto. Svarbu ne naudoti jų tik dėl mados, o suprasti, kada jie tikrai reikalingi kodo gerinimui.