Ми ніколи більше не зберігаємо перерахування як числові порядкові значення; це ускладнює спосіб налагодження та підтримки занадто важким. Ми зберігаємо фактичне значення перерахунку, перетворене на рядок:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
а потім перечитайте:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Проблема в минулому дивилася на Enterprise Manager і намагалася розшифрувати:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
вірші
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
останнє набагато простіше. Перший вимагав отримати вихідний код і знайти числові значення, які були призначені членам перерахування.
Так, це займає більше місця, але імена членів перерахування короткі, а жорсткі диски - дешеві, і це набагато більше того, щоб допомогти, коли у вас виникли проблеми.
Крім того, якщо ви використовуєте числові значення, ви прив’язуєтесь до них. Ви не можете красиво вставляти або переставляти елементи, не застосовуючи старі числові значення. Наприклад, змінивши перелік костюма на:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
повинні були стати:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
щоб зберегти застарілі числові значення, що зберігаються в базі даних.
Як сортувати їх у базі даних
Постає питання: скажімо, я хотів замовити значення. Деякі люди, можливо, захочуть їх сортувати за порядковим значенням перерахунків. Звичайно, замовити картки за числовим значенням перерахування безглуздо:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Це не той порядок, який ми хочемо - ми хочемо, щоб вони перераховували:
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
Для збереження цілих значень потрібна та сама робота, яка зберігається для цілих значень:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Але це не той порядок, який ми хочемо - ми хочемо, щоб вони перераховували:
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
Моя думка, такий вид рейтингу належить до інтерфейсу користувача. Якщо ви сортуєте елементи на основі їх перелічувальної вартості: ви робите щось не так.
Але якби ти хотів насправді це зробити, я створив би Suits
таблицю вимірів:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Таким чином, коли ви хочете змінити ваші картки, щоб використовувати замовлення Kissing Kings New Deck, ви можете змінити їх для відображення без викидання всіх своїх даних:
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
Тепер ми відокремлюємо внутрішню деталь програмування (ім'я перерахування, значення перерахунку) із налаштуваннями відображення, призначеним для користувачів:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder