За последние 24 часа нас посетили 21964 программиста и 988 роботов. Сейчас ищут 635 программистов ...

Организация кода. Шаблоны проектирования? Лучшие практики?

Тема в разделе "Yii", создана пользователем SpikePHP, 5 фев 2018.

  1. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Вот код опытного разработчика :
    PHP:
    1. lass StringHelper
    2. {
    3.     private $limit;
    4.    
    5.     public function __construct() {
    6.         $this->limit = Yii::$app->params['shortTextLimit'];
    7.     }
    8.    
    9.     public function getShort($string, $limit = null)
    10.     {
    11.         if ($limit === null){
    12.             $limit = $this->limit;
    13.         }
    14.         return substr($string, 0, $limit);
    15.     }
    16. }
    Почему не упростить его до этого:
    PHP:
    1. Class StringHelper
    2. {
    3.    
    4.     public function getShort($string, $limit = null)
    5.     {
    6.         if ($limit === null){
    7.             $limit = Yii::$app->params['shortTextLimit'];
    8.         }
    9.         return substr($string, 0, $limit);
    10.     }
    11. }
    Зачем связываться с методом __construct и свойством , если можно просто нужный параметр в методе getShort получить прям из параметров Yii ?

    Зачем так заморачиваться? Что это? Лучшие практики?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну лишние 3 строчки - это не заморочка :) Ему кажется, что так понятнее.
     
    SpikePHP нравится это.
  3. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Опытный напишет:

    PHP:
    1. class StringHelper
    2. {
    3.     private $limit;
    4.  
    5.     public function __construct($limit) {
    6.         $this->limit = $limit;
    7.     }
    8.  
    9.     public function getShort($string, $limit = null) {
    10.         return substr($string, 0, $limit ?: $this->limit);
    11.     }
    12. }
     
    SpikePHP нравится это.
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    вслепую могу предположить, что это оптимизация. getShort() может вызываться несколько раз для одного объекта. незачем всякий раз дёргать длинную цепочку. логически рассуждая это свойство можно было бы статическим т.к., данный параметр общий для всего приложения, а не для конкретного объекта.
    это конечно копеечная оптимизация, просто она вполне логична :)

    хорошей практикой считается инъекция зависимостей, чтобы облегчить тестирование и портирование классов. то есть вот так:
    PHP:
    1.     public function __construct($limit) {
    2.         $this->limit = $limit; // <-- !!! избавились от глобальной зависимости !!!
    3.     }
    в реальной жизни конечно, если ты делаешь код для конкретного приложения, а не для публикации на packagist, необязательно так заморачиваться.
     
    SpikePHP нравится это.
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @SpikePHP лично я вообще пишу сеттеры и геттеры в таких случаях. А контсруктор обычно пустует.
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @artoodetoo, @ElisDN писать всё всегда в конструкторе не кашерна.
    А если я не захочу использовать одно из св-в в этой логике... Например нашёл код приложенный в вики...
    по Dependency injection

    PHP:
    1. class DbConfiguration{
    2.  
    3.     private $host;
    4.     private $port;
    5.     private $username;
    6.     private $password;
    7.  
    8.     public function __construct(string $host, int $port, string $username, string $password){
    9.         // вся соль Di находится в строчках ниже
    10.         $this->host = $host;
    11.         $this->port = $port;
    12.         $this->username = $username;
    13.         $this->password = $password;
    14.     }
    15.  
    16.     public function getHost(){
    17.         return $this->host;
    18.     }
    19.    // и.т.д остальные геттеры
    20. }
    21.    
    скопировал отсюда: https://ru.wikipedia.org/wiki/Внедрение_зависимости#Пример_кода_на_PHP

    Конкретно данное решение инкапсулирует данные.
    А если я этого не хочу?)
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @ElisDN я если честно вообще смысла не вижу в написании данного класса. в том виде который вы предложили - это по сути обёртка над функцией сабстр, которая не чего абсолютно не делает...
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @askanim, там оба класса надо приводить, чтоб суть понять инъекции зависимости. Хотя пример слабый в вики, не показывает реальной мощи приёма. Там на Java нормальный пример
     
  9. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Такой же смысл, что и у исходного варианта кода от автора темы.
     
  10. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @askanim Это код из курса для новичков. Наверное, чтобы не путать новичков инъекциями зависимостей, и при этом не писать откровенно связанный код, был выбран такой вариант