Здравствуйте, vvlad.net, Вы писали:
VN>Что такое StringSplitOptions? То что это enum — значения не имеет, но почему он обьявлен отдельно от класса String?
Как это не имеет? Сравнивать Enum и const это как сравнивать красное с теплым.
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>Что такое StringSplitOptions? То что это enum — значения не имеет, но почему он обьявлен отдельно от класса String?
Doc>Как это не имеет? Сравнивать Enum и const это как сравнивать красное с теплым.
Enum это набор констант. Только почему нет такого как String.RemoveEmptyEntities? Вынесли, и все тут. Даже не Split(..., bool removeEmptyEntities). A?
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>Enum это набор констант.
Doc>Ну вот вы и ответили себе. Я говорил про единичные значения. Doc>Но если у вас есть свой ответ — интересно было бы узнать мне мнение.
Любое значение в приложении должно нести смысл и принадлежать конкретной сущности, а не классу — сборнику констант. Ну и в описанном мной варианте избегаем проблемы появления потенциального God-object, да еще и static по сути.
Если у ТС есть пара-тройка констант которые используются в паре-тройке классов (не в одной иерархии), то вполне логично вывести их в отдельный класс. Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу. Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.
Здравствуйте, vvlad.net, Вы писали:
VN>Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу.
Это как? Любая константа имеет свой физический смысл. Число циклов, адрес порта, время задержки и т. д. Ну и как частный случай — класс конфигурации, если предполагается что в будующем она будет меняться. Но опять же — наружу в этом случае будет торчать интерфейс или хотябы просто проперти класса.
VN>Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.
Вы так и не дали пояснения почему StringSplitOptions отдельная от String сущность? Почему это лучше чем String.SplitOptions.RemoveEmptyEntries?
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу.
Doc>Это как? Любая константа имеет свой физический смысл. Число циклов, адрес порта, время задержки и т. д. Ну и как частный случай — класс конфигурации, если предполагается что в будующем она будет меняться. Но опять же — наружу в этом случае будет торчать интерфейс или хотябы просто проперти класса.
VN>>Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.
Doc>Вы так и не дали пояснения почему StringSplitOptions отдельная от String сущность? Почему это лучше чем String.SplitOptions.RemoveEmptyEntries?
Сколько классов зависят от этих констант?
Будешь ли ты использовать вложенные классы?
Здравствуйте, vvlad.net, Вы писали:
VN>Сколько классов зависят от этих констант?
В общем случае неизвестно.
VN>Будешь ли ты использовать вложенные классы?
А причем тут я? Мы говорили про enum из .NET
VN>Ответы на эти вопросы отвечают и на твой.
Ответов как я понимаю нет. Тем более, что для того чтобы доказать свою позицию вы с констант переключились на enum. Последние все же по сути ближе к обычным переменным, т.к. это тип с ограниченным диапазоном значений.
Здравствуйте, Doc, Вы писали:
VN>>Сколько классов зависят от этих констант? Doc>В общем случае неизвестно.
Т. е. много.
VN>>Будешь ли ты использовать вложенные классы? Doc>А причем тут я? Мы говорили про enum из .NET
Ну или вложенный публичный enum.
Я не стал бы.
VN>>Ответы на эти вопросы отвечают и на твой.
Мой ответ: Поскольку у нас много зависимых классов и вложенный публичный класс ( ) я делать не буду, то надо выность константы в отдельный класс.
Doc>Ответов как я понимаю нет. Тем более, что для того чтобы доказать свою позицию вы с констант переключились на enum. Последние все же по сути ближе к обычным переменным, т.к. это тип с ограниченным диапазоном значений.
Сравни:
public static class SomeEnums
{
public const int EnumValue0 = 0;
public const int EnumValue1 = 1;
// ...
}
Да, enum это тип с ограниченным диапазоном значений. Но эти значения — константы. Могу привести пример с System.Drawing.Colors. Это статический класс с известными цветами. Они правда не const поля, но это уже ограничения .NET.
Но суть enum'ов остается та-же что и у констант.
Здравствуйте, vvlad.net, Вы писали:
VN>Здравствуйте, Doc, Вы писали:
VN>>>Сколько классов зависят от этих констант? Doc>>В общем случае неизвестно. VN>Т. е. много.
Это справедливо для любого public объекта.
VN>>>Ответы на эти вопросы отвечают и на твой. VN>Мой ответ: Поскольку у нас много зависимых классов и вложенный публичный класс ( ) я делать не буду, то надо выность константы в отдельный класс.
И зачем нам лишние сущности?
VN>Да, enum это тип с ограниченным диапазоном значений. Но эти значения — константы.
Ага, а int это тоже тип с ограниченным диапазоном значений и эти значения константы. Выходит int — как константа.
VN>Могу привести пример с System.Drawing.Colors. Это статический класс с известными цветами. Они правда не const поля, но это уже ограничения .NET.
Ага, все что не вписывается в доказательство — не существенно, ограничения и т.д.
VN>Но суть enum'ов остается та-же что и у констант.
... и int (т.е. это как и enum ... см. выше)? Все же давайте отличать само значение (const) от типа (enum).
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>Здравствуйте, Doc, Вы писали:
VN>>>>Сколько классов зависят от этих констант? Doc>>>В общем случае неизвестно. VN>>Т. е. много.
Doc>Это справедливо для любого public объекта.
VN>>>>Ответы на эти вопросы отвечают и на твой. VN>>Мой ответ: Поскольку у нас много зависимых классов и вложенный публичный класс ( ) я делать не буду, то надо выность константы в отдельный класс.
Doc>И зачем нам лишние сущности?
VN>>Да, enum это тип с ограниченным диапазоном значений. Но эти значения — константы.
Doc>Ага, а int это тоже тип с ограниченным диапазоном значений и эти значения константы. Выходит int — как константа.
Что такое enum в .NET? Описание в студию.
VN>>Могу привести пример с System.Drawing.Colors. Это статический класс с известными цветами. Они правда не const поля, но это уже ограничения .NET.
Doc>Ага, все что не вписывается в доказательство — не существенно, ограничения и т.д.
Мы не можем определить тип Color как const. Если бы могли — определили бы. А так просто свойство без setter'а
VN>>Но суть enum'ов остается та-же что и у констант.
Doc>... и int (т.е. это как и enum ... см. выше)? Все же давайте отличать само значение (const) от типа (enum).
см. выше. И еще, что нам даст:
1. (int)StringSplitOptions.RemoveEmptyEntities
2. String.Split(..., (StringSplitOptions)1)
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>Здравствуйте, Doc, Вы писали:
VN>>>>Сколько классов зависят от этих констант? Doc>>>В общем случае неизвестно. VN>>Т. е. много.
Doc>Это справедливо для любого public объекта.
VN>>>>Ответы на эти вопросы отвечают и на твой. VN>>Мой ответ: Поскольку у нас много зависимых классов и вложенный публичный класс ( ) я делать не буду, то надо выность константы в отдельный класс.
Doc>И зачем нам лишние сущности?
Это серьезный вопрос. Но сначала ответь чем тебе мешает еще одна сущность в конкретной ситуации? И что ты монимаешь под сущностью?
Здравствуйте, vvlad.net, Вы писали:
VN>>>Да, enum это тип с ограниченным диапазоном значений. Но эти значения — константы. Doc>>Ага, а int это тоже тип с ограниченным диапазоном значений и эти значения константы. Выходит int — как константа. VN>Что такое enum в .NET? Описание в студию.
The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list.
VN>Мы не можем определить тип Color как const. Если бы могли — определили бы. А так просто свойство без setter'а
Ну опять все в кучу. Это другая ситуация.
VN>>>Но суть enum'ов остается та-же что и у констант.
Doc>>... и int (т.е. это как и enum ... см. выше)? Все же давайте отличать само значение (const) от типа (enum). VN>см. выше. И еще, что нам даст: VN>1. (int)StringSplitOptions.RemoveEmptyEntities VN>2. String.Split(..., (StringSplitOptions)1)
И что?
1. (int)String.SplitOptions.RemoveEmptyEntities
2. String.Split(..., (String.StringSplitOptions)1)
Здравствуйте, vvlad.net, Вы писали:
Doc>>И зачем нам лишние сущности? VN>Это серьезный вопрос. Но сначала ответь чем тебе мешает еще одна сущность в конкретной ситуации?
А мы конкретную ситуацию разбираем? Просто чтобы сказать мешает или нет — надо саму ситуацию задать.
VN>И что ты монимаешь под сущностью?
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
VN>>>>Да, enum это тип с ограниченным диапазоном значений. Но эти значения — константы. Doc>>>Ага, а int это тоже тип с ограниченным диапазоном значений и эти значения константы. Выходит int — как константа. VN>>Что такое enum в .NET? Описание в студию.
Doc>The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list.
named constants
VN>>Мы не можем определить тип Color как const. Если бы могли — определили бы. А так просто свойство без setter'а
Doc>Ну опять все в кучу. Это другая ситуация.
какая другая? нам нужны константы описывающие цвета. они у нас есть. в классе Colors. в отдельном классе, не в классе Color, который описывает конкретный цвет.
VN>>>>Но суть enum'ов остается та-же что и у констант.
Doc>>>... и int (т.е. это как и enum ... см. выше)? Все же давайте отличать само значение (const) от типа (enum). VN>>см. выше. И еще, что нам даст: VN>>1. (int)StringSplitOptions.RemoveEmptyEntities VN>>2. String.Split(..., (StringSplitOptions)1)
Doc>И что? Doc>1. (int)String.SplitOptions.RemoveEmptyEntities Doc>2. String.Split(..., (String.StringSplitOptions)1)
что за нафик?
1. будет 1. из енума. (как? почему? см. определение)
2. будет StringSplitOptions.RemoveEmptyEntities.
А твой ответ тут ни к чему. И я уже говорил о своем отношении (основанное на опыте) к публичным вложенным классам (и enum'ам и делегатам в частности). И вообще многие советуют избегать таких класов.
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, vvlad.net, Вы писали:
Doc>>>И зачем нам лишние сущности? VN>>Это серьезный вопрос. Но сначала ответь чем тебе мешает еще одна сущность в конкретной ситуации?
Doc>А мы конкретную ситуацию разбираем? Просто чтобы сказать мешает или нет — надо саму ситуацию задать.
Конкретная ситуация: см. топик.
VN>>И что ты монимаешь под сущностью?
Doc>В данном случае — класс.
Сущность — это то что может выполнить определенную работу. Это какой-то класс и его вспомогательные классы (enum'ы, делегаты, хелперы). статический класс с константами — не сущность, так как он не выполняет какую-то работу, а просто группирует набор констант.
Для примера:
Есть у нас какой-то Reader и какой-то Writer. Они пишут строки в файл. Каждая строка должна начинаться с некого константного значения (или нескольких), от которых Reader зависит. Где ты будешь определять эти константы? в Reader'е или в Writer'е? Я сделаю отдельный класс. И подобные ситуации встречаются гораздо чаще, по сравнению с теми, где можно однозначно определить принадлежность констант.
Re[3]: Где правильно хранить константы?
От:
Аноним
Дата:
18.01.12 19:09
Оценка:
ST>>
ST>>class MyUtilityClass {
ST>> public const string MyPublicConstant = "Hello, Public Constant";
ST>>}
ST>>
К сожалению у меня юзаются конструкции вида [MyAttributeItem(MyUtilityClass.MyPublicConstant )] Поэтому я должен объявлять как константы. Статик тут не работает почему-то. Или я не прав?
А>К сожалению у меня юзаются конструкции вида [MyAttributeItem(MyUtilityClass.MyPublicConstant )] Поэтому я должен объявлять как константы. Статик тут не работает почему-то. Или я не прав?
Здравствуйте, vvlad.net, Вы писали:
VN>Конкретная ситуация: см. топик.
Это абстрактная ситуация. Более того, её уточнение в дальнейшем (про передачу значения в атрибуты) ввобще свело все к выбору между public const и enum. Причем тут enum даже больше подходит.
VN>Сущность — это то что может выполнить определенную работу. Это какой-то класс и его вспомогательные классы (enum'ы, делегаты, хелперы). статический класс с константами — не сущность, так как он не выполняет какую-то работу, а просто группирует набор констант.
Тогда что это? Как назвать? Некий класс, который не имеет определенной задачи? Чтобы не затягивать беседу скажу сразу, что он очень похож на класс с данными конфигурации. Т.е. вполне определенная сущность.
VN>Для примера: VN>Есть у нас какой-то Reader и какой-то Writer. Они пишут строки в файл. Каждая строка должна начинаться с некого константного значения (или нескольких), от которых Reader зависит. Где ты будешь определять эти константы? в Reader'е или в Writer'е? Я сделаю отдельный класс. И подобные ситуации встречаются гораздо чаще, по сравнению с теми, где можно однозначно определить принадлежность констант.
Вот уже конкретная задача. Но у меня несколько решений, в зависимости от общей цели:
1) Введение сущности "конвертор". Тогда reader и writer избавляются от знания формата и просто работают с определенным хранилищем. Такая схема позволяет сохранять в разные форматы и в разных хранилищах (диске, сети, инете по разным протоколам и т.д.)
2) Если формат один, то можно сделать Repository и скрыть все подробности работы внутри него. А он уже сам может настроить как надо чтение и запись.
3) Разместить данные о формате в конфигурации проекта (позволит настраивать эти символы в дальнейшем). Можно использовать с (2).
4) Ну и наконец, в редких случаях, если это что-то вроде признака уникодного файла (что не меняется в принципе), то можно и объявить private const в каждом классе. Т.к. если изменится этот признак, то и сами классы не будут работоспособны.
PS: Кстати, даже выбирая только между Reader и Writer (или там или там) можно дать ответ. Главный тут Writer. Т.к. именно он задает формат данных, а Reader должен прочитать уже существующее. Поэтому если хочется public const то можно сделать его в Writer.
Здравствуйте, vvlad.net, Вы писали:
VN>>>Что такое enum в .NET? Описание в студию. Doc>>The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list. VN>named constants
А не заметил of a set of ?
VN>А твой ответ тут ни к чему.
Стоп. Было сказано тобой
VN>>>см. выше. И еще, что нам даст: (далее код)
Я показал что тоже самое будет при вложенном enum. Так что все в тему.
VN>И я уже говорил о своем отношении (основанное на опыте) к публичным вложенным классам (и enum'ам и делегатам в частности). И вообще многие советуют избегать таких класов.
Упс... Ты определись. То говоришь что enum ближе к константам (ты выше bold-ом выделял), то вдруг к вложенным классам. Неувязочка
Много усложнизма... я не стал бы с самого начала создавать супер-пупер-гибкую структуру классов. Здравый смысл подсказывает мне (и это работает), что не надо начинать со сложностей.