Очевидно, что если эта таблица базы данных просто служила таблицей строк для хранения одного текста, то то, что другой сказал относительно передачи этого к ресурсам и т. Д., Является правильным ответом.
Но я подозреваю, что это не так. Данные могут иметь и имеют особое значение для бизнеса, хотим мы этого или нет. В какой базе данных нет столбца с именем STATUS со значениями, такими как «P» для ожидающих, «O» для открытых и «C» для закрытых. Вы можете поместить эти значения в таблицу STATUS_CODES со столбцами CODE и DESCRIPTION (и вам, вероятно, следует это сделать), но это не меняет того факта, что где-то в вашем приложении (или, что более вероятно, в десятках приложений) находится код, который принимает логические решения против "P", "O" и "C".
Ваши вопросы были
Этот код сломается, если значение Id изменится, скажем, с 1 на 3. Что
хороший способ устранить эту проблему?
Ответ - то, что мы называем здесь "ДДТ". Не делай этого. P всегда должен быть P и никогда не должен заменяться чем-то другим, кроме P. Точка, конец предложения. Не поймите меня неправильно, подобные вещи, эти волшебные куки должны быть сведены к минимуму, задокументированы и использованы со слоем косвенности в ваших приложениях (подробнее через минуту). Но мы все живем в реальном мире с реальными системами.
При написании кода для таких типов значений вам никогда не нужно жестко кодировать их в своих методах. При голом минимуме это константа или перечисление. Мне лично нравится относиться к ним как к первоклассным гражданам в моих объектных моделях кода. Например, значение STATUS, которое мы видели ранее, становится объектом OrderStatus.
class OrderStatus
public static readonly OrderStatus ClosedStatus = new OrderStatus("C");
public static readonly OrderStatus OpenStatus = new OrderStatus("O");
public static readonly OrderStatus PendingStatus = new OrderStatus("P");
public static OrderStatus FromCode(string code)
{
if (code == "C")
return ClosedStatus;
else if (code == "O")
return OpenStatus;
else if (code == "P")
return PendingStatus;
else
throw something;
}
private string _code;
private OrderStatus(string code)
{
// private so cannot be created externally
_code = code;
}
public string StatusCode { get { return code; } }
// etc, etc. Helpful to make ToString() return the inner status code.
}
Тогда в вашем объекте Order у вас будет свойство типа OrderStatus. И вы можете выполнять свои логические тесты, не жестко программируя те надоедливые односимвольные значения столбцов, которые, похоже, нравятся администраторам баз данных.
if (someOrder.Status == OrderStatus.Closed)
MessageBox.Show("Cannot modify closed orders.");