Избегайте жесткого кодирования в операторе switch - PullRequest
1 голос
/ 26 сентября 2011

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

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

. Однако теперь я хочу запустить метод Utility, чтобы очистить поле Text объекта на основе того, какой Type объект (например, добавить '* 1010).* если это URL).

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 26 сентября 2011

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

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

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

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

3 голосов
/ 26 сентября 2011

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

2 голосов
/ 26 сентября 2011

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

, например:

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 на основе типа.

0 голосов
/ 26 сентября 2011

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

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

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

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

Надеждаэто помогает

0 голосов
/ 26 сентября 2011

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

Но как их наличие в базе данных делает его расширяемым?

...