Как избавиться от у type

Как избавиться от if-else при помощи команд и обработчиков

В этой статье я расскажу, как использую команды и обработчики, чтобы код был удобным и аккуратным. Я стремился не избавиться от if-elseif-else , а найти более подходящее решение.

Помните, что один-единственный подход не позволит полностью избавиться от традиционного программирования с ветвлением. Нужно создать себе целый инструментарий, а потом выбирать из него нужные техники.

Рассматриваемый в статье способ — просто один из многих.

Сама по себе конструкция if-else не так уж плоха. Мы просто попали в ситуацию «когда в руках молоток, всё вокруг кажется гвоздями». В основах программирования мы изучаем условные операторы и многим разработчикам не удаётся перерасти их использование.

Однако if-else и switch зачастую неидеальны. Программисты обычно пренебрегают более качественными решениями, например, полиморфическим исполнением и словарями.

Мы стремимся избегать традиционного условного ветвления

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

Вот пример того, чего бы мы хотели избежать: некрасивое, плохо расширяемое ветвление, зависящее от дискретного значения.

Сложное ветвление, вызывающее головную боль

Кроме уродливого использования if-elseif-else основная проблема заключается в том, что нужно добавлять ветвление для каждой новой причины обновления. Это явное нарушение принципов открытости/закрытости и единственной ответственности.

По сути, каждую ветвь можно преобразовать в собственную команду и соответствующие обработчики.

Давайте посмотрим, как это возможно.

Использование команд и обработчиков для упрощения приложения

Я не буду устраивать вам лекцию о теории команд, запросов и обработчиков. По этой теме существует множество ресурсов. Вместо этого я составил краткий список их возможных преимуществ.

  1. Тестирование становится намного проще. Не нужно дополнять существующие тесты для учёта новых возможностей. Если команда требует дополнительной обработки, мы создаём ещё один обработчик, который тестируется независимо.
  2. Несколько обработчиков может обрабатывать одну команду. Как вы уже наверно заметили, передача одной команды может вызвать один или несколько обработчиков. Таким образом, можно добавлять новую функциональность, не касаясь старого кода.
  3. Простые классы. Команда — это набор свойств без сеттеров. Ошибиться здесь будет сложно. Аналогично, обработчик — это класс только с одним публичным методом.
  4. Действия контроллера подчиняются шаблону Request-Delegate-Response. Они не содержат никакой бизнес-логики и слоёв хранения данных.

Если вы практикуете event storming, то наверняка уже вполне понимаете, почему замечательны команды и обработчики.

Вышеупомянутую статью я завершил намёком на то, как можно использовать динамическую диспетчеризацию команд для устранения необязательного ветвления. А сейчас вы увидите один из способов реализации команд и обработчиков.

Наконец-то код!

Чтобы можно было следить за кодом, позвольте вкратце рассказать, чего мы хотим достичь.

Мы хотим сказать: «Так, должно произойти нечто. Вот значения. Мне не важно, кто этим займётся, просто дайте знать, когда всё будет готово».

Существует три критерия, которые нам нужно удовлетворить:

  1. Команду можно выполнить так, чтобы вызывающий не знал конкретных обработчиков.
  2. Необходимо выполнить каждый обработчик, соответствующий команде.
  3. Новые команды или этапы обработки не должны требовать изменения существующего кода.

Начнём с самого внешнего слоя и дойдём до самого дна

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

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

Обновление конечной точки электронной почты

Примерный смысл кода должен быть вам понятен, хоть это и C# aspnetcore. Если вкратце, это действие контроллера — конечная точка и её реализация.

Я знаю, о чём вы думаете: «а где обработка ошибок?» Не волнуйтесь, вы правы, она должна здесь быть, но ради краткости я вырезал её, чтобы можно было сосредоточиться на концепции выполнения команд.

Читайте также:  Таблетки от клещей для кошек инспектор квадро

Контроллер имеет зависимость от CommandDispatcher . Мы доберёмся до этого класса позже. Класс диспетчера имеет единственный метод DispatchAsync(command) . Это пока всё, что вам нужно знать.

Это позволяет нашему контроллеру заниматься только проверкой правильности получаемых им данных и отправкой команд. Как обрабатываются данные после запуска команды, контроллеру совершенно не важно.

Каждая «причина обновления» (update reason) требует собственной конечной точки со своей формой данных, то есть отправляемой командой.

На этом этапе для реализации новых функций, например «update username», достаточно создать новую конечную точку и отправить команду.

