Использование класса в качестве пространства имен - PullRequest
2 голосов
/ 19 июня 2010

Есть ли причины, по которым я не должен создавать конечный класс со статическими методами, чтобы избежать вызова некоторых внутренних функций?

final class ModuleGlobalFunctions {
  static public function generateWord {
    $result = '';

    while (strlen($result) < 12) {
      $result = self::generateSyllable();
    }

    return $result
  }

  static private function generateSyllable() {
    // Generates a random syllable.
    // …
  }
}

$word = ModuleGlobalFunctions::generateWord();

// It raises an error.
$syllable = ModuleGlobalFunctions::generateSyllable();

Ответы [ 2 ]

3 голосов
/ 19 июня 2010

Создание класса для защиты частных функций - хорошая идея.Таким образом, открытый метод в классе может вызывать закрытый метод, не делая вызываемый закрытый метод извне класса.

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

Создание класса static - плохая идея, поскольку он тесно связывает вызывающую программу с классом.Если вы вызываете Test :: generateWord (), он всегда будет использовать класс Test.Однако, если вы используете $ test-> generateWord (), вы можете передать другой класс, который создает другие слова.Это облегчает изменение программного обеспечения и упрощает его модульное тестирование.

2 голосов
/ 19 июня 2010

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

Что касается final , это бросок вверх.Я предпочитаю использовать abstract для предотвращения создания экземпляров (поскольку PHP не поддерживает static классы).Если вы используете final, я бы предложил добавить закрытый конструктор, чтобы предотвратить создание экземпляров: private function __construct() {} ...

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

Что касается передачи экземпляра, как упоминает Сьорд, вы можете сделать это со статическими классами (и на самом деле быть менее тесно связаны,с примерами).Вот причина.Если вам не требуется (и не проверяется) интерфейс или наследование, вы не будете знать, реализует ли объект метод generateWord().Но, если вы передадите обратный вызов, не имеет значения, как осуществляется доступ к методу (или его базовой конструкции), все, что имеет значение, - это то, что он имеет одинаковый (или похожий) синтаксис (в отношении параметров и возвращаемых значений).Теперь интерфейсы - лучшее решение для этого (так как он усиливает интерфейс), но они требуют довольно глубокого понимания ООП для правильного проектирования.В крайнем случае, обратный вызов будет работать вполне нормально для этого случая ...

...