Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неожиданные особенности инкапсуляции 
V
    Опции темы
archimed7592
Дата 19.11.2007, 15:04 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
Делая переменную неконстантной, мы оставляем пространство для манёвра - читай делаем код сопровождаемым.

А что мешает убрать спецификатор const, в случае необходимости изменения переменной?

Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
поскольку опять же удлиняет и нагромождает код

И способствует самодокументированности кода - сразу понятно, что данная переменная далее по тексту нигде не изменится.

Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
Неудачное - это название сравнения "int vs enumeration". 

Ну вот Кусто, по всей видимости, понял, что я имел ввиду smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 19.11.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
А что мешает убрать спецификатор const, в случае необходимости изменения переменной?

А не факт, что придётся убрать только этот спецификатор. Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
И способствует самодокументированности кода - сразу понятно, что данная переменная далее по тексту нигде не изменится.

А ты уверен, что это такая уж полезная информация? Особенно если "далее по тексту" - это одна-две-три строчки (дальше переменная просто не живёт) и её неизменность и без того очевидна.





Это сообщение отредактировал(а) UnrealMan - 19.11.2007, 15:26
PM MAIL   Вверх
Ln78
Дата 19.11.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Цитата(Dims @  19.11.2007,  12:25 Найти цитируемый пост)
Конечно, вероятность шутки велика. Но точно мы знать этого не можем. Кроме того, если это шутка, то тоже странная. Не очень смешная.

Думаю, если бы вопрос топикстартеру был интересен, вряд ли он ограничился бы единственным сообщением. Да и сам стиль вопроса меня наводит на мысль, что это была попытка породить дискуссию подобную этой
PM MAIL   Вверх
JackYF
Дата 19.11.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  18.11.2007,  17:59 Найти цитируемый пост)
т.о. исключив распространения плохого стиля повсеместно в коде... 

увы, я столкнулся с тем, что если в наследие досталась пачка местами кривого кода, в котором "забыли" порасставлять const, причём даже в самых очевидных местах и я не могу передать в функцию const char*, так как она принимает char*, хотя на деле его не изменяет, а эта функция используется повсеместно в самых разных местах и даже программах, и сама завязана на ещё одной такой же... то тут возникает логичный вопрос: переписать и переотладить тысячи строк кода или старые куски использовать по-старому, а уже новый код писать нормально.

Я же сказал - "не всегда", но надо стараться. Что я с большим рвением и делаю.


Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
Ну вот Кусто, по всей видимости, понял, что я имел ввиду

Кстати, да. И понял и поддерживаю.
Я тебя вообще хорошо понимаю, как-то так сложилось smile Эх, про "Кусто" не забыл, значит smile))

Цитата(Ln78 @  19.11.2007,  15:24 Найти цитируемый пост)
что это была попытка породить дискуссию 

имхо, дискуссии без личных выпадов полезны, это же не флейм без темы.
Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Очень правильно. Тогда да, мы пойдём и заменим типы. А вот если наоборот, то есть если мы забудем поставить const там, где сейчас у нас константная работа и случайно запишем по итератору, то компилятор не даст по рукам и будет прав. Имхо, чем больше const там, где переменные константны, пускай даже сейчас, тем лучше.

Чем строже ведёт себя программист по отношению к коду, тем прямее получается код.
Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А ты уверен, что это такая уж полезная информация?

Да, довольно полезная. Через неделю в эту функцию вставят ещё пять строчек. А через месяц ещё пять. Много понадобится памяти, дабы запомнить, что где "должно" быть константным, но const не поставлено...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 19.11.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  19.11.2007,  16:02 Найти цитируемый пост)
А вот если наоборот, то есть если мы забудем поставить const там, где сейчас у нас константная работа и случайно запишем по итератору, то компилятор не даст по рукам и будет прав. 

Ну и что? Это достоинство const, да. Но помимо достоинств, есть и недостатки. Что весомее? Тут нет однозначного "лучше". И лично я предпочту воздержаться от использования const. Начали-то с оператора ++, там префиксный ++ однозначно как минимум не хуже, чем постфиксный. В случае с const такой однозначности нет.