Конечная точка Update username

При использовании такого подхода создание конечных точек становится чрезвычайно тривиальным, и это замечательно.

По сути, наша конечная точка уже готова.

Итак, давайте двигаться дальше.

В командах и обработчиках находится вся бизнес-логика

При работе с командами нам нужно заботиться о двух аспектах: неизменяемости и корректности данных.

Это просто старые добрые классы, в них нет ничего сложного. Взгляните на этот ChangeEmailCommand .

Старый добрый класс команды

Очевидно, что этот класс команды выполняет не очень много действий. В этом-то и весь смысл. Его задача — передаваться обработчику.

Итак, мы добрались до обработчика. Изучите представленный ниже код. Далее я объясню, что в нём происходит.

Простой обработчик команды, который легко тестировать.

Во-первых, у нас есть интерфейс, который должны реализовать все обработчики команды. Интерфейс важен, когда нам нужно обнаружение динамических типов. Скоро мы к этому вернёмся.

Во-вторых, я создал простой обработчик, знающий, как работать с ChangeEmailCommand . Обобщённый параметр ICommandHandlerAsync сообщает нам «этот обработчик нужно вызывать при передаче команды ‘change email command’».

Вы ощущаете, насколько удобен для тестирования этот класс? В этом весь смысл. Его ужасно легко будет тестировать. Этот класс очень сфокусирован — один метод, одна зависимость.

Если вы привыкли к классам «Service», то знаете, какими безумными иногда становятся конструкторы. Такой подход полностью устраняет возможность разбухания конструктора.

Сам диспетчер, невероятно простой и надёжный

Вы уже видели интерфейс диспетчера, он понятен и прост. Но давайте освежим воспоминания.

Публичный интерфейс диспетчера команды

Прежде чем мы приступим к разбору реализации, давайте повторим, чего нам нужно достичь при помощи CommandDispatcher .

Мы хотим сказать: «вот команда, найди все соответствующие ей обработчики и передай команду каждому из них».

Это означает, что для каждого класса команды нам нужен список соответствующих обработчиков команды. В коде мы можем выразить эту необходимость при помощи словаря, в котором ключом будет тип команды, а значением — список обработчиков.

Не торопитесь, разберитесь во всём тщательно. Освоившим ООП это может показаться очень лёгким, но кому-то понадобится время. Ниже я опишу то, что мы делаем.

Диспетчер команды с поиском по словарю

Здесь нет ничего особо сложного, но не знающих ООП людей код может запутать. Не волнуйтесь, вероятно, вы запросто сможете найти способ реализации на функциональном языке.

Сам код в описании не нуждается. Это обычный C#. Важно только его назначение.

Самая важная часть — наличие механизма сопоставления команд с обработчиками. Для этого я использую словарь.

Каждый ключ — это тип команды. Соответствующее ему значение — это список обработчиков, реализующих ICommandHandlerAsync .

При вызове, например, DispatchAsync(ChangeEmailCommand) , диспетчер пытается найти внутри словаря ключ «Type: CommandHandler» и вернуть список зарегистрированных обработчиков.

Затем вызывается каждый обработчик.

Вот и всё. Это довольно просто.

Соединяем это всё с обнаружением динамических типов

На самом деле, на данном этапе ещё ничего не работает.

Нам нужно передать где-нибудь Dictionary диспетчеру команды.

В идеале нужно создать диспетчер команды и его словарь где-нибудь при запуске приложения и зарегистрировать его при помощи фреймворка внедрения зависимостей.

Помните наш третий критерий? Новые функции/требования не должны требовать изменения существующего кода.

Если регистрировать новые команды и обработчики при помощи словаря вручную, то мы, по сути, модифицируем имеющийся код. Это вполне может нас устраивать, но чаще всего не устраивает.

Если вы стремитесь к совершенствованию кода, то можете попробовать обнаружение динамических типов.

У нас снова есть код на C#, который совершенно не относится к делу, но, возможно, покажется кому-то интересным.

Достаточно просто знать, что этот код будет находить все обработчики команды, регистрировать их с помощью контейнера зависимостей, создавать словарь и передавать этот словарь новому экземпляру диспетчера команды, каждый раз, когда CommandDispatcher потребуется, например, контроллеру.

Читайте также:  Крыса не ест крысиную смерть

Обнаружение динамических типов при запуске программы

При такой схеме нет необходимости изменять существующий код, даже при создании новой команды или обработчика. Всё привязывается при запуске приложения.

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

