принцип единой ответственности и читаемость кода - PullRequest
1 голос
/ 13 февраля 2020

Пытаясь придерживаться правила единой ответственности, мои классы начали выглядеть так:

$productImage = new ProductImage(// holds all rules for product image only
                    new ImageFile( // makes sure given file is an image file
                        new ReadableFile( // checks given item is a readable file / permissions check
                            new UploadedFile( // validates given file is uploaded file
                                new FilePath( // validates given string is a valid file path
                                    new Path( // validates for string to be a path
                                        new NonEmptyString( // given string is not empty
                                            '/tmp/xyzk7kjnbrukhg'
                                        )
                                    )
                                )
                            )
                        )
                    )
                );

Это всего лишь один пример. На первый взгляд, все выглядит круто, так как предоставляет очень простые и проверяемые классы. но, как вы можете заметить, читаемость или удобство использования кода отстой. Мне нужно написать бесчисленное количество строк кода, даже для простой инициализации загруженного файла (как показано в приведенном выше коде).

Я начал чувствовать, что что-то не так, и я неправильно понял концепцию единственной ответственности принцип.

Это как чисто OOP с единоличной ответственностью за каждый класс или я не в курсе?

1 Ответ

1 голос
/ 13 февраля 2020

Вы полностью далеки от SRP (Single Responsibility Principle). Как SRP работа полностью не видна в вашем коде. Это нормально, что у вас есть классы, они отвечают за разные работы. Может быть или, я думаю, они реализованы с соблюдением SRP. Видимость SRP в вашем коде намного меньше, кроме предположения.

В OOP классы зависят от других классов. Это абсолютно нормально. Dependency Injection полностью видно в вашем коде. Но вы не можете поддерживать Dependency Injection с помощью метода конструктора так, как вы это делали при построении сложной структуры. Это должно быть следующим образом:

<?php

// given string is not empty
$nonEmptyString = new NonEmptyString('/tmp/xyzk7kjnbrukhg');

// validates for string to be a path
$path = new Path($nonEmptyString);

// validates given string is a valid file path
$filePath = new FilePath($path);

// validates given file is uploaded file
$uploadedFile = new UploadedFile($filePath);

// checks given item is a readable file / permissions check
$readableFile = new ReadableFile($uploadedFile);

// makes sure given file is an image file
$imageFile = new ImageFile($readableFile);

// holds all rules for product image only
$productImage = new ProductImage($imageFile);

Но это также неправильный способ сделать это . Для этого нужно использовать Factory Method Design Pattern. Factory Method Design Pattern фактически создает другие объекты. Предполагая, что у вас есть реализация шаблона фабричного метода, и он будет отвечать за создание объекта ImageFile, поскольку ProductImage имеет зависимость ImageFile. Предполагая, что вы импортировали все необходимые классы в следующем фрагменте кода:

<?php

class ImageFileFactory implements FactoryInterface
{
    public static function make($string)
    {
        // given string is not empty
        $nonEmptyString = new NonEmptyString($string);

        // validates for string to be a path
        $path = new Path($nonEmptyString);

        // validates given string is a valid file path
        $filePath = new FilePath($path);

        // validates given file is uploaded file
        $uploadedFile = new UploadedFile($filePath);

        // checks given item is a readable file / permissions check
        $readableFile = new ReadableFile($uploadedFile);

        // makes sure given file is an image file
        return new ImageFile($readableFile);
    }
}


// Creates ImageFile instance
$imageFile = ImageFileFactory::make('/tmp/xyzk7kjnbrukhg');

// holds all rules for product image only
$productImage = new ProductImage($imageFile); 

О! У меня есть запись на носителе SRP. Если вы можете прочитать это. Вот ссылка SRP

Надеюсь, это поможет вам! Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...