Избегайте жесткого кодирования в операторе switch

У меня есть объект с двумя свойствами: Text а также Type,

Чтобы избежать жесткого кодирования типов, я помещаю их в базу данных, чтобы они могли быть добавлены в будущем. На данный момент типы URL, Username and ID,

Тем не менее, теперь я хочу запустить метод Utility для очистки объекта Text поле на основе которого Type объект (например, добавьте "http://", если это URL).

Есть ли способ сделать это в классе Utilities без жесткого кодирования типов в операторе switch /if else block.

switch (type)
{
    case 1:
        TidyUrl();
    case 2:
        TidyUsername();
    case 3:
        TidyID();
    default:
        break;
}

В этом примере я жестко кодирую идентификаторы из базы данных (таблица "Тип"), что никогда не может быть полезным!

Есть лучший способ сделать это?

5 ответов

Решение

Традиционно это выполняется с использованием общего интерфейса и динамического построения конкретной реализации для выполнения реальной работы.

например:

public interface ITidy
{
   string Tidy(string input);
}

тогда реализации

public class UrlTidy : ITidy
{
    public string Tidy(string input)
    {
        // do whatever you need to the url
    }
}

И так далее для других типов уборки. Теперь вам нужен способ создания правильного конкретного класса (UrlTidy, IdTidy и т. д.) того типа, на который вы смотрите. Один из способов сделать это может состоять в том, чтобы поместить имя класса в базу данных рядом с типом и использовать отражение, чтобы реализовать правильную реализацию ITidy, Другой Ват будет иметь Factory класс, который использует какой-то другой метод для создания экземпляра права ITidy на основе типа.

Вы можете использовать перечисление, чтобы помочь с удобочитаемостью.

enum MyTypes
{
 URL = 1,
 UserName = 2,
 Id = 3,
}

switch (myType)
{
    case MyTypes.URL:
        TidyUrl();
    case MyTypes.UserName:
        TidyUsername();
    case MyTypes.Id:
        TidyID();
    default:
        break;
}

Это перечисление должно быть согласовано с базой данных.

Одним из способов является использование полиморфизма. У вас будут отдельные классы для каждого из ваших "типов", и они будут реализовывать общий интерфейс (или иметь общий базовый класс) с помощью метода, подобного Tidyгде каждый будет делать свою логику.

Как сказал Одед, используйте перечисление:

public enum Types
{
    Type1 = 1,
    Type2 = 2,
    Type3 = 3
}

Затем вы можете преобразовать переменную вашего типа в enum, сопоставив целые числа с идентификаторами базы данных:

switch ((Types)type)
{
    case Types.Type1:
        break;
    case Types.Type2:
        break;
    ...
}

надеюсь, это поможет

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

Но как сделать их доступными в базе данных?

Другие вопросы по тегам