Специфичные для класса константы должны быть заключены во вложенный класс? - PullRequest
2 голосов
/ 28 февраля 2012

Если у меня есть константы в классе, которые связаны друг с другом, скажем, строки, используемые для записи / чтения XML-файла для MyClass, следует ли мне оборачивать их во вложенный класс Xml внутри MyClass? Или просто определить их без переноса в MyClass? Если это хорошая идея, чтобы обернуть их, чем, что если только часть этих констант должна быть доступна для внешнего мира, например, только Xml.Name, а остальные - это атрибуты Xml, которые MyClass будет использовать для воссоздания объектов, что бы я установил уровень защиты моего вложенного класса до?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

Я вижу nested-class как объект, который имеет смысл только в контексте другого объекта;и чья логика требует свойств этого другого объекта.Учитывая это, я никогда не проектировал nested-class, который я не использовал для рефакторинга.И я вижу воспринимаемую потребность в public nested-class в качестве красного флага для проблемного дизайна.

Несмотря на это, ваш вопрос заставляет меня задуматься о том, являются ли они потенциально полезными.Поэтому, хотя я не буду использовать такой дизайн, он может работать для вас.

Я хотел бы упомянуть, что const следует использовать только для вещей, которые никогда не меняются.Как часы в день или скорость света.Я не могу точно сказать по вашему вопросу, но что-то вроде Xml.Name кажется переменным.Я предлагаю использовать readonly для этих свойств.Возможно, static readonly, если они согласованы во всех случаях.Это избавит вас от многих подводных камней const.

Ниже приведен class, который я смоделировал, чтобы продемонстрировать то, что я бы порекомендовал для вашего дизайна:

public class MyClass
{   
    public string Title { get; set; }

    Xml _xml;
    public Xml MyXml
    {
        get { return _xml; }
        set { _xml = value; }
    }    

    public MyClass(string xmlName, object xmlAttributes)
    {
        _xml = new Xml(xmlName, xmlAttributes);        
    }

        public class Xml
        {
            private readonly string _name;
            public string Name
            {
                get { return _name; }
            }

            private readonly object _attributes;
            internal object Attributes
            {
                get { return _attributes; }
            }

            public Xml(string name, object attributes)
            {
                _name = name;
                _attributes = attributes;
            }
        }
}
0 голосов
/ 28 февраля 2012

Не вижу необходимости перемещать константы во вложенный класс.

Доступность:
Сделать константы, необходимые только для MyClass * private *.
Создайте константы только для классов, которые находятся в той же сборке, что и MyClass * internal *.
Создайте константы, необходимые только для подклассов MyClass и MyClass самого защищенного .
Создайте константы, необходимые только для классов, которые находятся в той же сборке, что и MyClass или подклассами MyClass и MyClass внутренняя защита .
Создайте константы, которые также нужны классам в других сборках, отличных от MyClass 's public .

Нейминг:
Если у вас много констант в одном классе, используйте хорошие префиксы для их классификации. Таким образом, читатель может быстрее найти нужный.

...