Для чего вложенные функции PHP?

Что делать, если FootballTeam имеет команду резервов вместе с основной командой?

class FootballTeam
{
    List<FootballPlayer> Players { get; set; }
    List<FootballPlayer> ReservePlayers { get; set; }
}

Как бы вы это моделировали?

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}

Очевидно, что отношение имеет , а не является .

или RetiredPlayers?

class FootballTeam
{
    List<FootballPlayer> Players { get; set; }
    List<FootballPlayer> ReservePlayers { get; set; }
    List<FootballPlayer> RetiredPlayers { get; set; }
}

Как правило, если вы когда-либо захотите наследовать из коллекции, назовите класс SomethingCollection.

Семантически ли ваш SomethingCollection имеет смысл? Выполняйте это только в том случае, если ваш тип является коллекцией Something.

В случае FootballTeam это звучит неправильно. A Team больше, чем Collection. В Team могут быть тренеры, тренеры и т. Д., Как указывали другие ответы.

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

FootballPlayerCollection звучит как коллекция игроков, которая будет действительным именем для класса, наследующего от List<FootballPlayer>, если вы действительно этого хотели.

Действительно List<FootballPlayer> - совершенно хороший тип, с которым нужно иметь дело. Возможно, IList<FootballPlayer>, если вы возвращаете его из метода.

В резюме

Задайте вопрос

  1. Is X a Y? или Имеет X a Y?
  2. Знают ли мои имена классов, каковы они?
76
задан kay 24 May 2011 в 20:25
поделиться

2 ответа

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

Eran Galperin ошибается, что эти функции являются так или иначе частными, они являются просто необъявленными, пока outer() не выполняется. Они не также конфиденциально ограничены по объему, они действительно загрязняют глобальную область видимости, хотя отложено. И как обратный вызов внешний обратный вызов можно было все еще только назвать однажды. Я все еще не вижу, как это - полезное применение его на массиве который вероятные вызовы псевдоним несколько раз.

единственный пример 'реального мира', который я мог вскопать, это , который может только работать однажды и мог быть переписан более чистый IMO.

единственное использование, о котором я могу думать, для модулей для вызова [имя] _include метода, который устанавливает несколько вложенных методов в глобальном пространстве, объединенном с

if (!function_exists ('somefunc')) {
  function somefunc() { }
}

проверки.

ООП PHP, очевидно, было бы лучшим выбором:)

85
ответ дан Peter Mortensen 24 November 2019 в 11:10
поделиться

Функции, определяемые в функциях, для которых я не вижу много использования, но условно определенные функции я могу. Например:

if ($language == 'en') {
  function cmp($a, $b) { /* sort by English word order */ }
} else if ($language == 'de') {
  function cmp($a, $b) { /* sort by German word order; yes it's different */ }
} // etc

И затем весь Ваш код должен сделать, использовать функцию 'cmp' в вещах как usort () вызовы, таким образом, Вы не замусорили проверки языка на всем протяжении своего кода. Теперь я не сделал этого, но я вижу аргументы в пользу того, чтобы сделать его.

7
ответ дан cletus 24 November 2019 в 11:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: