1. C++ / Говнокод #24602

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    Чего такого умеют кресты, что не умеет Си?
    
    Шаблоны - никто не пользует.
    
    Перегрузка операторов - вообще дурь какая-то: не понятно чего ожидать от полюса или минуса.
    
    Очевидный ответ - объекты , а так уж они нужны? Ну вот есть объект - библиотека работы с сокетами. Создал экземпляр, заполнил поля с адресом и портом, выполнил метод connect. Попользовался, освободил память. И чем оно лучше, чем если бы я запилил структуру и набор функций для работы с ней?
    
    За скобки вынесем области применения, где преимущества объектного подхода очевидны: игры, ГУЙ и прочее. Поговорим об остальном.

    Псто не мое.
    Заходите на "огонек": https://www.linux.org.ru/forum/development/14396202

    Запостил: Elvenfighter, 08 Августа 2018

    Комментарии (45) RSS

    • 86a0dd3e5c5260b1dab538d4156708e8
      Ответить
    • Вас ист шаблон? Фабрик для объектов (как классы в делфи)? Нахуй не нужна, как и сами объекты.
      Ответить
      • Про дженерики в Delphi XE и в новых версиях FPC не слышал?

        Дженерики — это концепция, аналогичная шаблонам (хотя между большая разница).
        Ответить
        • Фу-фу-фу, всё равно не нужны.
          Ответить
          • Почитай про обобщённое программирование:
            https://ru.wikipedia.org/w/?curid=330410

            История шаблонов и дженериков началась с желания переиспользовать код, чтобы повторно не писать одно и то же для разных типов данных. Например, нужно посчитать расстояние между двумя точками на плоскости. Если мы создаём библиотеку, нам придётся ту же самую функцию написать и для целых чисел, и для длинных целых, и для вещественных, и для длинных вещественных. Обобщённое же программирование позволяет написать формулу один раз, передав тип как параметр шаблона/дженерика.

            Вот только Страуструп решил пойти дальше и из шаблонов создал целый язык программирования, на котором, например, можно считать факториалы. Только Борманда сюда не зовите, а то он какую-нибудь криптографическую функцию на шаблонах напишет.
            Ответить
            • > Страуструп решил пойти дальше
              Да не хотел он... Это Александреску всю эту метушню затеял.
              Ответить
              • А ведь и правда, первые Си с классами были без шаблонов.
                Ответить
                • Да даже шаблоны по началу юзали всего лишь для обобщённых функций и контейнеров, о которых ты и пишешь выше.
                  Ответить
                  • в жабе с котлином и сишарпом и питонячим pep-484 до сих пор так и делают. Ковариантность и контравариантность и вот это всё

                    нам хвотает
                    Ответить
              • > Александреску

                В этом треде остро не хватает упоминания о тов. Степанове, отце-основателе обобщенного программирования.
                Ответить
                • Степанов разве метушил? Он же юзал шаблоны для безобидных итераторов, алгоритмов да контейнеров...
                  Ответить
                  • > безобидных

                    А кто ты думаешь придумал функции на типах iterator_traits, и кому понадобились шаблоны в шаблонах?

                    The second significant new feature used in STL was template arguments which are templates themselves, and that's how allocators, as originally proposed, were done.

                    -- http://web.archive.org/web/20090501134514/http://www.sgi.com/tech/stl/drdobbs-interview.html
                    Ответить
            • > Например, нужно посчитать расстояние между двумя точками на плоскости. Если мы создаём библиотеку, нам придётся ту же самую функцию написать и для целых чисел, и для длинных целых, и для вещественных, и для длинных вещественных. Обобщённое же программирование позволяет написать формулу один раз, передав тип как параметр шаблона/дженерика.

              А куда ты денешься, если у тебя точки могут задаваться в полярных, декартовых, параболических и еще в хер пойми каких координатах? И чтоб сравнивать (узнавать расстояние) можно было точку, заданную через любую систему координат с точкой, заданной любой системой координат
              Ответить
              • если ты собрался считать расстояние между a и b, имеющий разный тип, то напиши шаблон для <T1, T2>, в чем проблема

                в крайнем случае один из аргументов можно оператором приведения типа привести к общему универсальному типу, операторов в сишке так-то тоже нет...
                Ответить
                • Тогда еще надо писать код, конвертящий любой тип Tx в любой другой тип Ty. Вот если б можно было как-нибудь декларативно все системы координат описать, и чтоб компилятор на основе этого декларативного описания уже генерировал все функции преобразования из чего угодно в что угодно - другое дело
                  Ответить
                  • > Вот если б можно было как-нибудь декларативно все системы координат описать

                    вот именно с этого начинается любое порно в крестах, потому что тоже можно
                    порождаются мегатонны метушни, которые компилируются по полчаса, зато декларативненько!
                    Ответить
                    • Поэтому я за "PHP".
                      Ответить
                      • Давай будем честны — ты за "PHP" по совсем другой причине.
                        Ответить
                        • Когда я работаю с "PHP", я испытываю сущее наслаждение - не надо думать о компиляциях, декларативности, "дженериках" и прочей хуйне. Просто программирую и теку.
                          Ответить
                      • Будем честны -- декларативно может получиться в жопаскрипте (жысон), в луа (самый декларативный синтаксис это таблицы) а в пыхе все пафосно, натужно и глупо
                        Ответить
                  • > декларативно все системы координат описать
                    Все эти ваши декларативность и описание типов не нужны, настоящему программисту достаточно лишь одного типа – массива байт, и ещё одного типа, что подносит ему чай/кофе/бутерброды, стряхает крошки с его бороды, вытирает с него пыль, пока он работает. А все эти ваши языки высокого уровня, интерпретаторы и компиляторы (что назывались "программирующеми программами") были придуманы для не-программистов: учёных-физиков и пр.
                    Ответить
                    • Совершенно верно. COBOL нужен для разработки прикладных программ для бизнеса, и пишут на них математики. А программы операционные системы пишутся на языке ассемблера программистами

                      Зачем вообще программисту язык высокого уровня?

                      Друзья, 1968 год на дворе, пора бы такие вещи знать.
                      Ответить
              • > И чтоб сравнивать (узнавать расстояние) можно было точку, заданную через любую систему координат с точкой, заданной любой системой координат

                Очень сомнительная хотелка. Может быть полезной в системе комьютерной алгебры (где тебе никакие шаблоны не помогут), но в каких-нибудь играх неявные преобразования координат тут и там будут лишь способствовать баттхёрту разработчиков.

                Если очень хочется, то делаешь систему координат параметром шаблона типа координат и описывашь преобразования в специализациях.

                Есть правда одна принципиальная проблемка: к какой системе из двух конвертировать при расчёте расстояния? Потому что результат может немного отличаться в зависимости от выбранного пути.

                struct cartesian : coord_system<cartesian> {…};
                struct polar : coord_system<polar> {…};
                
                template <class CoordSystem>
                struct point {…};
                
                template <class From, class To>
                struct convert {
                  point<To> operator()(const point<From>& lhs) const { … }
                  …
                };
                
                template <class S1, class S2>
                double dist(const point<S1>& lhs, const point<S2>& rhs) {
                  // Why not convert<S2, S1> ?
                  convert<S1, S2> f;
                  return (f(lhs) - (rhs)).norm();
                }
                Ответить
                • > Есть правда одна принципиальная проблемка: к какой системе из двух конвертировать при расчёте расстояния? Потому что результат может немного отличаться в зависимости от выбранного пути.

                  Он даже может немного отличаться в зависимости от компилятора. Ведь для всяких sin cos sqrt в стандарте C/C++ не описываются требования к точности этой херни.
                  https://stackoverflow.com/a/20137304
                  Ответить
                • >Если очень хочется, то делаешь систему координат параметром шаблона типа координат и описывашь преобразования в специализациях.

                  А если у нас овер 100500 способов представить координаты, надо писать для каждого в каждый способ такое преобразование? А нельзя ли это как-нибудь автоматизировать? Ну вот например можно описать преобразование из системы координат A в систему координат B и обратно (биекция), потом из A в C и обратно, потом из A в D и обратно ... а потом чтоб какой-нибудь несуществующий пока что компилятор несуществующего пока что ЯП через гомоиконы, суперкомпиляцию и символьные вычисления смог математично нагенерить биекций для B <-> C, B <-> D, C <-> D ну и так далее, чтоб без тупых цепочек вроде B -> A -> C от которых может теряться точность преобразования.
                  Ответить
    • >>Шаблоны - никто не пользует.
      ахахахахахха
      Ответить
    • Если так припомнить, то вся или почти вся критика с++, с которой я сталкивался, датируется до 2011 года. Какое отношение у посетителей сайта к Modern c++, а точнее к последним стандартам?
      Ответить
      • Продолжают засирать язык всякой одноразовой хернёй вместо того, чтобы сразу протащить какие-нибудь метаклассы, вот моё отношение к новым стандартам.

        Даже из буста не могут либы спиздить без косяков. Взять тот же random_device, который тут недавно обсуждали.
        Ответить
        • Да какие нафиг метаклассы, они даже sin() cos() не могут сделать для constexpr
          Ответить
    • Деструкторы.
      Ответить
    • STL.
      Ответить
    • >> Я, если вдруг не ясно, - вообще нуб. В институте учили плюсам, сам сейчас почитал K&R, вот на таком вот уровне
      ...и давай сразу делать суждения!

      >>Ну так воид - просто ссылка на память. Это хощь-нехошь - массив байт.
      ...в сях нет ссылок

      >>Практика показывает, что «переменных и функций» вполне достаточно. Чего нельзя написать на си, но можно на си++?
      Паттерн "На X можно написать тоже самое что и на Y, следовательно Y не нужен".
      Всё что угодно можно написать на ассемблере, ЯПы высокого уровня не нужны


      Впрочем, реакция админов (основного контингента лор) тоже доставляет
      Ответить
      • > ...и давай сразу делать суждения!
        Если учить C++ без суждений, можно стать покорным рабом Его Шаблоннейшества, потеряв способность к критической оценке этого чудо-языка.
        Ответить
        • И всё же перед суждениями надо провести некоторые исследования.

          Нельзя говорить "шаблоны никто не использует"
          Ответить
      • > ...в сях нет ссылок

        А вот это не совсем верно. Возьмём, к примеру, выражение
        point.x = 5;
        Какой тип у выражения point.x в этом случае? int? int*? ничто из этого не подходит, там должно быть int& (lvalue).
        Т.е. ссылки как бы есть, но не являются "объектами первого рода" в языке, т.е. их, к примеру, нельзя передавать аргументами функции. Нужно конвертировать эти ссылки в указатели и разыменовывать обратно в конструкциях присваивания. В плюсах не изобрели ссылки, а просто сделали ссылки "объектами первого рода".
        Ответить
        • В таком случае и foo[42] это "ссылка": указывает же на адрес foo + 42, а поменять её нельзя
          Ответить
          • > foo[42] это "ссылка"
            Разумеется, всё, чему можно присвоить значение, является lvalue reference.

            В крестах это можно написать явно:
            int& instruct = point.x;
            int& inarray = foo[42];
            swap(instruct, inarray);
            Ответить
            • Как-то даже стало обидно что в си этого нет.
              Там бы мне пришлось брать адрес у point.x и присваивать его указателю
              Ответить
    • Я сочиняю роман, Рома, Рома, Роман, Роман
      Мужчина всей моей жизни
      Я сочиняю роман, Рома, Рома, Роман, Роман
      Мужчина всей моей жизни
      Ответить
      • Ничего не понял, на всякий случай нассал тебе в ротан
        Ответить
        • @Я сочиняю роман, Рома, Рома, Роман, Роман
          @Ничего не понял
          @roman-kashitsyn 5 часов назад #

          Возможно, гость №8 подъёбывает Романа Кашицына.
          Ответить

    Добавить комментарий