Re[5]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 17.01.12 12:28
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Что такое StringSplitOptions? То что это enum — значения не имеет, но почему он обьявлен отдельно от класса String?


Как это не имеет? Сравнивать Enum и const это как сравнивать красное с теплым.
Re[6]: Где правильно хранить константы?
От: vvlad.net  
Дата: 17.01.12 12:40
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vvlad.net, Вы писали:


VN>>Что такое StringSplitOptions? То что это enum — значения не имеет, но почему он обьявлен отдельно от класса String?


Doc>Как это не имеет? Сравнивать Enum и const это как сравнивать красное с теплым.


Enum это набор констант. Только почему нет такого как String.RemoveEmptyEntities? Вынесли, и все тут. Даже не Split(..., bool removeEmptyEntities). A?
Re[7]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 17.01.12 12:59
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Enum это набор констант.


Ну вот вы и ответили себе. Я говорил про единичные значения.
Но если у вас есть свой ответ — интересно было бы узнать мне мнение.
Re[8]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 07:20
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vvlad.net, Вы писали:


VN>>Enum это набор констант.


Doc>Ну вот вы и ответили себе. Я говорил про единичные значения.

Doc>Но если у вас есть свой ответ — интересно было бы узнать мне мнение.


Любое значение в приложении должно нести смысл и принадлежать конкретной сущности, а не классу — сборнику констант. Ну и в описанном мной варианте избегаем проблемы появления потенциального God-object, да еще и static по сути.


Если у ТС есть пара-тройка констант которые используются в паре-тройке классов (не в одной иерархии), то вполне логично вывести их в отдельный класс. Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу. Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.
Re[9]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 18.01.12 08:25
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу.


Это как? Любая константа имеет свой физический смысл. Число циклов, адрес порта, время задержки и т. д. Ну и как частный случай — класс конфигурации, если предполагается что в будующем она будет меняться. Но опять же — наружу в этом случае будет торчать интерфейс или хотябы просто проперти класса.

VN>Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.


Вы так и не дали пояснения почему StringSplitOptions отдельная от String сущность? Почему это лучше чем String.SplitOptions.RemoveEmptyEntries?
Re[10]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 08:42
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vvlad.net, Вы писали:


VN>>Ну и вполне логично, что те классы где эти константы используются — не походят, потому как скорее всего не будет однозначной принадлежности к какому-то классу.


Doc>Это как? Любая константа имеет свой физический смысл. Число циклов, адрес порта, время задержки и т. д. Ну и как частный случай — класс конфигурации, если предполагается что в будующем она будет меняться. Но опять же — наружу в этом случае будет торчать интерфейс или хотябы просто проперти класса.


VN>>Никто кстати не говорит о God-object — константы группируются по смыслу, и эти группы используются только в ограниченном количестве сущностей. Как пример: StringSplitOptions.


Doc>Вы так и не дали пояснения почему StringSplitOptions отдельная от String сущность? Почему это лучше чем String.SplitOptions.RemoveEmptyEntries?


Сколько классов зависят от этих констант?
Будешь ли ты использовать вложенные классы?

Ответы на эти вопросы отвечают и на твой.
Re[11]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 18.01.12 08:51
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Сколько классов зависят от этих констант?

В общем случае неизвестно.

VN>Будешь ли ты использовать вложенные классы?

А причем тут я? Мы говорили про enum из .NET

VN>Ответы на эти вопросы отвечают и на твой.


Ответов как я понимаю нет. Тем более, что для того чтобы доказать свою позицию вы с констант переключились на enum. Последние все же по сути ближе к обычным переменным, т.к. это тип с ограниченным диапазоном значений.
Re[12]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 09:59
Оценка:
Здравствуйте, 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'ов остается та-же что и у констант.
Re[13]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 18.01.12 11:00
Оценка:
Здравствуйте, 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).
Re[14]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 11:28
Оценка:
Здравствуйте, 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)
Re[14]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 11:30
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, vvlad.net, Вы писали:


VN>>Здравствуйте, Doc, Вы писали:


VN>>>>Сколько классов зависят от этих констант?

Doc>>>В общем случае неизвестно.
VN>>Т. е. много.

Doc>Это справедливо для любого public объекта.


VN>>>>Ответы на эти вопросы отвечают и на твой.

VN>>Мой ответ: Поскольку у нас много зависимых классов и вложенный публичный класс ( ) я делать не буду, то надо выность константы в отдельный класс.

Doc>И зачем нам лишние сущности?

Это серьезный вопрос. Но сначала ответь чем тебе мешает еще одна сущность в конкретной ситуации? И что ты монимаешь под сущностью?
Re[15]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 18.01.12 12:40
Оценка:
Здравствуйте, 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)
Re[15]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 18.01.12 12:42
Оценка:
Здравствуйте, vvlad.net, Вы писали:

Doc>>И зачем нам лишние сущности?

VN>Это серьезный вопрос. Но сначала ответь чем тебе мешает еще одна сущность в конкретной ситуации?

А мы конкретную ситуацию разбираем? Просто чтобы сказать мешает или нет — надо саму ситуацию задать.

VN>И что ты монимаешь под сущностью?


В данном случае — класс.
Re[16]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 12:52
Оценка:
Здравствуйте, 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'ам и делегатам в частности). И вообще многие советуют избегать таких класов.
Re[16]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 13:04
Оценка:
Здравствуйте, 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>>


K>Лучше так:

K>
K>class MyUtilityClass {
K>public static string MyPublicConstant = "Hello, Public Constant";
K>}
K>


К сожалению у меня юзаются конструкции вида [MyAttributeItem(MyUtilityClass.MyPublicConstant )] Поэтому я должен объявлять как константы. Статик тут не работает почему-то. Или я не прав?
Re[4]: Где правильно хранить константы?
От: vvlad.net  
Дата: 18.01.12 22:06
Оценка:
Здравствуйте, Аноним, Вы писали:

ST>>>
ST>>>class MyUtilityClass {
ST>>>  public const string MyPublicConstant = "Hello, Public Constant";
ST>>>}
ST>>>


K>>Лучше так:

K>>
K>>class MyUtilityClass {
K>>public static string MyPublicConstant = "Hello, Public Constant";
K>>}
K>>


А>К сожалению у меня юзаются конструкции вида [MyAttributeItem(MyUtilityClass.MyPublicConstant )] Поэтому я должен объявлять как константы. Статик тут не работает почему-то. Или я не прав?


Прав, статик работать не будет.

К остальным в ветке: Опять const разруливает
Re[17]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 19.01.12 09:02
Оценка:
Здравствуйте, 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.
Re[17]: Где правильно хранить константы?
От: Doc Россия http://andrey.moveax.ru
Дата: 19.01.12 09:10
Оценка:
Здравствуйте, 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-ом выделял), то вдруг к вложенным классам. Неувязочка
Re[18]: Где правильно хранить константы?
От: vvlad.net  
Дата: 19.01.12 15:19
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>...


Много усложнизма... я не стал бы с самого начала создавать супер-пупер-гибкую структуру классов. Здравый смысл подсказывает мне (и это работает), что не надо начинать со сложностей.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.