Как избавиться от операторов switch — малоизвестный способ
Простой способ облагородить свой код
Скорее всего, вы, как и я, научились не перегружать исходный код операторами if . Они трудно читаются. Такой код сложно проверить и выглядит он совсем не ахти.
Конечно же, это абстрактный пример, вырванный из контекста реального приложения. Только представьте себе, как мы выполняем вызовы функций внутри операторов. Или проверяем большое количество условий.
Каким решением разработчики пользуются чаще?
Давайте рассмотрим следующий пример. Сначала мы сравниваем выражение с набором значений, а затем выполняем код, когда одно из значений становится true . Все ли вы понимаете? Может, будет проще воспользоваться оператором switch ?
Я специально не убрал отбивку, пусть даже она не особо нужна при операторе return .
А сможете сразу понять, что не так с этим примером?
Написав такое, вы ничуть не сократите детализацию кода. Да и сложность кода никуда не денется. Такой код по-прежнему странно выглядит и с трудом поддерживается. Хотя теперь легче понять, что же вы пытаетесь в нем сделать.
Решение
Думаю, вам должно быть интересно, как работает рефакторинг. И почему этот пример может быть поучительным. Большинство людей привыкло писать код в такой хронологии:
- подумать о проблеме;
- реализовать черновое решение или прототип;
- написать код;
- подкорректировать части кода, чтобы он выглядел/выполнялся/работал лучше.
Последняя часть обычно считается рефакторингом. И она не должна быть «разовой акцией». Не проводите рефакторинг впопыхах сразу после написания кода, чтобы затем позабыть о файле.
Это так не работает. Рефакторинг похож на замкнутый круг. Вы что-то реализуете, затем стараетесь это дело улучшить, потом сокращаете, а после — избавляетесь от проблемных мест.
“Код должен быть гибким. И вы поддерживаете эту гибкость своим непрерывным вниманием к деталям ”.
Поэтому постарайтесь еще глубже погрузиться в процесс рефакторинга. Не останавливайтесь на первом этапе. А если работаете с уже готовым кодом, то пытайтесь улучшить его сразу. Плавно и без лишней спешки.
Давайте закончим с проверкой условий. Почему бы не воспользоваться функцией вместо switch ?
Обратите внимание, как мы определяем объект ingredients . Так мы избегаем его создания при каждом вызове getIngredients . А || используется для управления стандартными случаями, когда мы возвращаем lemon .
Проще, красивее и легче поддерживается. Это как раз то, что может сделать хороший рефакторинг. Но не останавливайтесь после первой попытки.
И помните, что вы можете пользоваться Map :
Заключение
Целью данной статьи было не просто показать вам, как можно улучшить код, но и пролить свет на процесс рефакторинга, а также объяснить, почему многие из нас его делают неправильно. Надеюсь, эта информация была вам полезной.
Источник
Что такое switch и как с ним бороться?
Программа без ветвления — очень простая и странная программа. Программа должна думать, просчитывать варианты, по-разному реагировать на различные внешние воздействия и вообще не быть однообразной. А это все невозможно без ветвлений. Ветвления реализуются при помощи опреаторов if и switch. Так зачем е с ним бороься?
Периодически, при просмотре чужого кода, мне попадаются длинные методы и громоздкие конструкции вложенных if и switch. Например, такие:
Меня лично, такие методы пугают и они просто не помещяются в моей голове. Первое что просится — это дать названия всем магичесским числам. Например, так:
Но если присмотреться, то мы не учитываем LoginSection если установлено значение self.loggedIn и прячем DetailsSection если сброшено значение self.settings.showDetails. Но мы просто преобразуем значение section в SectionIndex исходя из текущего состояния:
По-моему, уже выглядит гораздо приятнее, особенно если учесть, что таких ветвлений в объекте обычно несколько. Например, -titleForItem:inSection:, -performActionForItem:inSection: и т.п. А что если вспомнить о том, что язык у нас объектно-ориентированный, и состояние системы можно занести в объект-состояние? Тогда все эти методы сократятся до одной строки — обращение к объекту-состояния?
По-моему, вполне красиво. Осталось только откуда-то досать это самое состояние. Можн настраивать объекты состояний в самом объекте или написать нескольуо классов, определяющих состояния.
Получается, что мы избавились от ветвлений в нескольких местах, заменив его одной установкой состояния, а сами состояния получились целостными, понятными и собранными в одном месте.
Источник
Избавится от switch case
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как избавится от switch case?
Как избавится от большого swich case допустим вот такой, хотя у меня он намного больше. Может.
Можно ли избавится от switch?
есть вот такая конструкция можно как то ее заменить ? — на Linq допустим switch (wtf.ToLower()).
SWITCH-CASE
switch — case 1 to 5
в вб используя select case можно указать для ветви Case 1 to 5 — тогда программа зайдет в эту веть.
Нам он почему-то не нравится. Попробуем перевести его в стратегию, и чтобы было более приближенно к реальности, добавим фабрику.
Теперь зададим себе вопрос — что поменялось? Всесто простой конструкции switch добавилось куча классов, которые еще предстоит поддерживать. При этом «x», «y» и «z» так же декларативно заданы, только внутри фабрики. Кажется не рационально.
Можно ли их задать динамически, подгрузив в рантайме из некоторого источника данных. Ответ можно. Но тогда и значения словаря придется создавать на уровне рефлексии, и то в случае если паттерн будет соответствовать некоторой конвенции по названиям классов в программе. Поддерживать такой код тоже достаточно неприятно.
Конечно есть случаи, когда такой подход имеет плюсы. Но если говорить обобщенно, то следует хорошо подумать и взвесить, а нужно ли такое делать.
Источник
Замена switch полиморфизмом
Оправдана ли замена If на Switch
Всем привет! Я получаю ответ от сервера: string killer; killer = new.
Замена if else на switch
Доброго времени суток. Нуждаюсь в помощи с лабораторной работой. Задание: написать программу.
Замена switch на if
Задание: Заменить в примере оператор switch структурой операторов if. Вопрос: Как можно заменить.
Замена if на switch
Задача. Это нужно сделать с помощью switch. ( Для натурального числа k вывести фразу “Мы нашли k.
Эмм. А не проще было написать метод для генерации барьеров, а информацию как генерировать вынести в data-файлы. В этом случае код был бы проще.
Уровни можно было-бы хранить в словаре типа , в метод генерации блоков передаем имя файла, и он все генерит. Т.е. мы заменяем весь код региона на словарь и один метод, явный PROFIT.
Можно объединить методы по создание объектов в массив и вызывать по имени.Будет без свитч.
Ну или медленная рефлексия)
Замена switch/case
Здравствуйте, я написал программу, теперь хочу чтобы по вводу в консоль 1 у меня выполнялся вот.
Замена большого Switch
Привет, взглянув чуть-чуть наперед, и осознав что код может стать куда больше, появилась.
Замена if-ов на switch case
В общем, было такое задание: Дана строка. Найдите в этой строке второе вхождение буквы f и.
Замена If на Switch вызвала ошибки
Создаю структуру, подключаю к ней txt файл, использовала if, все работало, решила поменять на.
Замена конструкции switch словарем
Здравствуйте форумчане! Есть задача вывести словами трехзначное число(325 -> ТристаДвадцатьПять.
Замена чисел на символы (switch)
Написать программу замены введенного числа от 0 до 9 соответствующим символом (1=! 2=@ . ) с.
Источник
Можно ли избавится от switch?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Избавится от switch case
Всё задание в заголовке, видел способ как можно заменить свитч с помощью словаря и делегат, хочу.
Как избавится от switch case?
Как избавится от большого swich case допустим вот такой, хотя у меня он намного больше. Может.
Можно ли избавится от Maybe в типе?
есть пользовательский тип product , есть первая функция которая возвращает maybe produkt и вторая.
If и switch можно ли объединить?
Недавно начал изучать с++, так что не судите строга если код «Говно код» и я дурак))) #include.
Kotyara0live, это — говнокод не столько из-за наличия switch-case (что не является зазорным), сколько из-за того, что у вас четыре раза код повторяется. Замените код в каждом сейсе на определение индекса, а после блока switch используйте этот индекс для обращения к массиву.
Если вариантов станет совсем много, то их можно «утрамбовать» в словарь в (Dictionary или SortedDictionary).
свич выполняет свое дело .. но .. меня смущает это то что если я добавлю еще один элемент в массив то мне нужно пилить еще один кейс , а если 10 элементов оО ..
Добавлено через 2 минуты
Можно ли на jquery заменить if-else на switch
Вот есть такой код var notUser = «Нет такого пользователя!»; var notUserEn = «A user is not.
Чем можно заменить Switch — case ?
Доброго времени суток, уважаемые форумчане! Помогите решить проблему с case. В этой программе нужно.
Можно ли свернуть блок Switch в коде
Как сделать так, чтобы оператор switch сворачивался так как void Instraction ?
Чем можно заменить дефолт в switch-е?
Вобщем есть три команды, мышь двигается, крутится колесо, и еще одна команда которую хотел сделать.
Можно ли заново пройти одит и case в switch?
Есть switch в котором идут case, и в одном case я хочу сделать так, если в нем не выполняется if.
Источник