![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
NetJunky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 11.5.2008 Где: Tallinn Репутация: 0 Всего: 0 |
По словам заморских коллег, статические методы не приветствуются в коде. Вопрос почему? Мне привели в пример пару статей, но я не совсем понял из содержания причину такой ненависти к паттерну Singleton и статическим методам в целом.
В статье автор намекает, что стоит придерживаться принципов S.O.L.I.D.. Изначально у меня возник вопрос по прчине нужды в классе Util, где я в данный момент имею методы, которы возможно было бы корректнее оформить, как приводится в пример на php.net
одно отличие, что у меня они статические и тем самым не используется конструктор и атрибуты класса. Буду очень признателен за комментарии по данному вопросу. -------------------- 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 деревьев. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Каких, например? В PHP народ приходит, обычно, имея опыт программирования на других языках. Обычно - Java. Именно оттуда идут многие ООП-предпочтения и правила кодирования, применимость которых в PHP не настолько очевидна и выигрышна как в Java. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
NetJunky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 деревьев. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Про первый пример (Static dependencies).
Ну и что? Если рассматривать вызов FileTool::recursiveDelete не как работу с классом FileTool, а как вызов библиотечной функции FileTool::recursiveDelete, то картинка становится не такой криминальной как кажется автору. Никого не смущает наличие толпы маловразумительных функций в самом php? Названия функций, поименованных через двоеточие, imho, несколько более мнемоничны, чем некоторые стандартные. Второе (Testing) снимается тем-же "взглядом" на статические конструкции. Некоторые вещи просто так сделаны, "не держите их подобным образом" ![]() Добавлено через 4 минуты и 8 секунд Там, кстати, есть пример "фабрики" от `Daniel O'Connor`, в котором те-же возражения применены для нестаитческой реализации. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Довольно сильное утверждение в статье, про ущербность singleton'а, основанного на типичном статическом механизме.
Обычно, +- декоративные элементы, он выглядит как-то так
Понятно, что такая реализация напрочь исключает возможность использования наследника SingleTone_object без правки кода, иcпользующего его. Значит ли то, что имеющийся, ущербный в этом смысле, шаблон использования singleTone, свидетельствует об ущербности статических методов как таковых? imho - нет, просто вы(и я ![]() К примеру, можно завести специальную статическую переменную в SingleTone_object с сетером, чтобы не поменять ее случайно, в которой будем хранить реальное имя класса, который будем инстанцировать.
Не то, что я советовал бы писать именно так, в этой реализации много неудобных углов, но возражение о невозможности наследования синглтона она снимает. Это сообщение отредактировал(а) ksnk - 7.10.2012, 10:16 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
NetJunky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 деревьев. |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Это как это? Приватных конструкторов в нашей реальности не бывает. Достаточно прогнать тест и убедится что по этому поводу думает php.
Добавлено через 13 минут и 48 секунд Хотя нет, бывают...
А разве это существенно? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
NetJunky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 деревьев. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
А, понял. "то такая "защита" для шаблона реализации синглтона? чтобы злые юзеры не вызвали его снаружи противуестественным образом? Хм... забавно, не знал
![]() Да. Для моего случая нужно, чтобы конструктор класса-наследника был публичным. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Впрочем, protected вместо public - более кошерно, конечно, и тоже работает.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
NetJunky |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 деревьев. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Вопросы тестирования, imho, не могут влиять на то, нужно или нет использовать удобное средство. В синглтоне "плохо" то, что расширять его естественным образом - наследованием - сложно. То-же самое относится к использованию статических вызовов self::функций - при переопределении этой функции в наследнике вызывается все равно предыдущий вариант - непривычное и не всегда удобное поведение.
А с тестированием что-то обязательно придумывают. Вот, к примеру, Reflection заведен, imho, именно в целях тестирования и отладки. Другое дело, что ему тут-же нашлось еще много разных применений... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |