• Кто может дать комментарии по поводу кода PHP ООП (Code review)?

    @Oblomingo
    Добрый день,
    я не много понимаю в PHP, но могу попробовать прокомментировать.

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

    Класс называется treeData и он соединяется с базой данных, получает данные, сохраняет данные, а также умеет сериализовать/десериализовать данные. На лицо нарушение принципа Single Responsobility (почитайте про SOLID принципы). Ваш класс слишком много умеет и ответвенен за совершенно разные вещи - так писать не надо.

    Выделите соединение к базе данных в отдельный класс (singletone pattern).
    Выделите методы получения/редактирования данных в отдельный класс (repository & data mapper patterns).
    Обьект подключения базы данных добавляйте в класс получения данных с помощью иньекции зависимостей (dependency injection).

    П.С. Мне кажется неправильно реализован синглтоне. Смысл в том, чтобы всегда был только один экземпляр класса подключения. Вы проверяете на существование и создаете новый экземпляр (ок), но если экземпляр существует кидаете исключение (зачем?). В том случае, если экземпляр существует просто берите его и используйте.

    Итак:
    1). Правильно реализовать синглетон.
    2). Почитать о SOLID принципах и провести рефакторинг, разделить на разные классы.
    3). Почитать о паттернах проектирования singletone, unit of work, repository, data mapper. После этого вам легче будет написать свой класс репозитории, который будет ответвенен за получение/создание/изменение/удаление обьектов из базы данных.

    Удачи!
    Ответ написан
    1 комментарий
  • Кто может дать комментарии по поводу кода PHP ООП (Code review)?

    @D3lphi
    Что-то многовато таких вопросов за последние пару дней. Часть замечаний к вашему коду есть в этом ответе. Повторюсь.

    Вы же сами написали:
    класс для работы с многомерными пользовательскими массивами

    но, тем не менее, этот класса делает все, что не лень:
    • Работает с этими самыми массивами
    • Соединяется с базой данных
    • Отправляет запросы к базе данных
    • Занимается обработкой данных

    Не многовато ли для одного класса?
    В итоге, мы получаем богообъект, который "умеет во всё".

    Что у вас за бред написан в методе getInstance()? Зачем бросать исключение, в случае, если инстанс уже был создан.

    if (self::$_instance === null) {
        self::$_instance = new self($id);
    } else {
        throw new Exception("Попытка повторного создания экземпляра Singleton класса");
    }
    return self::$_instance;


    То есть, у вас теряется весь смысл (анти)паттерна синглотон. Получается, я не смогу сделать так:

    $instance1 = treeData::getInstance();
    $instance2 = treeData::getInstance(); // Исключение!

    Есть логика? Я думаю, что нет.

    Почему вы храните данные для соединения с БД внутри метода? Не логично ли было бы передавать их в качестве аргументов к методам?

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?


    Абстрактные исключения не бросаем! Создаем свои исключения и наследуемся от них. В своем коде используем только их, дабы можно было легко обработать нужные exception'ы. Текст исключения неплохо бы было писать на английском.

    Имена классов пишем с большой буквы! Скобки после методов и классов пишем на новой строке:
    function example() {
        // Не так
    }
    
    function example()
    {
        // А вот так
    }


    Предлагаю придерживаться общепринятым стандартам оформления кода.

    Старайтесь использовать синглтон в таком виде по минимуму (Или вообще не использовать). Тем более, в данном случае, он вообще не нужен.
    Ответ написан
    6 комментариев