У меня есть класс с 14 статическими методами и 4 статическими свойствами – это плохо?

Я пишу PHP-класс длиной 450 строк и содержит 14 статических методов и 4 статических свойства, а также 6 констант (и частные __construct() и __clone() ).

Мне интересно, что я делаю что-то неправильно, это классное зло?

Когда вы используете класс, вы всегда вызываете один метод, например:

 MyClass::coolMethod(); 

и тогда вы оставите его в одиночестве, так что кажется, что было бы глупо сделать его конструируемым?

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

На самом деле, из этих 14 методов, 7 из них являются общедоступными – остальные являются частными для класса.

Вы должны избегать static и global .

Статика дает вам те же недостатки, которые дают вам глобальные выгоды. Всякий раз, когда вы используете какие-либо методы класса, вы жестко кодируете зависимость от этого класса в коде потребления. В результате получается менее ремонтируемый жесткий код. Этого можно легко избежать, избегая статики в целом и дисциплинированного использования инъекции зависимостей.

Вы не можете вводить и передавать статические классы, поэтому, например, когда вам нужно их тестировать, вы не можете имитировать их ( или, по крайней мере, только с некоторыми усилиями ). Это просто больно. Статические методы – это смерть для проверки.

Кроме того, имейте в виду, что классы должны делать только одно. У них должна быть одна ответственность . Пройдите через свой класс, чтобы увидеть, есть ли там вещи, которые лучше помещены в другое место, чтобы избежать написания класса Бога.

Это зависит от цели этого класса. Если методы в основном несогласованны с точки зрения данных, это вполне допустимое решение функций группировки (теперь методы). Это очень плохая идея, если вам нужно делиться значениями между функциями, поскольку это будет более простой список функций, сгруппированных под общим именем. Пространства имен – это еще один вариант, но если вы используете PHP-версию ниже 5.3, это, вероятно, лучшее решение.

Это как сказать: «У меня есть дом с четырьмя спальнями. Это плохо?»

Статические методы не являются ни хорошими, ни плохими. Наличие четырнадцати методов не является ни хорошим, ни плохим. Наличие четырнадцати статических методов не является ни хорошим, ни плохим.

Если в ваших четырнадцати методах вы идете на большие длины для имитации экземпляров объектов или для имитации наследования, то что-то пошло ужасно неправильно. PHP позволит создавать экземпляры и поддерживает наследование, поэтому было бы глупо пытаться имитировать их любым другим способом.

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

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

Вот какой-то одноэлементный код, который я использую в рамках структуры, которую я создаю. Вы можете разделить его и сделать его единственным общедоступным методом для своего класса, который возвращает одну версию.

 class ClassName { function getInstance() { static $instance; if (!isset($instance)) { $instance = new ClassName(); } return $instance; } } 

Вы использовали бы это, выполнив ClassName :: GetInstance () -> othermethod ();

Затем класс может иметь массу личных ценностей и в противном случае получить все приятные вещи, которые у вас есть с объектом.

Я бы сказал, что нет, это не плохо. На самом деле это был единственный способ подделать определенное поведение раньше. Это был, например, способ подделывать пространства имен. Можно было инкапсулировать функции в статических классах, вместо того, чтобы их «освобождать». Таким образом, разработчики php знакомы с этим, и это фактически не путает большинство людей. То, что вы ДОЛЖНЫ пытаться делать в наши дни, – это использовать функцию «нового» пространства имен PHP и, если необходимо, объединить ее с шаблоном singleton, если вам действительно нужно хранить данные в формате объекта. Вы могли бы также иметь «глобальную» переменную, содержащуюся в вашем пространстве имен, и время от времени это может работать нормально. Но посмотрите на пространства имен и посмотрите, подходит ли это вам, и после этого посмотрите, может ли шаблон singleton соответствовать вашим конкретным потребностям.