У меня есть класс с 14 статическими методами и 4 статическими свойствами - это плохо? - PullRequest
6 голосов
/ 06 декабря 2010

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

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

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

MyClass::coolMethod();

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

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

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

Ответы [ 5 ]

4 голосов
/ 06 декабря 2010

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

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

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

Кроме того, имейте в виду, что классы должны делать только одно. Они должны нести единоличную ответственность .Пройдите свой класс, чтобы увидеть, есть ли там что-то, что лучше поместить в другое место, чтобы не писать Класс Бога.

3 голосов
/ 06 декабря 2010

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

2 голосов
/ 06 декабря 2010

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

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

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

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

1 голос
/ 06 декабря 2010

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

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

class ClassName {
    function getInstance()
        {
            static $instance;

            if (!isset($instance)) 
      {
                $instance = new ClassName();
            }

            return $instance;
        }
}

Затем вы можете использовать это, выполняя ClassName :: GetInstance () -> othermethod();

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

0 голосов
/ 06 декабря 2010

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

...