@S1MY

Где допущены ошибки и как можно улучшить код?

Доброго вечера!
На собеседование задали данный вопрос и хотелось бы разобраться в нём, погуглив нашёл этот код 8-ми летней давности, но разбора его не обнаружил, думаю кроме вас мне не подскажет в чём тут явные проблемы.
Заранее спасибо за уделённое время!
<?php
class Document {

    public $user;

    public $name;

    public function init($name, User $user) {
        assert(strlen($name) > 5);
        $this->user = $user;
        $this->name = $name;
    }

    public function getTitle() {
        $db = Database::getInstance();
        $row = $db->query('SELECT * FROM document WHERE name = "' . $this->name . '" LIMIT 1');
        return $row[3]; // third column in a row
    }

    public function getContent() {
        $db = Database::getInstance();
        $row = $db->query('SELECT * FROM document WHERE name = "' . $this->name . '" LIMIT 1');
        return $row[6]; // sixth column in a row
    }

    public static function getAllDocuments() {
        // to be implemented later
    }

}

class User {

    public function makeNewDocument($name) {
        $doc = new Document();
        $doc->init($name, $this);
        return $doc;
    }

    public function getMyDocuments() {
        $list = array();
        foreach (Document::getAllDocuments() as $doc) {
            if ($doc->user == $this)
                $list[] = $doc;
        }
        return $list;
    }  

}
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Штош...

1) Элементарные ошибки на уровне запросов с инжекциями.
2) Класс документ зачем-то получает объект юзера, нигде его не использует, тем не менее даже при использовании нарушает принцип инкапсуляции, объекты не должны по логике знать о других объектах.
3) Класс юзер так же нарушает принципы инкапсуляции и единой ответственности, в частности зачем-то работает с документом, а не занимается обслуживанием сущности юзера, опять же, класс не должен знать о других сущностях, он должен реализовывать только логику собственной сущности.
4) методы getTitle() и getContent(), кроме того что не указывают явно на необходимые поля, надеясь на неизменность сущности в бд, еще и накладывают множественную нагрузку, по сути на каждый чих выполняя один и тот же запрос, вместо 1 запроса инициализации данных и далее обращения к уже существующим атрибутам.
5) Отсутствие неймспейсов и изоляция кода по классам так же отсутствует, соответственно про нормальный автолоад можно забыть.

Вывод: говнокод в чистом виде.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Добавлю свои пять копеек.
- публичные свойства $user и $name;
- функция init вместо конструктора класса;
- (холивар) использование синглтона Database вместо внедрения зависимости.
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Это на собеседовании вопрос? сходу огромная дыра для sql injection, выбор лишних данных, все сломается при изменении структуры таблицы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы