Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему статические методы не приветствуются? 
:(
    Опции темы
NetJunky
  Дата 6.10.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 11.5.2008
Где: Tallinn

Репутация: 0
Всего: 0



По словам заморских коллег, статические методы не приветствуются в коде. Вопрос почему? Мне привели в пример пару статей, но я не совсем понял из содержания причину такой ненависти к паттерну Singleton и статическим методам в целом.
В статье автор намекает, что стоит придерживаться принципов S.O.L.I.D..

Изначально у меня возник вопрос по прчине нужды в классе Util, где я в данный момент имею методы, которы возможно было бы корректнее оформить, как приводится в пример на php.net
Код

class Scalar { 

    /** 
     * 
     * @var mixed 
     */ 
    private $value; 

    /** 
     * 
     * @param mixed $v 
     */ 
    public function __construct($v) { 
        $this->value = $v; 
    } 

    /** 
     * 
     * @return string 
     */ 
    public function __toString() { 
        $v = strval($this->value); 
        return $v; 
    } 

    /** 
     * 
     * @return bool 
     */ 
    public function toBool() { 
        $v = (bool) $this->value; 
        return $v; 
    } 

    /** 
     * 
     * @return float 
     */ 
    public function toFloat() { 
        $v = floatval($this->value); 
        return $v; 
    } 

    /** 
     * 
     * @return int 
     */ 
    public function toInt() { 
        $v = intval($this->value); 
        return $v; 
    } 

    /** 
     * 
     * @return string 
     */ 
    public function toString() { 
        $v = strval($this->value); 
        return $v; 
    } 

}

одно отличие, что у меня они статические и тем самым не используется конструктор и атрибуты класса.

Буду очень признателен за комментарии по данному вопросу.


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ksnk
Дата 6.10.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(NetJunky @  6.10.2012,  14:22 Найти цитируемый пост)
Мне привели в пример пару статей

Каких, например?

В PHP народ приходит, обычно, имея опыт программирования на других языках. Обычно - Java. Именно оттуда идут многие ООП-предпочтения и правила кодирования, применимость которых в PHP не настолько очевидна и выигрышна как в Java. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NetJunky
Дата 6.10.2012, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 11.5.2008
Где: Tallinn

Репутация: 0
Всего: 0



В данном случае в пример была приведена  статья static considered harmful. Я изначально беседовал на эту тему на таком сайте, как SO. Как мне показалось, что люди знают о чём говорят и тем самым у меня возник данный вопрос. Чёткого ответа я там не получил.


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ksnk
Дата 6.10.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Про первый пример (Static dependencies).
Цитата

The code in the class MyWhatEver now has a hard dependency on the FileTool class

Ну и что? Если рассматривать вызов FileTool::recursiveDelete не как работу с классом FileTool, а как вызов  библиотечной функции FileTool::recursiveDelete, то картинка становится не такой криминальной как кажется автору. Никого не смущает наличие толпы маловразумительных функций в самом php? Названия функций, поименованных через двоеточие, imho, несколько более мнемоничны, чем некоторые стандартные.

Второе (Testing) снимается тем-же "взглядом" на статические конструкции. Некоторые вещи просто так сделаны, "не держите их подобным образом"  smile К тому-же есть Mock объекты, которые позволяют изменить даже статические реализации для тестирования.

Добавлено через 4 минуты и 8 секунд
Там, кстати, есть пример "фабрики" от `Daniel O'Connor`, в котором те-же возражения применены для нестаитческой реализации.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 7.10.2012, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Довольно сильное утверждение в статье, про ущербность singleton'а, основанного на типичном статическом механизме.
Обычно, +- декоративные элементы, он выглядит как-то так
Код

class SingleTone_object {

    private static  $instance;

...

   public static function getInstance($args=false) {
        if (self::$instance === null) {  
            self::$instance = new self($args);
        }  
        return self::$instance;
    }
...

}

...

$object=SingleTone_object::getInstance();


Понятно, что такая реализация напрочь исключает возможность использования наследника SingleTone_object без правки кода, иcпользующего его.
Значит ли то, что имеющийся, ущербный в этом смысле, шаблон использования singleTone, свидетельствует об ущербности статических методов как таковых? imho - нет, просто вы(и я  smile ) не умеете их готовить. Давайте использовать более гибкий шаблон singleTone.

К примеру, можно завести специальную статическую переменную в SingleTone_object с сетером, чтобы не поменять ее случайно, в которой будем хранить реальное имя класса, который будем инстанцировать.

Код

class SingleTone_object {

    private static  $instance;
    private static  $className;

...
  // сеттер для className
   public static function redefineClassName($class){
       self::$className=$class;
   }

   public static function getInstance($args=false) {
        if (self::$instance === null) {
            $class=self::$className;
            if(empty($class))  
                 self::$instance = new self($args);
            else
                 self::$instance = new $class($args);
        }  
        return self::$instance;
    }
...

}

// файл NewObject.php
class NewObject extends SingleTone_object{
 ...
}
SingleTone_object::redefineClassName('NewObject');
...
// где-то в коде
$object=SingleTone_object::getInstance();


Не то, что я советовал бы писать именно так, в этой реализации много неудобных углов, но возражение о невозможности наследования синглтона она снимает.

Это сообщение отредактировал(а) ksnk - 7.10.2012, 10:16


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NetJunky
Дата 7.10.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 11.5.2008
Где: Tallinn

Репутация: 0
Всего: 0



Небольшое уточнение, вы просто опустили, что конструктор должен быть приватным, так как в данном примере это не затрагивающийся аспект паттерна или в данном случае именно имеется ввиду, что конструктор публичный?


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ksnk
Дата 7.10.2012, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(NetJunky @  7.10.2012,  14:57 Найти цитируемый пост)
вы просто опустили, что конструктор должен быть приватным

Это как это? Приватных конструкторов в нашей реальности не бывает. Достаточно прогнать тест и убедится что по этому поводу думает php.
Код

class xxx {

   private function __construct() {
      echo 'xxx'; 
   }
  
}

$x=new xxx();


Добавлено через 13 минут и 48 секунд
Хотя нет, бывают...
Код

class xxx {

   private function __construct() {
      echo 'xxx'; 
   }
  
   static function _xxx() {
      return new xxx();
   }
}

$x=xxx::_xxx();


А разве это существенно?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NetJunky
Дата 7.10.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 11.5.2008
Где: Tallinn

Репутация: 0
Всего: 0



Имелось в виду, что конструктор Singleton шаблона обычно привытный. Тобишь

Код

class SingleToneObject
{
    /**
     * @var SingleToneObject
     */
    private static $instance;
    
    private function __construct()
    {
    }
    
    public static function getInstance()
    {
        if ( null === self::$instance )
        {  
            self::$instance = new self();
        }
        
        return self::$instance;
    }
}



--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ksnk
Дата 7.10.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



А, понял. "то такая "защита" для шаблона реализации синглтона? чтобы злые юзеры не вызвали его снаружи противуестественным образом? Хм... забавно, не знал smile

Да. Для моего случая нужно, чтобы конструктор класса-наследника был публичным.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 7.10.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Впрочем, protected вместо public - более кошерно, конечно, и тоже работает.
Код

class xxx {
    private static $class = null;
    private static $instance=null;

    protected function __construct() {
        echo 'xxx '; 
    }

    public static function replaceClass($class){
        self::$class=$class;
    }
  
    public static function getInstance()
    {
        if ( null === self::$instance )
        {  
            if(empty(self::$class))
                self::$instance = new self();
            else {
                $class=self::$class;
                self::$instance = new $class();
            }
        }
        
        return self::$instance;
    }
}

class yyy extends xxx{
   protected function __construct() {
      echo 'yyy '; 
      parent::__construct();
   }
}

xxx::replaceClass('yyy');

$x=xxx::getInstance();



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NetJunky
Дата 10.10.2012, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 11.5.2008
Где: Tallinn

Репутация: 0
Всего: 0



Вроде более не менее понятно, почему Singleton не приветствуется. Тяжело тестировать. 


--------------------
Sleep, those little slices of death; Oh how I loathe them. © Edgar Allan Poe
Таллиннцы http://vingrad.ru/groups.php?action=group_...mp;group_id=139

Для записи данных объёмом 1 Терабайт на бумагу, нужно срубить 50000 деревьев.
PM MAIL WWW ICQ Skype MSN   Вверх
ksnk
Дата 10.10.2012, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Вопросы тестирования, imho, не могут влиять на то, нужно или нет использовать удобное средство. В синглтоне "плохо" то, что расширять его естественным образом - наследованием - сложно. То-же самое относится к использованию статических вызовов self::функций - при переопределении этой функции в наследнике вызывается все равно предыдущий вариант - непривычное и не всегда удобное поведение. 

А с тестированием что-то обязательно придумывают. Вот, к примеру, Reflection заведен, imho, именно в целях тестирования и отладки. Другое дело, что ему тут-же нашлось еще много разных применений...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.