Цитата(JackYF @  19.11.2007,  16:02 Найти цитируемый пост)
Да, довольно полезная.

Ну, для тебя, может, полезная, для меня - абсолютно бесполезная и даже вредная.
PM MAIL   Вверх
JackYF
Дата 19.11.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
В случае с const такой однозначности нет.

const на скорость не влияет, поэтому показатель субъективный. Следовательно, я допускаю, что кому-то const использовать не всегда удобно.
Принято.

Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
для меня - абсолютно бесполезная и даже вредная. 

Ясно.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zkv
Дата 19.11.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(JackYF @  19.11.2007,  18:51 Найти цитируемый пост)
const на скорость не влияет

теоретически он может помочь оптимизатору.
PM MAIL   Вверх
Alek86
Дата 19.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору.


не буду спорить, но товарищ Саттер насчет этого довольно резко высказывался smile
(Герб Саттер "Новые сложные задачи на C++")


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 19.11.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору. 

А может и наоборот нагадить, если по совету Мейерса возвращать константный объект вместо обычного. В критичном к скорости участке кода без const можно вызвать неконстантный метод прямо для временного объекта, вместо того, чтобы тупо создавать копию. Например, присваивание

result = a+b;

без const элементарно заменяется swap-ом

(a+b).swap(result);
PM MAIL   Вверх
bsa
Дата 19.11.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(UnrealMan @ 19.11.2007,  20:42)
result = a+b;

без const элементарно заменяется swap-ом

(a+b).swap(result);

операция swap в общем случае более затратна, чем присваивание. И к тому же, менее наглядна.


Посмотрел мнение Саттера по поводу const. Думаю, он прав. const редко дает оптимизацию, зато позволяет избегать ошибок.
А разговоры о том, что когда-то метод не менял свой параметр, а потом вдруг стал менять и в случае с использыванием const возникнет куча проблем - глупы. Если у тебя такое получилось, то сам виноват - неправильный дизайн. Лучше уж написать еще одну функцию, которая выполняет нужные действия, чем ловить баги от "неправомерного" использования старой (в надежде, что она не меняет параметр).
И вообще, зачем писать функции на сотни строк, в которых может возникнуть проблема замены большого количества "const_iterator" на "iterator"? Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости.
PM   Вверх
archimed7592
Дата 19.11.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А не факт, что придётся убрать только этот спецификатор. Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Ну, тут уже другая дилема - всего не предусмотришь... Ессно, случаи разные бывают.

Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А ты уверен, что это такая уж полезная информация? Особенно если "далее по тексту" - это одна-две-три строчки (дальше переменная просто не живёт) и её неизменность и без того очевидна.

Не, не, не... Даже в 1-ой строке бывает минибаг, который сразу не увидишь и которого при строгой константности могло бы не быть. Ты же отлично знаешь сколько в С++ тонкостей smile.
Ещё один ньюанс: если ты НЕ видишь спецификатора const, то тебе нужно помимо общей логики работы последующих 3 строчек ещё и задумываться о возможности изменения данной переменной. Учитывая, опять же, невообразимое множество тонкостей языка - это, IMHO, совсем не нужная нагрузка на мозг.


Цитата(Ln78 @  19.11.2007,  15:24 Найти цитируемый пост)
Думаю, если бы вопрос топикстартеру был интересен, вряд ли он ограничился бы единственным сообщением. Да и сам стиль вопроса меня наводит на мысль, что это была попытка породить дискуссию подобную этой 

Кстати, почему-то такие тупые "вопросы" почему-то частенько порождают такие интересные дискуссии smile.

Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
Но помимо достоинств, есть и недостатки. Что весомее? Тут нет однозначного "лучше".

