Middle
Χρησιμοποιείτε πρότυπα σχεδίασης στην πρακτική σας;
sobes.tech AI
Απάντηση από AI
Ναι, τα χρησιμοποιώ. Βοηθούν στην επίλυση τυπικών προβλημάτων, στη βελτίωση της δομής του κώδικα, στην αναγνωσιμότητα και στη διαχειρισιμότητά του.
Τα βασικά πρότυπα που εφαρμόζω:
- Παραγωγικά:
- Singleton: Για τον περιορισμό της κλάσης σε ένα μόνο αντίγραφο.
- Factory Method: Για τη δημιουργία αντικειμένων χωρίς να καθορίζεται συγκεκριμένη κλάση.
- Abstract Factory: Για τη δημιουργία σχετικών οικογενειών αντικειμένων.
- Builder: Για την σταδιακή δημιουργία σύνθετων αντικειμένων.
- Δομικά:
- Adapter: Για συμβατότητα διεπαφών.
- Decorator: Για δυναμική προσθήκη συμπεριφοράς σε ένα αντικείμενο.
- Facade: Για την παροχή ενιαίας διεπαφής σε ένα υποσύστημα.
- Proxy: Για τον έλεγχο πρόσβασης σε ένα αντικείμενο.
- Συμπεριφορικά:
- Observer: Για την υλοποίηση μηχανισμού εγγραφής-ειδοποίησης.
- Strategy: Για τον ορισμό οικογενειών αλγορίθμων και την εναλλαξιμότητά τους.
- Template Method: Για τον ορισμό του σκελετού ενός αλγορίθμου σε μια βασική κλάση.
- Command: Για την ενσωμάτωση ενός αιτήματος ως αντικείμενο.
Για παράδειγμα, συχνά χρησιμοποιώ το Singleton για εργασία με βάση δεδομένων:
<?php
// Database.php
class Database {
private static ?Database $instance = null;
private ?PDO $pdo = null;
private function __construct() {
// Διαμόρφωση σύνδεσης με τη βάση δεδομένων
$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() {}
}
Μπορώ επίσης να χρησιμοποιήσω το Factory Method για τη δημιουργία διαφορετικών τύπων μηνυμάτων ή αντικειμένων ανάλογα με τα εισερχόμενα δεδομένα.
<?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.");
}
}
}
// Χρήση:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Θα εμφανίσει "Sending email..."
Η επιλογή του προτύπου εξαρτάται από την συγκεκριμένη εργασία και το πλαίσιο. Το βασικό είναι να μην τα χρησιμοποιείτε απλώς για την χρήση, αλλά να κατανοείτε πότε πραγματικά είναι απαραίτητα για τη βελτίωση του κώδικα.