Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
Здравствуйте, Михaил, Вы писали:
KP>>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
А там начинается веселье уровня "откуда ты сказал". Конфликт имен и начинают подставляться вызовы функций, которые ты не ожидаешь. Вот крайне показательный пример.
По большому счету, единственное что я считаю допустимым делать с пространствами имен это создавать сокращения. Такое на проекте скорее положительно сказывается, если не перестараться, конечно.
M>>Другое тяжелое последствие привыкания к примерам из книжек — любовь к египетским скобкам. S>"-1"и "" Не надо свою вкусовщину выдавать за истину в последней инстанции
Уверен, ты понимаешь, что мне насрать на твои "-1". Меня вообще мало интересуют посты без практически полезной информации.
Когда будет, что сказать по делу — приходи. Я рассказал, чем плохи на практике египетские скобки, а от тебя увидел лишь понты и пустой трындеж. Если для тебя читаемость кода — это вкусовщина, то для меня нет.
И я в курсе, что есть много любителей египетских скобок.
После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
Пространство имён std не резиновые.
В общем я теперь агитирую только using std::something или явное std::something.
_NN>>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
X>т.е. ранее ты сам определил predicate в std?
Да почему в std-то? В том пространстве имен, где использовалась using директива же.
--
Не можешь достичь желаемого — пожелай достигнутого.
КД>У меня есть вопрос по этой теме. КД>Как без "using namespace std" находятся свободные операторы сравнения (==, !=, ...) для классов определенных в пространстве std? КД>Например, для std::string.
Есть такой механизм, Argument Dependent Lookup (ADL). Когда компилятор видит в коде вызов функции, он ищет кандидатов на подставновку, в том числе, и в пространствах имен фактических параметров. Это также относится и к операторам, поскольку они и есть функции по сути. В стандарте языка это описано в пункте 6.4.2 Argument-dependent name lookup.
Открытый интерфейс класса образуют не только открытые функции-члены, но и функции, не являющиеся членами. Принцип Интерфейса гласит: для класса X все функции (включая функции, не являющиеся членами), которые "упоминают X" и "поставляются вместе с X" в одном и том же пространстве имен, являются логической частью X, поскольку образуют часть интерфейса X
--
Не можешь достичь желаемого — пожелай достигнутого.
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
Проблема из-за того, что с каждым новым стандартом в пространство имён добавляют всё больше и больше символов, тем самым увеличивая риск пересечения локальных имён.
Вот у нас был predicate, с новым стандартом появился std::predicate и код перестал собираться.
И это не первый раз, а дальше будет только хуже
Нет, мы так не делаем. А еще мы моем руки перед едой и чистим зубы.
Ну что за детсад, ей-богу? 20 лет везде пишут, что using namespace std в namespace scope — зло. И вдруг в конце 2019 года внезапно приходит осознать что таки "папа был прав".
Это последствия копирования из книг учебных примеров. Там ради компактности кода используют что-то типа
cout << "Hello, Wolrd!\n";
При этом using namespace std; даже не пишется, а подразумевается. Вот народ и получает синдром утенка, от которого сложно избавиться. Умение критически относиться к авторитету приходит со временем. Нужно с одной стороны сохранить интерес к изучаемому предмету, чтобы усваивать полезную информацию, однако, с другой быть готовым к тому, что автор может быть не прав, и отфильтровывать нерелевантную отсебятину, а тут опыт требуется.
Другое тяжелое последствие привыкания к примерам из книжек — любовь к египетским скобкам. В книжке учебный пример ты все равно читаешь внимательно до каждой запятой, а в production коде скобка на отдельной строке очень помогает структурировать код для быстрого просмотра. В некоторых языках даже прикручивают обязательный линтер, который не даст собрать код, если скобка не там. К счастью в моем любимом Kotlin это лишь на уровне рекомендаций от создателей языка (видимо, сказывается ИТМО'шное прошлое).
Вообще, примеры из книжек нехило-так травмируют психику студентов-программистов.
Здравствуйте, Михaил, Вы писали:
KP>>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
М>А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
Неприятности могут быть разные. Самое простое — это ошибки компиляции из-за конфликта имен. Но это пол беды, поскольку это не пройдет незамеченным. Гораздо хуже, когда в ADL, вдруг начинает выигрывать совсем не та функция, на которую ты рассчитываешь. Особенно это актуально для функций операторов (сравнения, арифметических, ввода-вывода и пр.). В этом случае компилятор уже не поможет и ты долго и нудно можешь искать причину, по которой программа работает не так, как нужно. Ну и, пожалуй, главная проблема в том, что то, что сегодня нормально работает, завтра может поломаться в результате безобидных, на первый взгляд, изменений в другом пространстве имен. Избыточная связность кода — вот, что плохо.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, lpd, Вы писали:
lpd>Если у проекта Super Application аббревиатура SA, то я называл свои классы не predicate, а SAPredicate, и о проблемах пересечения namespace узнал из этого топика. Но вы можете продолжать дуть щеки от того, что ваш код пестрит ::, <> и &&. Чем сложнее код, тем сильнее программист, воистину.
А затем код вытаскивается в shared library, и опа! Что такое SA? Почему? Зачем? Да и авторам Silver Application тоже грозит name clash с этим Super Application.
Из наиболее известных ляпов такого рода — Apple со своими префиксами NS (Next Step). Проект Next Step давно неактуален, но "ложечки остались". Новые API не используют NS-префикс, и теперь у Apple SDK очень полосатый naming convention.
Здравствуйте, LaptevVV, Вы писали:
LVV>Они, естественно, не понимают, за что такой беспредел — нельзя писать в заголовочных файлах. LVV>Тащу Герба Саттера, читаю совет 59 из евоной с Александреску книжки. LVV>Все равно пишут, сволочи... LVV>Вычищаю безжалостно и возвращаю лабу на доработку — ВСЕГДА LVV>Теперь буду сюда посылать. На 4 буквы...
Всё равно будут писать, пока сами по граблям не походят. Тогда вспомнят твои советы и исправятся.
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
_NN>В общем я теперь агитирую только using std::something или явное std::something.
ИМХО, это в равной степени относится и к другим пространствам имен, не только к std. Using directives (не путать с using declarations) если и могут применяться, то скорее как исключение из правил.
В моей практике можно выделить пожалуй единственный случай, когда я позволяю себе использовать using директиву — это когда какой-нибудь отдлельный юнит тест требует определения каких-то дополнительных специфических сущностей. Вот тогда я создаю в cpp файле, в анонимном пространстве имен дополнительный namespase с таким же именем как функция-член. И после этого использую using директиву внутри одной отдельно взятой функции, даже не во всем cpp файле. То есть такое пространство имен логически можно расссматривать как некое расширение функции-члена:
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
Мне на С бы ваши С++ проблемы
_NN>В общем я теперь агитирую только using std::something или явное std::something.
_NN>Есть ещё кто пишет using namespace std ?
Если у проекта Super Application аббревиатура SA, то я называл свои классы не predicate, а SAPredicate, и о проблемах пересечения namespace узнал из этого топика. Но вы можете продолжать дуть щеки от того, что ваш код пестрит ::, <> и &&. Чем сложнее код, тем сильнее программист, воистину.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
_NN>В общем я теперь агитирую только using std::something или явное std::something.
_NN>Есть ещё кто пишет using namespace std ?
_NN>https://en.cppreference.com/w/cpp/concepts/predicate
Максимум, делаю using в локальной области видимости (не больше, чем функция). Например, если дофига работы с временем, то внутри метода можно сразу развернуть chrono.
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
clang тоже не одобряет.
Здравствуйте, Masterspline, Вы писали:
M>Другое тяжелое последствие привыкания к примерам из книжек — любовь к египетским скобкам.
"-1"и "" Не надо свою вкусовщину выдавать за истину в последней инстанции
Здравствуйте, Masterspline, Вы писали:
M>Уверен, ты понимаешь, что мне насрать на твои "-1".
"Три дня я гналась за вами, чтобы сказать как вы мне безразличны!"
M>Меня вообще мало интересуют посты без практически полезной информации.
Ну вот твои персональные предпочтения расстановки скобочек являются эталонным примером этого.
M>Когда будет, что сказать по делу — приходи.
на кывте является хорошим тоном объяснять оценку "-1" в профильных форумах
M>Я рассказал, чем плохи на практике египетские скобки
Пока ты рассказал о своих предпочтениях в довольно агрессивной манере.
M>а от тебя увидел лишь понты и пустой трындеж.
Ок.
M>Если для тебя читаемость кода — это вкусовщина, то для меня нет.
У тебя проблемы с чтением когда Chrome, Qt, etc? Надо больше практики
M>И я в курсе, что есть много любителей египетских скобок.
Ну так может это не так принципиально как ты думаешь?
Здравствуйте, Skorodum, Вы писали:
M>>а от тебя увидел лишь понты и пустой трындеж. S>Ок.
Это потому, что вы никак не доказываете своего утверждения.
M>>Если для тебя читаемость кода — это вкусовщина, то для меня нет. S>У тебя проблемы с чтением когда Chrome, Qt, etc? Надо больше практики
У меня нет проблем с чтением кода. У меня есть наблюдение: в коде с "египетским скобкам" я нахожу ошибки чаще, чем в коде где скобки выровнены по столбцам и строкам.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, _NN_, Вы писали:
_NN>>Есть ещё кто пишет using namespace std ?
_NN>>https://en.cppreference.com/w/cpp/concepts/predicate
KP>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
А изза чего начинаются проблемы? В заголовочных вред using понимаю, но чем он плох в cpp?
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло.
т.е. ранее ты сам определил predicate в std?
_NN>Есть ещё кто пишет using namespace std ?
только в хелловордах =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, TimurSPB, Вы писали:
_NN>>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. TSP>clang тоже не одобряет.
Так не я же добавил predicate в std, а стандарт
Здравствуйте, _NN_, Вы писали:
_NN>В общем я теперь агитирую только using std::something или явное std::something. _NN>Есть ещё кто пишет using namespace std ?
KP>Я много лет за такое по рукам бил, особенно, если кто-то додумывался учудить подобное в заголовочном файле. Привести в чувства проект с горой "using namespace std" то еще веселье
Вот спасибо.
Я 2 курсу про это дело с первой лабы талдычу.
Они, естественно, не понимают, за что такой беспредел — нельзя писать в заголовочных файлах.
Тащу Герба Саттера, читаю совет 59 из евоной с Александреску книжки.
Все равно пишут, сволочи...
Вычищаю безжалостно и возвращаю лабу на доработку — ВСЕГДА
Теперь буду сюда посылать. На 4 буквы...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Masterspline, Вы писали:
M>Это последствия копирования из книг учебных примеров. Там ради компактности кода используют что-то типа M>
M>cout << "Hello, Wolrd!\n";
M>
M>При этом using namespace std; даже не пишется, а подразумевается. Вот народ и получает синдром утенка, от которого сложно избавиться. Умение критически относиться к авторитету приходит со временем. Нужно с одной стороны сохранить интерес к изучаемому предмету, чтобы усваивать полезную информацию, однако, с другой быть готовым к тому, что автор может быть не прав, и отфильтровывать нерелевантную отсебятину, а тут опыт требуется.
M>...
M>Вообще, примеры из книжек нехило-так травмируют психику студентов-программистов.
+1
А есть еще горе-преподы. Живой пример: младшенькая моя приступила к занятиям на втором курсе примата и вот, алилуйя, начали они изучать C++. Вчера притащила учебный пример реализации комплексного числа, написанного преподавателем, с заданием "разобраться в программе". Я глянул, а там и пресловутое "using namespace std" тут как тут, помимо прочего. Используется правда в области видимости функций, но только лишь из-за пары несчастных std::cout и std::endl. Я ей тут же показываю это обсуждение, рассказываю про грабли. Есть, конечно, еще надежда, что препод в какой-то момент скажет им: "дети, using директивы — это зло...". Но это вряд ли, я чувствую.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Masterspline, Вы писали:
M> К счастью в моем любимом Kotlin это лишь на уровне рекомендаций от создателей языка (видимо, сказывается ИТМО'шное прошлое).
Такая же рекоммендация как в JavaScript добровольно-принуждённая
Боюсь придётся смириться и писать как от вас этого ожидают все остальные программисты включая создателей языка.
Formatting
Use 4 spaces for indentation. Do not use tabs.
For curly braces, put the opening brace in the end of the line where the construct begins, and the closing brace on a separate line aligned horizontally with the opening construct.
if (elements != null) {
for (element in elements) {
// ...
}
}
(Note: In Kotlin, semicolons are optional, and therefore line breaks are significant. The language design assumes Java-style braces, and you may encounter surprising behavior if you try to use a different formatting style.)
Здравствуйте, _NN_, Вы писали:
_NN>После того как в очередной раз сломали код из-за добавления новых символов в std , как std::predicate, моё терпение лопнуло. _NN>Пространство имён std не резиновые.
_NN>В общем я теперь агитирую только using std::something или явное std::something.
_NN>Есть ещё кто пишет using namespace std ?
_NN>https://en.cppreference.com/w/cpp/concepts/predicate
Для std:: — никогда
Для остальных namespaces — только в сильно локальных скопах (к примеру — функции) и только если префикс из неймспейсов сильно длинный получается (3-4 вложенных неймспейса)
Здравствуйте, AleksandrN, Вы писали:
AN>Всё равно будут писать, пока сами по граблям не походят. Тогда вспомнят твои советы и исправятся.
Надо грабли аккуратно просто расставить.
Скажем назвать переменную predicate, string_view, launder, begin и т.п. со стандартом С++03 всё соберётся.
Потому берём С++11, там одна часть программы отвалится, а потом переходим на С++17 и ещё.
Со второго раза дойдёт.
Здравствуйте, _NN_, Вы писали:
_NN>Есть ещё кто пишет using namespace std ?
У меня торчит в глобальном хедере (который юзается при формировании pch).
Но последние несколько лет (три или четыре), планомерно обновляю код с явным указанием std:: и прочих (своих) пространств имен.
Причем не из-за конфликтов, а из за тупняка подсветки символов в VS.
Может через год/два и изничтожу этот using namespace std
UPD. Вообще про правила организации и пространств имен я читал, наверное, лет 20 назад. Тогда думал — что-то дядьки мудряд. А въехал только в 2011 году когда с чистого листа начал программировать на шарпе. Теперь вот, последние девять лет, привожу в порядок код на плюсах
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
_NN>>Есть ещё кто пишет using namespace std ?
КД>У меня торчит в глобальном хедере (который юзается при формировании pch).
КД>Но последние несколько лет (три или четыре), планомерно обновляю код с явным указанием std:: и прочих (своих) пространств имен.
Перечитал, подумал...
По хорошему надо бы не std::, а ::std:: указывать.
Поставлю себе
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, B0FEE664, Вы писали:
BFE>Это потому, что вы никак не доказываете своего утверждения.
Бремя доказаетельства лежит на утверждающих, что один стиль однозначно лучше другого
BFE>У меня нет проблем с чтением кода. У меня есть наблюдение: в коде с "египетским скобкам" я нахожу ошибки чаще, чем в коде где скобки выравнены по столбцам и строкам.
Анекдотные доказательства
Здравствуйте, Skorodum, Вы писали:
BFE>>У меня нет проблем с чтением кода. У меня есть наблюдение: в коде с "египетским скобкам" я нахожу ошибки чаще, чем в коде где скобки выровнены по столбцам и строкам. S>Анекдотные доказательства
Это не доказательство. Это личное наблюдение, для статистики ничго не значащие.
А вот, наверное, с помощью анализатора PVS-Studio можно провести исследование, в каком коде плотность ошибок больше: с "египетским скобкам" или с Allman style. Где разработчики мерчендайзеры анализатора? Что скажите?
Здравствуйте, B0FEE664, Вы писали:
BFE>Это не доказательство. Это личное наблюдение, для статистики ничго не значащие.
Предположу, что кода в K&R стиле намного больше (с ходу: Linux, boost, Qt).
BFE>А вот, наверное, с помощью анализатора PVS-Studio можно провести исследование, в каком коде плотность ошибок больше: с "египетским скобкам" или с Allman style. Где разработчики мерчендайзеры анализатора? Что скажите?
Тут много других факторов, которые влияют на вероятность ошибки намного сильнее, чем стиль скобок, для их исключения надо проверить много проектов
Здравствуйте, Skorodum, Вы писали:
BFE>>А вот, наверное, с помощью анализатора PVS-Studio можно провести исследование, в каком коде плотность ошибок больше: с "египетским скобкам" или с Allman style. Где разработчики мерчендайзеры анализатора? Что скажите? S>Тут много других факторов, которые влияют на вероятность ошибки намного сильнее, чем стиль скобок, для их исключения надо проверить много проектов
Либо корреляция есть, либо нет, а про факторы — это следующий этап. Может корреляции нет, но я не верю. Я думаю, что должно быть примерно так же как с использованием пробелов.
PS Корреляцию 'плотность ошибок'/'использование пробелов' тоже было бы интересно посмотреть...
Здравствуйте, Vamp, Вы писали:
V>Здравствуйте, rg45, Вы писали:
R>>Есть такой механизм, Argument Dependent Lookup (ADL).
V>Добавлю — механизм придуманный специально для того, чтобы работали операторы человеком по-имени Кениг. Оттого и называется иногда Koenig Lookup.
Andrew Richard Koenig
По фамилии.