Последовательность переключения петли - Loop-switch sequence

А последовательность переключения петли[1] (также известный как индивидуальная парадигма[2] или Анти-Устройство Даффа ) является программированием антипаттерн где четкий набор шагов реализован в виде переключателя внутри цикла. Последовательность переключения петли является производной от код спагетти.

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

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

пример

Решение, управляемое событиями, будет реализовывать интерфейс слушателя:

Строка ключ = значение NULL;Строка ценность = значение NULL;Список<Строка> параметры = значение NULL;int столбец = 0;общественный пустота addToken(жетон) {    // анализируем ключ, значение и три параметра     переключатель (столбец) {        кейс 0:            параметры = новый LinkedList<Строка>();            ключ = жетон;            перемена;        кейс 1:            ценность = жетон;            перемена;        по умолчанию:            параметры.Добавить(жетон);            перемена;    }    если (++столбец >= 5) {        столбец = 0;        completeRow(ключ, ценность, параметры);    }}

Но без слушателя он становится примером антипаттерна:

// анализируем ключ, значение и три параметра Строка ключ = значение NULL;Строка ценность = значение NULL;Список<Строка> параметры = новый LinkedList<Строка>();за (int я = 0; я < 5; я++) {    переключатель (я) {        кейс 0:            ключ = транслировать.разбирать();            перемена;        кейс 1:            ценность = транслировать.разбирать();            перемена;        по умолчанию:            параметры.Добавить(транслировать.разбирать());            перемена;    }}

А вот и переработанное решение:

// анализируем ключ и значениеСтрока ключ = транслировать.разбирать();Строка ценность = транслировать.разбирать();// анализируем 3 параметраСписок<Строка> параметры = новый LinkedList<Строка>();за (int я = 0; я < 3; я++) {    параметры.Добавить(транслировать.разбирать());}

Рекомендации

  1. ^ "Последовательности переключения петли". КОД УРОВНЯ. Получено 11 апреля 2016.
  2. ^ Парадигма FOR-CASE и Включены петли в Ежедневный WTF