Правильный большой дизайн Enum - PullRequest
1 голос
/ 14 декабря 2011

Я недавно закончил работу над средством просмотра молекулярных / белковых данных для класса компьютерной графики.Атомы, очевидно, очень важная часть такой программы.В настоящее время у меня есть большое перечисление, которое содержит каждый элемент (водород, гелий и т. Д.).Каждый элемент имеет связанную информацию, такую ​​как цвет, радиус и т. Д. Я использую класс расширения, чтобы я мог написать:

float r = Element.Neon.Radius();

Мне также нужно иметь возможность получить соответствующее перечисление из его символа.Я вставил этот метод в класс расширения, который немного запутан:

Element carbon = ElementExtensions.FromAbbreviation("C");

Я хочу связать намного больше данных с конкретными записями Элемента, но я не уверен, является ли это хорошим дизайном или нет.В настоящее время каждый набор связанных данных требует словаря для получения связанных данных.Возможно, я мог бы использовать Dictionar?

Если бы я пошел с классом Element, мне нужно было бы убедиться, что есть только один экземпляр водорода, один из гелия и т. Д. Мне нравится, как выглядит System.Drawing.Colorразработан, но я не думаю, что это именно то, что мне нужно (например, вам никогда не придется искать связанные данные для ForestGreen).

Какой лучший способ поддержки больших, но четко определенныхи конечное число конкретных экземпляров?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Перечисление не кажется очень адекватным подходом к этой проблеме; вместо этого вы должны создать класс Element со всей информацией, связанной с каждым элементом, и статические свойства только для чтения для каждого известного элемента:

public class Element
{
    private readonly string _symbol;
    private readonly int _atomicNumber;
    private readonly Color _color


    // Private constructor, since you don't want people to be able to "invent" random elements...
    private Element(string symbol, int atomicNumber, Color color)
    {
        _symbol = symbol;
        _atomicNumber = atomicNumber;
        _color = color;
    }

    public string Symbol { get { return _symbol; } }
    public int AtomicNumber { get { return _atomicNumber; } }
    public Color color { get { return _color; } }


    // Known elements

    private static readonly Element _hydrogen = new Element("H", 1, Color.White);
    private static readonly Element _carbon = new Element("C", 6, Color.Black);
    private static readonly Element _oxygen = new Element("O", 8, Color.Red);


    public static Element Hydrogen { get { return _hydrogen; } }
    public static Element Carbon { get { return _carbon; } }
    public static Element Oxygen { get { return _oxygen; } }


    ...

}

Таким образом, вся информация об элементе может быть в одном месте, а не разбросана по разным местам

2 голосов
/ 14 декабря 2011

Если у вас много перечислений, вам следует пересмотреть, следует ли вам использовать наследование.

Вместо Элемента. Неон, почему бы не позволить Неону наследовать от Элемента?

class Element
 int Radius();
 Color Color();
 string Symbol();

class Neon : Element
 int Radius (return x);
 int Color (return Color.Red);
 int Symbol (return "NE");

Если вам нужен только один элемент, рассмотрите возможность использования Singleton.

1 голос
/ 14 декабря 2011

Определите ваши элементы как классы, но используйте шаблон Flyweight .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...