Я писал код таким образом намеренно. Естественно, чтобы он был более приятным, нужно было бы провести рефакторинг с извлечением методов. Однако для демонстрации это вполне приемлемо.

Смысл в том, что написав этот код один раз, вы больше не должны будете его касаться. Достаточно написать юнит-тесты, и всё будет в порядке.

На правах рекламы

Эпичные серверы — это VPS на Windows или Linux с мощными процессорами семейства AMD EPYC и очень быстрыми NVMe дисками Intel. Спешите заказать!

Источник

5 простых и эффективных способов, как почистить гнездо зарядки телефона в домашних условиях

Во время эксплуатации смартфона, будь то Iphone или устройство на Android, его разъем для подключения кабеля зарядки или наушников неизбежно забивается пылью и грязью или окисляется.

Из-за этого у пользователя могут возникнуть проблемы с подключением питания и устройство перестает заряжаться.

Решить проблему и очистить гнездо зарядки можно без помощи специалистов, в домашних условиях. Потребуются лишь подручные средства и немного свободного времени.

Когда чистить?

Сигналами для проведения очищающих процедур являются:

  • сбои в процессе зарядки: она постоянно прерывается, требуется подключение и отключение провода питания;
  • полное отсутствие зарядки при условии исправности провода и блока питания зарядного устройства;
  • при визуальном осмотре в разъёме заметна грязь и посторонний мусор;
  • мобильное устройство выводит на экран уведомление о неисправности порта.

Какие могут быть риски?


Потенциальные опасности, которые может таить эта процедура при игнорировании правил ее выполнения:

  • повреждение контактов. Такое может произойти при излишнем надавливании на детали;
  • окисление контактов. Химическая реакция происходит при использовании неподходящих растворителей или иных агрессивных веществ. Лучшая жидкость для очищения разъема — технический или медицинский спирт;
  • повреждение внутренних элементов телефона. Такая ситуация может произойти при использовании слишком длинных и тонких предметов (иголки, зубочистки) и попытках прочистить детали как можно глубже.

Важно! Если в процессе чистки элементы телефона случайно повредились, то не стоит пытаться исправить ситуацию дома самостоятельно. Лучший выбор из возможных — незамедлительно обратиться к специалистам сервисного центра.

Минусы самостоятельной очистки портов


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

  • нарушение последовательности выполнения действий, а как следствие, некачественная очистка и уплотнение уже имеющихся загрязнений;
  • отсутствие знаний о внутреннем устройстве телефона, и как следствие, повреждение отдельных элементов.

Обе ошибки могут привести к необратимым последствиям. Потому перед началом процедуры стоит внимательно ознакомиться с пошаговой инструкций выполнения и подготовить все необходимые инструменты и материалы.

Инструкции

Удалить грязь из отверстия можно различными способами и с применением разнообразных инструментов. После окончания процедуры стоит в обязательном порядке проверить мобильное устройство на работоспособность.

Метод ватной палочки


Метод подойдёт для регулярной профилактической чистки для исключения проникновения грязи глубоко внутрь устройства. Для работы потребуется ватная палочка высокого качества, волокна которой плотно закреплены на основании и не отделяются от него.

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

Правильная последовательность выполнения действий:

  1. Найти подходящий инструмент для очищения и придать ему удобную форму
  2. Смочить ватку спиртом и вставить кончик палочки в порт для зарядки. Заменить спирт можно любой спиртосодержащей жидкостью (не менее 70%) без увлажняющих добавок в составе.
  3. Выполнить поступательные движения в разъем, выметая грязь наружу. Пройтись таким образом по всем краям и стенкам порта.
  4. При необходимости, повторить процедуру, сменив ватную палочку на чистую.
  5. Подключить к устройству кабель для зарядки и проверить работоспособность.

Важно! Использование сухой ватной палочки может привести к выпадению отдельных волокон и застреванию их на контактах.

Пневматический очиститель (сжатый воздух)


Этот метод наиболее щадящий. Риск повреждения внутренних элементов сводится практически к нулю. Для работы используется баллон со сжатым воздухом.

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

Применение. Достаточно приставить сопло баллона к отверстию на корпусе и несколько раз спустить воздух. Все загрязнения под давлением вылетят наружу.

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

Читайте также:  Что надеть от клещей

Зубочистка