Вся наша жизнь состоит из альтернатив. Универсальных решений/подходов не бывает. Но при прочих равных, я бы предпочёл поставить спецификатор const. К примеру, раньше мне было непонятно какое может быть применение у нестатических константных членов. Сейчас мне их применение очень даже понятно, и я переодически их использую(в частности в текущем проекте их просто туева хуча).

Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору. 
Цитата(Alek86 @  19.11.2007,  19:28 Найти цитируемый пост)
не буду спорить, но товарищ Саттер насчет этого довольно резко высказывался smile
Таки да - на данный момент это исключительно теория smile. IIRC, даже в бустовом гайде для разработчиков либ есть rational относительно безполезности использования const.

Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости. 

Ну я бы не сказал что прям таки без крайней. У меня частенько возникает потребность писать "одноразовый" код, разбивать который на маленькие ф-ции большого смысла нет, а скорее даже может запутать. Да и таскать туда-сюда контекст в таких случаях бывает накладно.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 19.11.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 19.11.2007,  22:02)
Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости. 

Ну я бы не сказал что прям таки без крайней. У меня частенько возникает потребность писать "одноразовый" код, разбивать который на маленькие ф-ции большого смысла нет, а скорее даже может запутать. Да и таскать туда-сюда контекст в таких случаях бывает накладно.

Именно это я и имел в виду под "крайней необходимостью". Действительно, никакого смысла городить огород ради программы на 200 строчек.
PM   Вверх
archimed7592
Дата 20.11.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  19.11.2007,  23:48 Найти цитируемый пост)
Именно это я и имел в виду под "крайней необходимостью". Действительно, никакого смысла городить огород ради программы на 200 строчек. 

Ты не понял smile. Не программы, а ф-ции smile. Ну у меня даже идей нет, относительно того, как можно провести декомпозицию некоторых ф-ций, специфика которых просто не предусматривает повторного использования, а дробить только ради принципа "не больше 50 срок" тоже смысла нет, ибо таскать с собой контекст в виде десятка переменных нерационально(я вообще молчу, если выходных переменных из данного участка кода > 1 - вообще ужас получается).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 20.11.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
операция swap в общем случае более затратна, чем присваивание. 

Для потенциально больших объектов swap гораздо лучше. Надо ли говорить, что в большом количестве случаев присваивание по ряду причин выгодно реализовывать, используя идиому swap?

Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
А разговоры о том, что когда-то метод не менял свой параметр, а потом вдруг стал менять и в случае с использыванием const возникнет куча проблем - глупы. 

Читай внимательней топик. Речь шла о переменных.

Цитата(archimed7592 @  19.11.2007,  22:02 Найти цитируемый пост)
Ещё один ньюанс: если ты НЕ видишь спецификатора const, то тебе нужно помимо общей логики работы последующих 3 строчек ещё и задумываться о возможности изменения данной переменной.

Это ещё зачем?

Цитата(archimed7592 @  19.11.2007,  22:02 Найти цитируемый пост)
совсем не нужная нагрузка на мозг

Ну так и не ищи себе вымышленных проблем.
PM MAIL   Вверх
bsa
Дата 20.11.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 20.11.2007,  00:02)
Ты не понял smile. Не программы, а ф-ции smile.

Я все тогда понял. Просто ответил не очень корректно на два замечания. Не думаешь же ты, что я ради того, чтобы уложиться в 50 строчек буду "таскать контекст"? Ничего подобного. ладно, это уже офтопик.
Цитата(UnrealMan @ 20.11.2007,  00:09)
Для потенциально больших объектов swap гораздо лучше. Надо ли говорить, что в большом количестве случаев присваивание по ряду причин выгодно реализовывать, используя идиому swap?
Код из STL:
Код
template<typename _Tp>
inline void
swap(_Tp& __a, _Tp& __b)
{
      // concept requirements
      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)

      _Tp __tmp = __a;  //конструктор копирования создает новый объект
      __a = __b;            //выполняется первое присваивание
      __b = __tmp;        //выполняется второе присваивание
}
Ты продолжаешь утверждать, что время выполнения 2-х присваиваний и одного конструктора копирования меньше, чем одного присваивания? 


Это сообщение отредактировал(а) bsa - 20.11.2007, 12:22
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.