На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) « Первая ... 26 27 [28] 29 30 ... Последняя »  ( Перейти к последнему сообщению )  
> Язык для обучения программированию
    Цитата D_KEY @
    Нуу... Есть люди, которым он заходит. Почему бы им его не учить? Имеют право.
    Ну по своему личному желанию можно начинать хоть с брейнфака. Но мы-то говорим об учебных заведениях. И да, это мое личное мнение.
    Сообщение отредактировано: applegame -
      Цитата applegame @
      Ну по своему личному желанию можно начинать хоть с брейнфака. Но мы-то говорим об учебных заведениях

      Ну мне кажется, что в большинстве курсов студентам можно разрешить на любом языке лабы/курсовые писать (по согласованию с преподавателем).
      А сам препод может выбрать для курса тот язык, который лучше по его мнению позволит раскрыть тему.

      Цитата
      И да, это мое личное мнение.

      У нас у всех так :)
      Сообщение отредактировано: D_KEY -
        Цитата applegame @
        Это решается не при помощи языковых конструкций, а довольно грубым хаком, а именно расковыриванием значения макроса __PRETTY_FUNCTION__

        Ну так я сразу сказал, что это костыль. "Костыль" и "изящно" друг другу не всегда противоречат :)
          Цитата OpenGL @
          Ну так я сразу сказал, что это костыль. "Костыль" и "изящно" друг другу не всегда противоречат
          Ну это, видимо, субъективно, для меня "изящный костыль" в контексте программирования звучит как оксюморон. :lol:
            Цитата D_KEY @
            Давай поэкспериментируем?
            На ком? Найдёшь падаванов? Моим вон 5 минут хватило осознать необходимые базовые принципы STL, чтобы вместо C использовать C++ в своих тестовых примерах. Не чистый пример, да, но показательный.
            Цитата applegame @
            Вот тебе задача: получить список всех функций-членов произвольного класса.
            Подловил. Ну да, ждём метаклассов. Обещали в C++24. Только я всё равно не вижу практического применения этого знания.
            Цитата applegame @
            Решение на D, оно несколько неполное, но поверь, раздербанить можно любой тип на мельчайшие составляюшие:
            ...
            Зачем? Чтобы сериализировать? А ты уверен, что рефлексия даст тебе правильное решение? Вот у тебя класс Connection с удалённым серверном, ну-ка расскажи, как ты рефлексией его сохранишь, а потом восстановишь, пусть даже и на этой же машине. И что тебе вообще даст рефлексия.
            Не правильно спросил. Вообще зачем тебе рефлексия? Любые примеры практического применения мне лично попадались исключительно синтетические.
            Цитата applegame @
            Народ в плюсах жесточайшими путями умудряется кое-как итерировать поля PODов, и сильно гордится этим
            Стереть из интернета и забыть, что вообще подобное где-то когда-то было. Уже вижу, как народ вовсю кинулся визуализировать всякие там Connection-ы, std::filesystem::path-ы итп. Свят-свят-свят. applegame, не заставляй мне читать тебе лекцию об атрибутах объектов и почему они не коллинеарны полям класса. Целью обучения программированию является вообще-то определить правильные практики дизайна кода, а не натаскать на методах их обхода. Если уж натаскивать на методах обхода, то это однозначно не методы проектирования и это однозначно языкозависимые методы.
            P.S. Вообще, я уже не уверен, что вы понимаете предмет темы: обучение студентов программированию.
            Цитата OpenGL @
            Довольно изящное решение на мой взгляд.
            Та кто ж будет спорить. Я могу кучу привести примеров клёвых примеров, только практического применения им не будет. Замечу, тут речь не о некой технологии программирования, а о конкретной задаче на конкретном языке. Например, наваять некий using std::integer_sequence<>, содержащий первые, скажем 30 простых чисел. Или std::initializer_list<>, содержащий std::tuple<> со всеми сочетаниями элементов из std::integer_sequence<> по 5 из предыдущего элемента. Зачем, кроме как выпендриться?
            Цитата applegame @
            почему не так?
            Вот тут не могу не согласиться. Я тоже не понимаю этого засилья {} везде где ни попадя. Всю историю программеров учили, что инициализация атрибутами выполняется посредством (), а инициализация {} предназначена для агрегатных типов. И эта разница важна, потому как определяют совершенно разные принципы инициализации. Зачем ломать эту концепцию?
              Цитата Qraizer @
              Та кто ж будет спорить. Я могу кучу привести примеров клёвых примеров, только практического применения им не будет.

              Ну ты загнул тут, конечно. Подобная штука для enum-ов довольно полезна безотносительно желания повыпендриваться.
                Qraizer, ну вот сериализацию на C++ ты как предлагаешь делать?
                  Цитата D_KEY @
                  Ну мне кажется, что в большинстве курсов студентам можно разрешить на любом языке лабы/курсовые писать (по согласованию с преподавателем).
                  А сам препод может выбрать для курса тот язык, который лучше по его мнению позволит раскрыть тему.

                  В алгоритмических курсах, конечно, можно.
                  Я студентам говорю: Пишите на любом алгоритмическом языке, который поддерживает рекурсию.
                    Цитата Qraizer @
                    Только я всё равно не вижу практического применения этого знания.

                    Вчера спешил, хотел именно это спросить раньше тебя, но не получилось! :'(
                      Цитата Qraizer @
                      Подловил.
                      Да много на чем можно подловить :) Например в D есть атрибуты, которыми можно декорировать все что угодно, а потом рефлексией разбирать и использовать. Та же сериализация, например:

                      ExpandedWrap disabled
                        struct Packet {
                          string name;
                          
                          @optional("default_type")
                          string type;
                         
                          @field("data_info")
                          int info;
                        }


                      В D можно на стадии компиляции импортнуть любой файл и благодаря настоящему CTFE, а не убогому плюсовому constexpr, распарсить этот файл в код. Например так сделан http-шаблонизатор Diet.
                      Дешный CTFE позволяет генерить парсеры на основе грамматики - либка pegged

                      Цитата Qraizer @
                      Вообще зачем тебе рефлексия? Любые примеры практического применения мне лично попадались исключительно синтетические.
                      Это потому что в плюсах нет рефлексии. ;)
                      А у меня в проде трудится рефлексия не только для сериализации. В частности, при помощи классов у меня описываются, веб-интерфейсы. А библиотечка рефлексией генерит код для обработки HTTP-запросов.
                      Упрощенно:

                      ExpandedWrap disabled
                        class DataInterface : WebInterface {
                          @path("/data") {
                            auto getUsers(string p1, int p2) {...}           // GET  /data/users?p1=a&p2=10
                            auto getUserItems() {...}                        // GET  /data/user/items
                            auto postUserInfo(string name, uint count) {...} // POST /data/user/info
                          }
                         
                          @authenticated
                          auto getProfile(User user) {...} // GET /profile только для авторизованных пользователей, редирект, если не авторизован
                        }

                      А потом что-то вроде
                      ExpandedWrap disabled
                        auto server = listenHTTP(new DataInterface());

                      И все. Далее оно само зарефлексит DataInterface вытащит из него имена функций, имена и типы параметров, и сгенерит код, для соответствующего роутинга и валидации параметров.
                      В реальной либе все гораздо мощнее. Там и автоматическая сериализация/десериализация JSON, сессии, хуки и т.д. и т.п.

                      Также рефлексия применяется похожим образом для роутинга Remote Procedure Call, с упаковкой параметров функции в MessagePack.
                        Чтобы не флудить в тематике, буду спрашивать здесь.
                        Почему у меня черепашка не заливает фигуру цветом, а только рисует красный контур?
                        import turtle
                        t=turtle.Pen()
                        t.color("red","green")
                        t.begin_fill()
                        t.fd(50)
                        t.left(90)
                        t.fd(50)
                        t.left(90)
                        t.fd(50)
                        t.left(90)
                        t.fd(50)
                        t.left(90)
                        t.end_fill()
                          Может нужен явный t.fillcolor('blue')?
                            Цитата D_KEY @
                            Может нужен явный t.fillcolor('blue')?

                            Ура! Спс :)

                            Добавлено
                            import turtle
                            t=turtle.Pen()
                            t.color("red")
                            t.fillcolor('blue')
                            t.begin_fill()
                            t.fd(50)
                            t.left(90)
                            t.fd(50)
                            t.left(90)
                            t.fd(50)
                            t.left(90)
                            t.fd(50)
                            t.left(90)
                            t.end_fill()
                              Цитата OpenGL @
                              Подобная штука для enum-ов довольно полезна безотносительно желания повыпендриваться.
                              Ни разу не понадобилось, OpenGL. Перечисления по определению являются дискретным входом, для таких арифметические операции просто не определены. Если хочешь доопределить, это другой вопрос, но тут же встаёт новый: зачем оно понадобилось, не баг ли это в архитектуре?
                              Цитата D_KEY @
                              Qraizer, ну вот сериализацию на C++ ты как предлагаешь делать?
                              Ото ты не знаешь. Никто, кроме самого класса, не может знать лучше, как сохранить его состояние и как в дальнейшем восстановить. Какие-то атрибуты он вообще не хранит, а вычисляет при их запросе или принимает и раскладывает на составляющие при установке. (Типичнейший пример – атрибуты Ro и Fi для класса комплексных чисел, который в качестве полей хранит атрибуты Re и Im.) Какие-то вообще не его, а он их выдаёт за свои, сиречь они им делегируются. (Можно т.о. представить себе реализацию упомянутого Connection, чьи атрибуты опираются на объекты ОС.) В частном случае ты можешь реализовать сериализацию класса через его публичные гет/сеттеры, но в общем случае только сам класс знает, как это сделать не только правильно, но и эффективно. Он должен поддерживать этот интерфейс. Если его автор не озаботился, это либо ошибка дизайна класса, либо это значит, что вполне достаточно гет/сеттеров. И вот на этом нужно при обучении делать упор. А на том, как обходить недостатки дизайна, если вдруг архитектурно правильное решение – дополнить дизайн класса реализацией интерфейса сериализации – невозможно, обучать на факультативах. И там уже можно и рассказать про один из вариантов обхода неудачных проектных решений в лице рефлексии.
                              Понимаешь, D_KEY, проблема нынешнего образования в том, что не делается разницы между программированием как наукой и программированием как практическим навыком. И это ИМХО неправильно. Если первое выдавать за второе, мы получим армию крутых кодеров, а хотелось бы программеров.

                              P.S. Твоё отношение к паттерну рефлексии я понял ещё с прошлого поста, applegame, не волнуйся. Теория программирования против сильных связей между сущностями более, чем это необходимо, но ты имеешь право на иное мнение.

                              Добавлено
                              P.P.S. И ты сильно недооцениваешь Плюсы. Мне никто не помешает распарсить любую формальную грамматику, которой я научу Плюсовый компилятор в компайл-тайм. Библиотек с поддержкой интерпретации любых скриптовых языков, реальных или выдуманных, хватает. boost::spirit к примеру ещё на C++03 была. Очень хочется посмотреть на метаклассы и концепты в боевом режиме, а не песочнице experimental, но в то же время я их боюсь. Боюсь, что придётся испытать революцию, сравнимую с той, что 18 лет назад испытал после ознакомления с трудом Александреску.
                              Сообщение отредактировано: Qraizer -
                                Цитата Qraizer @
                                Перечисления по определению являются дискретным входом, для таких арифметические операции просто не определены. Если хочешь доопределить, это другой вопрос, но тут же встаёт новый: зачем оно понадобилось, не баг ли это в архитектуре?

                                Описанная библиотека совсем не про арифметические операции с ними.

                                Добавлено
                                Цитата Qraizer @
                                Ото ты не знаешь. Никто, кроме самого класса, не может знать лучше, как сохранить его состояние и как в дальнейшем восстановить.

                                Никто. Но в over99% случаев подойдёт "вызовем сериализацию всех полей, кроме ...". Писать такое руками не намного более интеллектуальное занятие, чем самому расставлять всякие финализаторы по выходу из скопа вместо того, чтобы заюзать raii. И даже если такая тупая реализация тебе по каким-то причинам не подходит, в нормальных языках ты всегда можешь реализовать её так, как это нужно конкретно для этого класса. Так что возможность написать это нормально без костылей - маст хев.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0716 ]   [ 15 queries used ]   [ Generated: 10.05.24, 12:30 GMT ]