Метод напоминает использование ватной палочки, но подразумевает более глубокое проникновение внутри отверстия.

  1. Выключить мобильный телефон.
  2. На кончик деревянной зубочистки намотать тонкие волокна ваты. Они должны плотно прилегать и не отставать от основы. Смочить спиртом.
  3. Повернуть телефон отверстием к себе и аккуратно вставить зубочистку между контактами.
  4. Несколько раз провести палочкой сначала в одну сторону, затем в другую. Особое внимание уделить местам скруглений с торцов разъема.
  5. Извлечь ватку, сменить на чистую и повторить процедуру. Критерием для окончания процедуры станет визуальное отсутствие загрязнений внутри порта.

Полезно знать! Периодичность проведения такой очистки — примерно один раз в 1,5-2 месяца.

Медицинским спиртом


Методика подразумевает заливание спирта непосредственно в разъем. Для этого подойдёт только чистый медицинский спирт без посторонних добавок.

Вливать жидкость в небольшое отверстие удобнее всего с помощью пипетки или шприца. Необходимый объем — всего несколько капель. После следует выждать около минуты и протереть разъем чуть влажной ватной палочкой.

Под воздействием спирта загрязнения разомкнут и легко отделятся от стенок. В конце необходимо просушить гаджет, перевернув его разъемом вниз.

Простой кусок бумаги


Если ничего из описанных инструментов нет под рукой, а в разъёме застрял мусор или посторонний предмет, то можно попробовать извлечь его с помощью куска обычной бумаги.

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

Что делать, если во вход для зарядки попал песок?


Для того, чтобы справиться с этой проблемой, потребуется:

  1. Первое действие – продуть разъем с помощью баллона для извлечения сухих песчинок. Важно держать телефон вертикально чтобы избежать продавливания песка вглубь.
  2. Слегка намочить кусочек ватки в спирте и нацепить его на кончик зубочистки.
  3. Вращательными движениями вставить это приспособление в порт для зарядки и прокрутить несколько раз в одном направлении.
  4. Сменить ватку и повторить процедуру до полной чистоты элемента.

Как просушить?

Несколько капель воды, попавшие на экран смартфона, никак не повлияют на его работоспособность. Но если жидкость попала в разъем Type C, либо USB или же в гнездо Айфона – то это может стать причиной поломки.

Для избегания негативных последствий следует незамедлительно приступить к просушке контактов.

Что делать, если в разъем для зарядки попало несколько капель жидкости:

  • дать высохнуть естественным путем. Для ускорения процесса устройство следует перевернуть вертикально разъемом вниз и направить на него поток воздуха из вентилятора. Рано или поздно жидкость испарится. Останется лишь протереть контакты спиртом от посторонних загрязнений (например, если был пролит сладкий чай). Не стоит использовать нагревательные приборы для сушки, так как проконтролировать температуру внутри смартфона очень сложно. Неконтролируемый нагрев может привести к поломке;
  • обратить внимание на сигналы. Часть моделей имеют систему оповещений пользователя о дальнейших действиях в случае намокания. На экране может появиться надпись «Выключите устройство» или «Проверка порта. Попадание влаги». Такие сообщения нельзя игнорировать, а все советы в них подлежат обязательному исполнению. Если в панели имеется оповещение о неисправности порта, то таким устройством пользоваться нельзя;
  • поместить телефон в рис. Это популярный и проверенный временем способ действительно поможет удалить лишнюю жидкость. Потребуется достаточный объем сухого риса, в который необходимо полностью погрузить выключенный смартфон и оставить так не менее чем на 10 часов. Метод эффективен даже при падении гаджета в воду.

Действия, которые категорически запрещены при попадании воды в порт для зарядки:

  • подключение к источнику питания. Вставлять в розетку на зарядку устройство со влагой в гнезде опасно не только для исправности устройства, но и для здоровья человека. Пока жидкость не будет полностью удалена о возможности использования зарядного устройства не может быть и речи;
  • выдувание воды. Таким образом жидкость только проникнет ещё глубже и повредит внутренние элементы;
  • встряхивание. Результат этого действия будет аналогичным попыткам выдуть влагу. Жидкость проникнет глубже и приведет к серьезным поломкам.

Очистка разъема для зарядки мобильного телефона или планшета — простая процедура, которую можно выполнить в домашних условиях. Для этого не требуются специальные инструменты или навыки. Достаточно ознакомиться с основными правилами и использовать подручные средства.

Узнайте, как отмыть силиконовый чехол для телефона от грязи. В этой статье описаны способы чистки наушников от Айфона.

Полезное видео

Источник

Оцените статью
Избавляемся от вредителей