Sobes.tech
Middle+
119
questionbank

Расскажите о паттернах проектирования, используемых для оптимизации частоты выполнения кода.

Ответ от нейросети

sobes.tech AI

Для оптимизации частоты выполнения кода часто используются паттерны проектирования, направленные на снижение накладных расходов, избегание повторных вычислений и эффективное управление ресурсами.

Основные паттерны:

  1. Singleton

    • Гарантирует создание только одного экземпляра класса. Полезен для доступа к общим ресурсам, таким как подключения к базе данных или кэш, evitando их многократное создание.
    <?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;
        }
    }
    
  2. Registry

    • Централизованное хранилище для общих объектов и сервисов. Позволяет получить доступ к ранее созданным или настроенным ресурсам без необходимости их повторной инициализации.
    <?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]);
        }
    }
    
  3. Flyweight

    • Используется для эффективного управления большим количеством небольших объектов со схожим поведением, разделяя их состояние. Позволяет сэкономить память и время на создание объектов. Примером может быть использование общих объектов для представления одинаковых символов, цветов и т.д.
  4. Proxy

    • Предоставляет заменитель или "заместитель" для другого объекта. Может использоваться для отложенной загрузки (Lazy Loading), когда объект создается только при первом обращении к нему, или для кэширования результатов операций.
  5. Cache (или Memoization - не совсем паттерн, скорее техника)

    • Сохранение результатов выполнения дорогостоящих функций или запросов, чтобы при повторном вызове с теми же аргументами вернуть сохраненный результат вместо повторного вычисления. Часто реализуется в рамках других паттернов или как отдельный компонент.
    <?php
    function expensiveFunction($arg) {
        static $cache = []; // Простая реализация кэша
    
        if (isset($cache[$arg])) {
            echo "Using cache for $arg\n";
            return $cache[$arg];
        }
    
        echo "Calculating for $arg\n";
        // Имитация дорогой операции
        sleep(1);
        $result = $arg * 2;
        $cache[$arg] = $result;
    
        return $result;
    }
    
    expensiveFunction(10); // Вычисляется и кэшируется
    expensiveFunction(10); // Используется кэш
    
  6. Object Pool

    • Хранит пул готовых к использованию объектов, которые можно переиспользовать вместо создания новых. Полезен для объектов, создание которых затратно, например, подключений к БД.
  7. Lazy Loading

    • Отдельный принцип, часто реализуемый с помощью Factory, Proxy или других паттернов. Объект или ресурс загружается только тогда, когда он действительно необходим, снижая начальную нагрузку.

Каждый из этих паттернов помогает уменьшить избыточность операций, эффективно использовать ресурсы и, как следствие, оптимизировать частоту и скорость выполнения кода. Выбор паттерна зависит от конкретной задачи и контекста.