Какие методы 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();
Метод play у вас отвечает за 1) установление соединения с БД 2) выполнение запроса 3) логирование 4) проверку авторизации
Остальное не по SOLID, а в целом про странности и косяки
Метод getVideo
, судя по имени, должен возвращать видео, а по факту представляет из себя классический сеттер
Почему $file у вас публичный? Если нужно, то зачем отдельный сеттер (getVideo
)
Вот это ОЧЕНЬ ПЛОХАЯ ПРАКТИКА
$pdo->query("UPDATE videos SET playCount = playCount + 1 WHERE filename = ". $this->file);
Всегда используйте подготовленные запросы там где у вас нет железобетонной уверенности в корректности подставляемого параметра.
Почему все методы публичные? Как минимум log
точно должен быть приватным(или защищенным)
Почему playRadio
возвращает текстовую ошибку, а ejectCD
бросает исключение с практически аналогичным текстом?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Имеется docker контейнер php:71-fpm на котором крутится lumen
Сайт написан на php 56 (Kohana), как обновить код самого сайта до php 7