!PHP помощь с методом SOLID

133
18 ноября 2019, 23:00

Какие методы SOLID были нарушены в этом коде или что можно изменить (упростить). Хотелось бы услышать ваши замечания и предложения (если у вас есть время).

interface VideoPlayerInterface
{
    public function play();
    public function rewind($seconds);
    public function playRadio();
    public function getFileInfo();
    public function ejectCD();
}
class VideoPlayer implements VideoPlayerInterface
{
    public $file;
    public function __construct()
    {
    }
    public function getVideo($file)
    {
        $this->file = $file;
    }
    public function play()
    {
        if (Auth::check()) {
            $dsn = "mysql:host=localhost;dbname=database;charset=utf-8";
            $pdo = new PDO($dsn, 'root', '');
            $statement = $pdo->query("UPDATE videos SET playCount = playCount + 1 WHERE filename = ". $this->file);
            $statement->execute();
            $this->log();
        }
        // here is some code for play the video
    }
    public function rewind($seconds)
    {
        if (Auth::check()) {
            if ($seconds > 10) {
                if ($this->rewindFast($seconds)) {
                    return true;
                }
            } else {
                // here is some code for rewind video
                return true;
            }
        }
        return false;
    }
    public function rewindFast($seconds)
    {
        if (Auth::check()) {
            // here is some code for rewind video fast
            return true;
        }
    }
    public function log()
    {
        $logger = new TextLogger->log('Video was played');
    }
    public function playRadio()
    {
        return 'Oops! I cannot play radio';
    }
    public function getFileInfo()
    {
        return realpath($this->file);
    }
    public function ejectCD()
    {
        throw new \Exception('Oops! I cannot eject CD');
    }
}
class AviVideoPlayer extends VideoPlayer
{
    public function play()
    {
        if (pathinfo($this->file, PATHINFO_EXTENSION) !== 'avi') {
            throw new Exception;
        }
        parent::play();
    }
    public function getFileInfo()
    {
        return ['fileInfo' => pathinfo($this->file)];
    }
}
$aviPlayer = new AviVideoPlayer();
$aviPlayer->getVideo('Game_of_thrones.avi');
$aviPlayer->play();
Answer 1
  1. Принцип единственной ответственности.

Метод play у вас отвечает за 1) установление соединения с БД 2) выполнение запроса 3) логирование 4) проверку авторизации

Остальное не по SOLID, а в целом про странности и косяки

  1. Именование

Метод getVideo, судя по имени, должен возвращать видео, а по факту представляет из себя классический сеттер

  1. Сокрытие реализации

Почему $file у вас публичный? Если нужно, то зачем отдельный сеттер (getVideo)

  1. PDO

Вот это ОЧЕНЬ ПЛОХАЯ ПРАКТИКА

$pdo->query("UPDATE videos SET playCount = playCount + 1 WHERE filename = ". $this->file);

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

  1. Почему все методы публичные? Как минимум log точно должен быть приватным(или защищенным)

  2. Почему playRadio возвращает текстовую ошибку, а ejectCD бросает исключение с практически аналогичным текстом?

READ ALSO
Установка библиотеки gd в контейнере

Установка библиотеки gd в контейнере

Имеется docker контейнер php:71-fpm на котором крутится lumen

142
Обновить версию PHP проекта

Обновить версию PHP проекта

Сайт написан на php 56 (Kohana), как обновить код самого сайта до php 7

98
Не выбирает базу данных

Не выбирает базу данных

Момент создания базы

132