Перейти до вмісту
    Без категорії / God Object у PHP: Як Уникнути та Рефакторити

    God Object у PHP: Як Уникнути та Рефакторити

    Оцініть цю публікацію!
    [Усього: 0 Середнє значення: 0]

    God Object — це клас, який робить занадто багато, відповідає за надмірну кількість функціональності, і стає важким для підтримки. Це призводить до низької читабельності коду, складності тестування та збільшення часу на внесення змін. Уявіть, що вам потрібно змінити логіку надсилання email-ів у системі, яка використовує God Object, що відповідає за все: від обробки замовлень до генерації звітів — це може призвести до непередбачуваних наслідків в інших частинах коду.

    Контекст і чому це важливо

    God Objects часто з’являються на початкових етапах розробки, коли потрібно швидко реалізувати функціональність. Розробники додають нові методи та властивості до існуючого класу, замість того, щоб створювати нові класи, що відповідають за конкретні завдання. Це особливо поширено у великих проєктах з нечіткою архітектурою.

    Ігнорування цієї проблеми призводить до значного збільшення технічного боргу. Клас стає незрозумілим, що ускладнює співпрацю між розробниками та збільшує ризик виникнення помилок на 30-50%. З часом будь-яка зміна в God Object стає страхітливим завданням.

    Практична реалізація

    Щоб проілюструвати проблему, ми створимо приклад God Object, який обробляє замовлення, генерує рахунки та надсилає email-и. Потім ми рефакторимо його, розділивши на менші, більш сфокусовані класи.

    <?php
    
    class OrderProcessor {
        private $db;
    
        public function __construct($db) {
            $this->db = $db;
        }
    
        public function createOrder($customerData, $items) {
            // Логіка створення замовлення в базі даних
            $orderId = $this->db->insertOrder($customerData, $items);
            return $orderId;
        }
    
        public function generateInvoice($orderId) {
            // Логіка генерації рахунку
            $invoiceData = $this->db->getOrderDetails($orderId);
            $invoice = $this->generateInvoiceContent($invoiceData);
            return $invoice;
        }
    
        private function generateInvoiceContent($invoiceData) {
            // Логіка створення HTML для рахунку
            return "<h1>Рахунок №" . $invoiceData['order_id'] . "</h1>";
        }
    
        public function sendConfirmationEmail($orderId, $invoice) {
            // Логіка надсилання email-у
            $emailContent = "Рахунок: " . $invoice;
            mail($this->db->getCustomerEmail($orderId), "Підтвердження замовлення", $emailContent);
        }
    }
    
    // Приклад використання
    $db = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password');
    $orderProcessor = new OrderProcessor($db);
    $orderId = $orderProcessor->createOrder(['name' => 'John Doe', 'email' => 'john.doe@example.com'], ['item1', 'item2']);
    $invoice = $orderProcessor->generateInvoice($orderId);
    $orderProcessor->sendConfirmationEmail($orderId, $invoice);
    
    ?>
    

    Цей приклад демонструє клас `OrderProcessor`, який відповідає за створення замовлень, генерацію рахунків та надсилання email-ів. Клас містить багато відповідальностей, що робить його складним для розуміння та підтримки. Рефакторинг передбачає розділення цього класу на менші, більш сфокусовані класи.

    Поширені помилки та підводні камені

    • Ігнорування принципу Single Responsibility: Розробники додають нові методи до існуючого класу, не замислюючись про те, чи відповідає він одному принципу відповідальності. Це призводить до збільшення розміру класу та ускладнення його підтримки.
      • Недостатнє тестування: God Objects складно тестувати через їхню складність і велику кількість залежностей. Це призводить до низької впевненості у правильності роботи коду.
    • Відсутність чіткої архітектури: Немає чіткого плану щодо структури проєкту, що призводить до хаотичного додавання функціональності до існуючих класів. Це ускладнює підтримку та розвиток проєкту.

    Порівняння підходів

    Старий підхід (God Object) призводить до низької читабельності коду, ускладнює тестування та збільшує технічний борг. Клас розміром понад 500 рядків коду потребує значно більше часу на розуміння та внесення змін.

    Новий підхід (розділення на менші класи) покращує читабельність коду, спрощує тестування та зменшує технічний борг. Наприклад, замість одного класу з 500 рядків коду, ми можемо мати 3 класи по 150 рядків коду, що значно спрощує розуміння та підтримку.

    Висновки

    God Object — це антипаттерн, який слід уникати у будь-якому PHP проєкті. Використовуйте SOLID принципи, особливо Single Responsibility Principle, щоб створити більш модульні та легкі для підтримки класи. Почніть з виявлення класів, які відповідають за надмірну кількість функціональності, і рефакторити їх, розділивши на менші, більш сфокусовані класи. Це допоможе вам створити більш якісний та стійкий код.

    Залишити відповідь

    Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *