Избегайте жесткого кодирования в операторе 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
обеспечить соответствие с базой данных.
Но как сделать их доступными в базе данных?