Встречалась ли вам концепция — "C++ как C с классами". Т.е. когда правила кодирования устанавливают запрет на множество фич, которые есть в языке, но которые часто запутывают код и делают сложным для восприятия — сводят фактически к C, но с удобным синтаксисом для RAII. Однако же указатели и пр. — используются все как в C.
Причем на C успешно пишут все что угодно — то какие проблемы делать то же самое, добавив в C — удобный RAII в мин. варианте?
B здесь главное не поддаться греху гордыни — когда тебе хочется доказать другим что ты способен, что SFINAE и 4-х этажные шаблоны тебе по плечу. А нужно не поддаваться греху гордыни а наоборот проявить смирение и кротость — аскетизм. Ограничить себя в излишествах и довольствоваться простым минимализмом.
В принципе — я всецело поддерживаю и уважаю эту концепцию C++. Чем проще код — тем лучше. Кто хочешь поддаться греху гордыни — есть вам Haskell — пожалуйста.
Но! С появлением умных указателей стала возможна другая концепция — C++ может быть аналогом ЯВУ типа C#|Java. В чем суть? Суть в том, чтобы в угоду простоте кодирования и отладки — отказаться от ряда фич языка, запретить их использование. А именно:
1. Отказ от сырых указателей, буквальный запрет их в коде. Замена — умные указатели, ссылки, std::optional, std::optional<std::reference_wrapper<>>.
2. Отказ от сложных шаблонов, вариадических, SFINAE, запрет концептов. Т.е. свести к уровню шаблонов в Java/C#.
3. Отказ от макросов.
4. Запрет множественного наследования реализаций.
5. И т.д. (это примерный список, на самом деле гораздо больше).
Вы скажите — в чем тогда смысл, не лучше ли писать сразу на Java? А смысл чисто практический — по факту С++ наиболее кросс-платформенный и наименее гемморный на сегодня. Дошло до того, что C# компиллят в C++. Здесь не вопрос холивара — просто по факту так оно и есть.
Встречали ли вы такую концепция кодирования? Одобряете?
C++ разный. Пишешь библиотеку — тут можно и десятиэтажные шаблоны делать, главное — максимально всё предусмотреть, документировать , и чтобы она была максимально проста в использовании.
Пишешь прикладной код — тут можно и по простому.
S>Вопрос такой. S>Встречали ли вы такую концепция кодирования? Одобряете?
Какую? Я из твоей портянки так и не понял, что за концепция. Я пишу максимально кондово и понятно для всех
Здравствуйте, Marty, Вы писали:
M>C++ разный. Пишешь библиотеку — тут можно и десятиэтажные шаблоны делать, главное — максимально всё предусмотреть, документировать , и чтобы она была максимально проста в использовании.
Это если библиотеку гарантированно никто другой не будет править.
M>Пишешь прикладной код — тут можно и по простому.
А обоснование какое?
M>Какую? Я из твоей портянки так и не понял, что за концепция. Я пишу максимально кондово и понятно для всех
Учись пока я жив. Берешь простыню текста и вводишь в GPT, потом задаешь свой вопрос. Учись, я сделал это для тебя:
Автор описывает две концепции упрощённого C++:
1. «C++ как C с классами» — минимализм, RAII, отказ от сложностей языка.
2. «C++ как Java/C#» — управление через умные указатели, без сырых указателей и сложных шаблонов.
С появлением GPT теперь мы юридически точно можем сказать кто дурак — пишущий или читающий. Так что теперь как раньше не прокатывает, уже нельзя обвинить оппонента без оснований — ранее можно было, т.к. критерия точного не было, теперь есть.
Здравствуйте, Shmj, Вы писали:
S>В принципе — я всецело поддерживаю и уважаю эту концепцию C++. Чем проще код — тем лучше. Кто хочешь поддаться греху гордыни — есть вам Haskell — пожалуйста.
Haskell основан на трёх с половиной идеях, которые там повсеместно используются единообразным образом. А C++ — это такая сборная солянка из всех идей, которые когда-либо отсветились на протяжении всей истории computer science.
Haskell проще, чем C++, на два порядка.
S>Вы скажите — в чем тогда смысл, не лучше ли писать сразу на Java? А смысл чисто практический — по факту С++ наиболее кросс-платформенный и наименее гемморный на сегодня. Дошло до того, что C# компиллят в C++. Здесь не вопрос холивара — просто по факту так оно и есть.
Нихрена он не кросс-платформенный. Даже в разные дистрибутивы линуха целиться с помощью C++ проблематично: непонятно, на какие библиотеки можно рассчитывать. А таскать это с собой — кросс-платформенность немедленно превращается в лютый геморрой, когда даже сборку программы отстроить становится весьма непростой проблемой.
Вот Go, да, он кросс-платформенный. Rust подозреваю, что тоже.
Здравствуйте, Pzz, Вы писали:
Pzz>Haskell основан на трёх с половиной идеях, которые там повсеместно используются единообразным образом.
Зато каких идеях...
Pzz>Нихрена он не кросс-платформенный. Даже в разные дистрибутивы линуха целиться с помощью C++ проблематично: непонятно, на какие библиотеки можно рассчитывать.
А причем тут библиотеки? Библиотеки и системные функции — это отдельный вопрос — главное что ваши программы будут 100% компилировать под все платформы.
Pzz>А таскать это с собой — кросс-платформенность немедленно превращается в лютый геморрой, когда даже сборку программы отстроить становится весьма непростой проблемой.
Кросс-платформа — всегда не просто и не дешево, но на практике на C++ это проще всего получается.
На C++ есть уже готовые кросс-платформенные либы, которые реально работают.
Pzz>Вот Go, да, он кросс-платформенный. Rust подозреваю, что тоже.
Go — это сборщик мусора, тащить за собой всю среду не оно. Как и .Net.
Rust не имеет полноценного ООП — это скорее замена голого C и то спорная.
Здравствуйте, Shmj, Вы писали:
M>>Какую? Я из твоей портянки так и не понял, что за концепция. Я пишу максимально кондово и понятно для всех
S>Учись пока я жив. Берешь простыню текста и вводишь в GPT, потом задаешь свой вопрос. Учись, я сделал это для тебя:
говорят, люди иногда читают, а иногда пишут. Вот бредописатель из тебя — отличный, умеющий сформулировать без всяких gpt мысль — тут все плохо.
Здравствуйте, Shmj, Вы писали:
S>Встречали ли вы такую концепция кодирования? Одобряете?
У С++ другие немного приоритеты, как будто схожие с тем, что ты описываешь, но в другую степь, называются профили.
Это связано не с удобством пользователей, а с безопасностью.
Здравствуйте, Shmj, Вы писали:
S>1. Отказ от сырых указателей, буквальный запрет их в коде. Замена — умные указатели, ссылки, std::optional, std::optional<std::reference_wrapper<>>. S>2. Отказ от сложных шаблонов, вариадических, SFINAE, запрет концептов. Т.е. свести к уровню шаблонов в Java/C#.
Ну да, ну да...
S>3. Отказ от макросов.
макросы это фишка C, а не C++, отказываться от фишек C в пользу C++ это какой-то неумный C
S>4. Запрет множественного наследования реализаций.
Ещё большее урезание. Тогда лучше использовать умный C#
Здравствуйте, Shmj, Вы писали:
S>B здесь главное не поддаться греху гордыни — когда тебе хочется доказать другим что ты способен, что SFINAE и 4-х этажные шаблоны тебе по плечу. А нужно не поддаваться греху гордыни а наоборот проявить смирение и кротость — аскетизм. Ограничить себя в излишествах и довольствоваться простым минимализмом. S>
Ну вот я всегда пишу аскетичный код. И вообще стараюсь не использовать ничего кроме циклов, условий и подпрограмм.
И только когда этого не хватает, применяю что-нибудь другое.
Начинаю с макросов. Потом функции высшего порядка (как qsort), и только потом всё остальное.
Здравствуйте, Maniacal, Вы писали:
S>>3. Отказ от макросов. M>макросы это фишка C, а не C++, отказываться от фишек C в пользу C++ это какой-то неумный C
Ох ё... Это вторая концепция же — в первой, где С с классами — макросы разрешены.
S>>4. Запрет множественного наследования реализаций. M>Ещё большее урезание. Тогда лучше использовать умный C#
C# просто тупо физически не позволяет писать кросс-платформенные библиотеки (под все 6 платформ человечества), пригодные для реального использования из других языков через FFI. Покажите мне хотя бы одну такую библиотеку.
Здравствуйте, Shmj, Вы писали:
Pzz>>Нихрена он не кросс-платформенный. Даже в разные дистрибутивы линуха целиться с помощью C++ проблематично: непонятно, на какие библиотеки можно рассчитывать.
S>А причем тут библиотеки? Библиотеки и системные функции — это отдельный вопрос — главное что ваши программы будут 100% компилировать под все платформы.
Потому, что возможность программировать кросс-платформенно, но без библиотек, имеет исключительно акедемическую ценность.
Pzz>>А таскать это с собой — кросс-платформенность немедленно превращается в лютый геморрой, когда даже сборку программы отстроить становится весьма непростой проблемой.
S>Кросс-платформа — всегда не просто и не дешево, но на практике на C++ это проще всего получается.
Я в курсе.
S>На C++ есть уже готовые кросс-платформенные либы, которые реально работают.
Pzz>>Вот Go, да, он кросс-платформенный. Rust подозреваю, что тоже.
S>Go — это сборщик мусора, тащить за собой всю среду не оно. Как и .Net.
.Net ташит за собой рантайм в виде кучи файлов. Go просто линкует программу статически.
S>Rust не имеет полноценного ООП — это скорее замена голого C и то спорная.
Здравствуйте, Pzz, Вы писали:
Pzz>Потому, что возможность программировать кросс-платформенно, но без библиотек, имеет исключительно акедемическую ценность.
Уже есть ряд библиотек, которые так же придерживаются концепции кросс-платформы.
Pzz>.Net ташит за собой рантайм в виде кучи файлов. Go просто линкует программу статически.
Вроде для WASM — пустое приложение уже получается слишком большим.
На iOS — плохая поддержка.
На C++ QT можно писать полноценное приложение для iOS — на Go не возможно даже за миллиард долларов.
S>>Rust не имеет полноценного ООП — это скорее замена голого C и то спорная. Pzz>И что?
ООП не смотря на популярные статьи крикунов — это основа разработки ПО.
Здравствуйте, Shmj, Вы писали:
S>B здесь главное не поддаться греху гордыни — когда тебе хочется доказать другим что ты способен, что SFINAE и 4-х этажные шаблоны тебе по плечу. А нужно не поддаваться греху гордыни а наоборот проявить смирение и кротость — аскетизм. Ограничить себя в излишествах и довольствоваться простым минимализмом. S>
, но ты, как обычно, предпочёл "не заметить" неудобную информацию.
Что ж, повторюсь. Нормальные программисты используют шаблоны и SFINAE совсем не для того, чтобы кому-то что-то доказать, а для того, чтобы решать какие-то задачи. Отказ от использования перечисленного — это просто отказ от решения задач. А сложный и запутанный код, как правило, получается у новичков, которые только начинают осваивать этот подход. У опытных программистов даже со SFINAE код получается понятным и читабельным, вот тебе свежий пример:
const char* rawConstCharPtrFromIterator(Pointer auto p)
{
return reinterpret_cast<const char*>(p);
}
const char* rawConstCharPtrFromIterator(Dereferenceable auto it)
{
return reinterpret_cast<const char*>(&*it);
}
Но главное, чего ты не соображаешь — это то, что некоторая сложность при реализации шаблонных сущностей — это всего лишь скромная плата за то упрощение, которое они дают в точках использования, число которых несоизмеримо больше, чем код самих шаблонов:
Такие как ты предпочитают размазать говно по всему коду, вместо того, чтобы в одном месте написать пару несложных шаблончиков. И это вовсе не по каким-то "концептуальным" соображениям, а просто потому, что вам это недоступно, вот и всё.
А конкретно ты — просто неуч и лентяй. Вместо того, чтобы учиться и осваивать язык, ты ищешь способы, как программировать, не приходя в сознание.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Shmj, Вы писали:
M>>C++ разный. Пишешь библиотеку — тут можно и десятиэтажные шаблоны делать, главное — максимально всё предусмотреть, документировать , и чтобы она была максимально проста в использовании.
S>Это если библиотеку гарантированно никто другой не будет править.
Уровень библиотеко-писателей должен быть примерно одинаков, школоту конечно нельзя подпускать
M>>Пишешь прикладной код — тут можно и по простому.
S>А обоснование какое?
Прикладной код может и школота потом править
M>>Какую? Я из твоей портянки так и не понял, что за концепция. Я пишу максимально кондово и понятно для всех
S>Учись пока я жив. Берешь простыню текста и вводишь в GPT, потом задаешь свой вопрос. Учись, я сделал это для тебя:
S>
S>Автор описывает две концепции упрощённого C++:
S>1. «C++ как C с классами» — минимализм, RAII, отказ от сложностей языка.
S>2. «C++ как Java/C#» — управление через умные указатели, без сырых указателей и сложных шаблонов.
Правда, обеспечение RAII уже требует сложностей языка.
Правда, умные указатели (у это не разве не тоже RAII?) требуют сложностей языка.
S>С появлением GPT теперь мы юридически точно можем сказать кто дурак — пишущий или читающий. Так что теперь как раньше не прокатывает, уже нельзя обвинить оппонента без оснований — ранее можно было, т.к. критерия точного не было, теперь есть.
Не можем. безусловно, никакая AI-гопота не может быть арбитром
Здравствуйте, Marty, Вы писали:
M>Пишешь библиотеку — тут можно и десятиэтажные шаблоны делать, главное — максимально всё предусмотреть, документировать , и чтобы она была максимально проста в использовании.
Если использование библиотеки предполагает включение заголовка с этими "десятиэтажными шаблонами" в клиентский код, она никак не может быть "максимально проста в использовании". Чисто технически.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Если использование библиотеки предполагает включение заголовка с этими "десятиэтажными шаблонами" в клиентский код, она никак не может быть "максимально проста в использовании". Чисто технически.
Угу. А Земля имеет форму чемодана. Потому что тебе так хочется.
Подключать-то по-разному можно. Если подключаешь только то, что нужно и только туда, где это нужно, то и проблем никаких у тебя не будет. Если же ты бездумно пхнешь все инклюды подряд в заголовки верхнего уровня, то, скорее всего, у тебя что-то с головой.
--
Справедливость выше закона. А человечность выше справедливости.