Middle+
Opowiedz o wzorcach projektowych używanych do optymalizacji częstotliwości wykonywania kodu.
sobes.tech AI
Odpowiedź od AI
Aby zoptymalizować częstotliwość wykonywania kodu, często stosuje się wzorce projektowe mające na celu zmniejszenie nakładów, unikanie powtarzających się obliczeń i efektywne zarządzanie zasobami.
Główne wzorce:
-
Singleton
- Zapewnia utworzenie tylko jednej instancji klasy. Przydatny do dostępu do wspólnych zasobów, takich jak połączenia z bazą danych czy cache, unikając ich wielokrotnego tworzenia.
<?php class Singleton { private static $instance = null; private function __construct() { /* ... */ } private function __clone() { /* ... */ } private function __wakeup() { /* ... */ } public static function getInstance(): self { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } } -
Registry
- Centralne miejsce przechowywania wspólnych obiektów i usług. Umożliwia dostęp do wcześniej utworzonych lub skonfigurowanych zasobów bez konieczności ich ponownej inicjalizacji.
<?php class Registry { private static $data = []; public static function set(string $key, $value): void { self::$data[$key] = $value; } public static function get(string $key) { return self::$data[$key] ?? null; } public static function has(string $key): bool { return isset(self::$data[$key]); } } -
Flyweight
- Używany do efektywnego zarządzania dużą liczbą małych obiektów o podobnym zachowaniu, dzieląc ich stan. Pozwala zaoszczędzić pamięć i czas na tworzenie obiektów. Przykładem może być użycie wspólnych obiektów do reprezentowania identycznych znaków, kolorów itp.
-
Proxy
- Zapewnia zamiennik lub "pełnomocnika" dla innego obiektu. Może być używany do opóźnionego ładowania (Lazy Loading), gdy obiekt jest tworzony tylko przy pierwszym odwołaniu, lub do cache'owania wyników operacji.
-
Cache (lub Memoization - nie do końca wzorzec, raczej technika)
- Przechowuje wyniki kosztownych funkcji lub zapytań, aby przy kolejnym wywołaniu z tymi samymi argumentami zwrócić zapisany wynik zamiast ponownego obliczania. Często realizowane w ramach innych wzorców lub jako osobny komponent.
<?php function expensiveFunction($arg) { static $cache = []; // Prosta implementacja cache if (isset($cache[$arg])) { echo "Używanie cache dla $arg\n"; return $cache[$arg]; } echo "Obliczanie dla $arg\n"; // Symulacja kosztownej operacji sleep(1); $result = $arg * 2; $cache[$arg] = $result; return $result; } expensiveFunction(10); // Oblicza i zapisuje w cache expensiveFunction(10); // Używa cache -
Object Pool
- Przechowuje pulę gotowych do użycia obiektów, które można ponownie wykorzystać zamiast tworzyć nowe. Przydatne dla obiektów kosztownych w tworzeniu, np. połączeń z bazą danych.
-
Lazy Loading
- Oddzielna zasada, często realizowana za pomocą Factory, Proxy lub innych wzorców. Obiekt lub zasób jest ładowany tylko wtedy, gdy jest naprawdę potrzebny, co zmniejsza początkowe obciążenie.
Każdy z tych wzorców pomaga zmniejszyć nadmiarowość operacji, efektywnie wykorzystywać zasoby i w konsekwencji optymalizować częstotliwość i szybkość wykonywania kodu. Wybór wzorca zależy od konkretnego zadania i kontekstu.