![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
kemiisto |
|
||||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Lukkoye, ну, давайте попробуем разложить всё по полочкам. Итак, вот ключевая цитата из Вашего первого(?) сообщения в этой теме.
За оптимизации в древних компиляторах ничего не скажу, но остальное - не верно. И вот почему. Полочка №1 Объявление функции - часть интерфейса, а её определение - детали реализации. Клиенты обладают информацией только об интерфейсе, и ничего сверх того, что специфицирует и гарантирует интерфейс, им не известно и не должно быть известно. Полочка №2 Крайне желательно чтобы интерфейс и реализация соответствовали друг другу. В случае функции это означает, что список формальных параметров в объявление функции и её определени должны совпадать. Вплоть до квалификаторов. Поэтому вариант, где в объявлении нет квалификатора const, а в определении есть, отметаем сразу. Полочка №3 Теперь мы приходим к двум вариантам функции, показанным ниже, в которых в первой строчке стоит объявление функции, а во второй - её определение.
А теперь посмотрите на эти два варианта только с точки зрения клиентского кода, который эту функцию будет вызывать и котором доступен только её интерфейс.
Даёт ли первый вариант какие-либо дополнительные гарантии? Нет, никаких. Фактический параметр в обоих вариантах передаётся по значению, а значит будет скопирован при передаче и изменений в ходе выполнения функции не притерпит. Единтсвенное, что помимо этого сообщает функция в первом варианте, так это то, что и формальный параметр в ходе её выполнения изменений тоже не притерпит. НО! Это деталь реализации, которая клиентскому коду вообще знать незачем.
Ещё раз повторю, Вы ошибаетесь. Прототип своих намерений не замалчивает. Фактический аргумент передаётся по значению, и во время выполнения функции его значение не измениться. Это сообщение отредактировал(а) kemiisto - 10.9.2014, 19:21 -------------------- |
||||||||||||
|
|||||||||||||
Lukkoye |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: нет Всего: 1 |
Ещё раз повторяю - только в стране сказочных фей. Меня не очень интересует "точка зрения только клиента". Качественно выполненная инкапсуляция - это конечно хорошо, потому что вы можете работать с чужой библиотекой через публичный-интерфейс, и не утруждать себя мыслями о том, как она внутри устроенна. Однако, ваш собственный проект - многоярусный, многоэтажный, многослойный, который помимо вас пилит целая команда - там одной лишь инкапсуляции недостаточно. Так или иначе, но вам придется заглядывать и на более нижние, и на более верхние этажи. Меня интересует точка зрения разработчика, которому нужно поддерживать сложный командный проект на протяжении времени. Поэтому я заинтересован в том, что бы иметь максимум гарантий от компилятора. И в том, что бы код был самодокументированный - хорошо передавал намерения своего автора. Добавлено @ 20:18 Я хочу что бы вы прочитали текст. И сказали мне, какие мысли вкладывал программист в эти строки:
Я приведу вам пример: функция baz: Что делает - очно не ясно. Но судя по наименованию (foo/bar/baz/etc) - просто маленький демонстрационный пример. Если автор не г_о_в_н_о_кодер, значит индекс с которым она работает - реально может быть отрицательным числом. Функция может перетереть свой формальный параметр, а значит не дает никаких строгих гарантий. Теперь ваша очередь. Вам нужно просто рассказать о том, что по вашему хотел сделать программист. Это сообщение отредактировал(а) Lukkoye - 10.9.2014, 20:20 |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Программист хотел доказать свою точку зрения 3мя демонстраивными функциями, не понимая, что спор о совершенно разных вещях. Его породило ваше высказывание: после которого уже 2 страницы идет обсуждение того, что эта точка зрения не верна (вы же сами указали "со стороны клиента"). Стоило вам написать что то вроде "мне нравится использовать конст как программисто, и считаю, что это делает поддержку большого проекта более понятным и само-документируемым хоть и нарушает принцыпы инкапсуляции, ИМХО" и ничего такого бы небыло. |
|||
|
||||
kemiisto |
|
||||||||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
За ссылки и указатели говорить не буду, так как речь не о них. Речь только о передаче по константному значению. И гляда на функцию baz, объявленную следующим образом,
я могу заключить, что при вызове такой функции в моём клиентском коде как-нибудь так
фактический параметр i передаcтся по значению, т.е. значение фактического параметра i будет скопировано в значение формального параметра index. Это гарантирует мне, что значение фактического параметра i во время вызова baz() не изменится. И если мне эта гарантия по какой-то причине важна, то у меня в голове сразу складывается следующая картина {предусловие} команда {постусловие}:
Значение i до и после вызова baz(i) одинаковы, или, иными словами, i является инвариантом данной функции.
Да какого, простите, Вам вообще дела до формального параметра? Каких-таких гарантий мне не даёт функция без index, объявленного как const? Что с const, что без него строго гарантированно
И баста! Конечно, на уровне реализации const даёт нам инвариантность формального параметра внутри самой функции
В принципе я могу понять, зачем это нужно. НО! В интерфейсе const для pass-by-value параметров бессмысленен, так как никаких дополнительных гарантий на уровне интерфейса не даёт. Остаётся только вариант, где в интерфейсе квалификатор const опущен, а в реализации он в наличии, если уж Вам так нужно гарантировать неизменность формального параметра. Но мне такой вариант не нравится из-за несоответствия объявления функции её определению (Полочка №2 из предыдущего сообщения). Это сообщение отредактировал(а) kemiisto - 10.9.2014, 21:21 -------------------- |
||||||||||||
|
|||||||||||||
sQu1rr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Не всегда возможно, потому что не нужно
почему же тогда и const не использовать лишь в одном месте? ![]() Это сообщение отредактировал(а) sQu1rr - 10.9.2014, 21:50 |
||||
|
|||||
Lukkoye |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: нет Всего: 1 |
Дану? Интересно, каким же образом? Значит эксперимент не состоялся. Вы не внимательны. Я уже писал выше - сопровождение кода. Это значит не только использовать - но и дорабатывать. В том числе за другими. В том числе другие будут дорабатывать после меня. Самодокументируемость + гарантии от компилятора, что никто ничайно не напортачит. |
|||
|
||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Раз Вы настаиваете на использовании const, то должны требовоать const и с указателями:
Такое компилятор вроде тоже сожрёт (не проверял), хотя смысла особого нет:
А вообще Ваш спор бессмысленен, аргументы строн понятны, разве что кто-то найдёт пример вредности такого использования const в С++. Это сообщение отредактировал(а) math64 - 11.9.2014, 08:24 |
||||||
|
|||||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Предлагаю компромисс: использовать const только для параметров, имеющих значения по умолчанию.
Был код:
Потребовалась возможность менять count:
|
||||
|
|||||
Lukkoye |
|
||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: нет Всего: 1 |
Верно. Я так и делаю. Более того: квалификатор const контекстно зависимый. Есть ситуации, когда он нужен лишь программисту (и компилятор сделает доп. проверки) А есть ситуации,когда компилятору критично, квалифицировано ли имя const ? Я спрашивал ребят на собеседовании: прочтите вслух этот прототип:
Многие, очень многие ребята говорили: функция foo, которая ничего не возвращает, в качестве аргумента принимает константную ссылку. Это не верно. На языке с++ у ссылок вообще нет квалификатора.
Результат - ноль. Если вы попробуете его сделать на шаблонах, то CL (компилятор вижал студии) сделает предупреждение - квалификатор ссылок будет проигнорирован и вы получите мутабельную ссылку. Компилятор gcc сделает тоже самое, только не сделает предупреждение. Ну так вот, если вы сделаете:
То в качестве результата, вы увидите 1. Другими словами, квалификатор конст не оказывает никакого влияния на аргументы функций, которые принимают по значению. И нужны исключительно программисту, если он хочет дополнительных проверок от компилятора - что формальный параметр функции никогда не будет перетерт. Резюмируя: вот это тот же самый текст, что я уже сообщил господину Baldina - квалификатор const здесь нужен не компилятору, а человеку, что бы компилятор помог человеку не допустить ничайных ошибок при программировании самой функции. Мне это видится настолько простым, что мне кажется - ну я просто повторяюсь, а добавить нечего. Мне очень жаль, что господа влезли в этот диалог, предварительно не прочитав мой диалог с господином Baldina Добавлено @ 17:03
Противоречит здравому смыслу. Добавлено @ 17:04
Найдите. Если сможете. Только их нет. Добавлено @ 17:07
Так вы проверьте, а потом уже говорите. Я проверял - квалификатор будет полностью проигнорирован. (cl) Это сообщение отредактировал(а) Lukkoye - 12.9.2014, 17:09 |
||||||||||||||
|
|||||||||||||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Не понимаете шуток и намека, как бы пора закруглится (не лично вам, а всем обсуждающим), так как холивар на тему кому как нравится писать код ни к чему хорошему никогда не приводил. ЗЫ может и не так понял, и мр. math64 действительно считает, что нужно использовать константы с дефолтными параметрами ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |