Найти тему
Nuances of programming

Эффективное использование словаря (C#) как альтернатива оператору If

Оглавление

Источник: Nuances of Programming

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

Но условия лежат в основе программирования, и мы не можем полностью избавиться от операторов if — мы можем лишь сократить их использование.

Что такое словарь?

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

Что такое делегат?

«Делегат — это объект, который ссылается на метод. Или даже можно сказать, что это переменная ссылочного типа, которая содержит ссылку на методы. Делегаты в C# схожи с указателем на функцию в C/C++. Он помогает определить, какой метод должен вызываться при срабатывании события».

Есть два типа делегатов, которые нужны для наших примеров: Actionи Func. Action используется для методов void, а Func — для методов возвращаемого типа return.

Например:

-2

Здесь определяется словарь с типом <string, Action> и к нему добавляется элемент, а затем выполняется метод для вызова dict[“foo”]. Можем использовать dict[“foo”]() как альтернативу dict[“foo”].Invoke().

Результат:

-3

Какой полезный метод, правда?:)

Пример

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

Сначала он выглядит вот так:

-4
-5

Теперь у нас есть класс Reporter с разными методами для подготовки отчётов.

Для вызова определённого метода в соответствии с типом каждого отчёта используется метод PrepareReport. Для этого будет задействовано множество операторов if-else.

Ну а мы попробуем вместо них использовать словарь и делегаты:

-6
-7

Словарь с типом <ReportType, Action> будет использоваться в качестве делегата, а методы создания отчёта будут вызываться без необходимости проверять тип каждого отчёта.

На мой взгляд, это более читаемый и лёгкий в сопровождении код. Меньше строк — больше ясности.

Делегаты с возвращаемым типом

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

Вот так:

-8
-9

И вот результат:

-10

А сколько ещё есть вариантов применения словаря с точки зрения роста показателей производительности!

Читайте также:

Читайте нас в телеграмме и vk

Перевод статьи Muhammed Hilmi Koca: Effective Dictionary Usage(C#): Avoid If Statements