Последовательность переключения петли - 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; я++) { параметры.Добавить(транслировать.разбирать());}
Рекомендации
- ^ "Последовательности переключения петли". КОД УРОВНЯ. Получено 11 апреля 2016.
- ^ Парадигма FOR-CASE и Включены петли в Ежедневный WTF