Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.202.167] |
|
Страницы: (32) « Первая ... 26 27 [28] 29 30 ... Последняя » ( Перейти к последнему сообщению ) |
Сообщ.
#406
,
|
|
|
Ну по своему личному желанию можно начинать хоть с брейнфака. Но мы-то говорим об учебных заведениях. И да, это мое личное мнение.
|
Сообщ.
#407
,
|
|
|
Цитата applegame @ Ну по своему личному желанию можно начинать хоть с брейнфака. Но мы-то говорим об учебных заведениях Ну мне кажется, что в большинстве курсов студентам можно разрешить на любом языке лабы/курсовые писать (по согласованию с преподавателем). А сам препод может выбрать для курса тот язык, который лучше по его мнению позволит раскрыть тему. Цитата И да, это мое личное мнение. У нас у всех так |
Сообщ.
#408
,
|
|
|
Цитата applegame @ Это решается не при помощи языковых конструкций, а довольно грубым хаком, а именно расковыриванием значения макроса __PRETTY_FUNCTION__ Ну так я сразу сказал, что это костыль. "Костыль" и "изящно" друг другу не всегда противоречат |
Сообщ.
#409
,
|
|
|
Цитата OpenGL @ Ну это, видимо, субъективно, для меня "изящный костыль" в контексте программирования звучит как оксюморон. Ну так я сразу сказал, что это костыль. "Костыль" и "изящно" друг другу не всегда противоречат |
Сообщ.
#410
,
|
|
|
На ком? Найдёшь падаванов? Моим вон 5 минут хватило осознать необходимые базовые принципы STL, чтобы вместо C использовать C++ в своих тестовых примерах. Не чистый пример, да, но показательный.
Подловил. Ну да, ждём метаклассов. Обещали в C++24. Только я всё равно не вижу практического применения этого знания. Цитата applegame @ Зачем? Чтобы сериализировать? А ты уверен, что рефлексия даст тебе правильное решение? Вот у тебя класс Connection с удалённым серверном, ну-ка расскажи, как ты рефлексией его сохранишь, а потом восстановишь, пусть даже и на этой же машине. И что тебе вообще даст рефлексия.Решение на D, оно несколько неполное, но поверь, раздербанить можно любой тип на мельчайшие составляюшие: ... Не правильно спросил. Вообще зачем тебе рефлексия? Любые примеры практического применения мне лично попадались исключительно синтетические. Цитата applegame @ Стереть из интернета и забыть, что вообще подобное где-то когда-то было. Уже вижу, как народ вовсю кинулся визуализировать всякие там Connection-ы, std::filesystem::path-ы итп. Свят-свят-свят. applegame, не заставляй мне читать тебе лекцию об атрибутах объектов и почему они не коллинеарны полям класса. Целью обучения программированию является вообще-то определить правильные практики дизайна кода, а не натаскать на методах их обхода. Если уж натаскивать на методах обхода, то это однозначно не методы проектирования и это однозначно языкозависимые методы.Народ в плюсах жесточайшими путями умудряется кое-как итерировать поля PODов, и сильно гордится этим P.S. Вообще, я уже не уверен, что вы понимаете предмет темы: обучение студентов программированию. Та кто ж будет спорить. Я могу кучу привести примеров клёвых примеров, только практического применения им не будет. Замечу, тут речь не о некой технологии программирования, а о конкретной задаче на конкретном языке. Например, наваять некий using std::integer_sequence<>, содержащий первые, скажем 30 простых чисел. Или std::initializer_list<>, содержащий std::tuple<> со всеми сочетаниями элементов из std::integer_sequence<> по 5 из предыдущего элемента. Зачем, кроме как выпендриться? Вот тут не могу не согласиться. Я тоже не понимаю этого засилья {} везде где ни попадя. Всю историю программеров учили, что инициализация атрибутами выполняется посредством (), а инициализация {} предназначена для агрегатных типов. И эта разница важна, потому как определяют совершенно разные принципы инициализации. Зачем ломать эту концепцию? |
Сообщ.
#411
,
|
|
|
Цитата Qraizer @ Та кто ж будет спорить. Я могу кучу привести примеров клёвых примеров, только практического применения им не будет. Ну ты загнул тут, конечно. Подобная штука для enum-ов довольно полезна безотносительно желания повыпендриваться. |
Сообщ.
#412
,
|
|
|
Qraizer, ну вот сериализацию на C++ ты как предлагаешь делать?
|
Сообщ.
#413
,
|
|
|
Цитата D_KEY @ Ну мне кажется, что в большинстве курсов студентам можно разрешить на любом языке лабы/курсовые писать (по согласованию с преподавателем). А сам препод может выбрать для курса тот язык, который лучше по его мнению позволит раскрыть тему. В алгоритмических курсах, конечно, можно. Я студентам говорю: Пишите на любом алгоритмическом языке, который поддерживает рекурсию. |
Сообщ.
#414
,
|
|
|
Цитата Qraizer @ Только я всё равно не вижу практического применения этого знания. Вчера спешил, хотел именно это спросить раньше тебя, но не получилось! |
Сообщ.
#415
,
|
|
|
Цитата Qraizer @ Да много на чем можно подловить Например в D есть атрибуты, которыми можно декорировать все что угодно, а потом рефлексией разбирать и использовать. Та же сериализация, например:Подловил. struct Packet { string name; @optional("default_type") string type; @field("data_info") int info; } В D можно на стадии компиляции импортнуть любой файл и благодаря настоящему CTFE, а не убогому плюсовому constexpr, распарсить этот файл в код. Например так сделан http-шаблонизатор Diet. Дешный CTFE позволяет генерить парсеры на основе грамматики - либка pegged Цитата Qraizer @ Это потому что в плюсах нет рефлексии. Вообще зачем тебе рефлексия? Любые примеры практического применения мне лично попадались исключительно синтетические. А у меня в проде трудится рефлексия не только для сериализации. В частности, при помощи классов у меня описываются, веб-интерфейсы. А библиотечка рефлексией генерит код для обработки HTTP-запросов. Упрощенно: 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 только для авторизованных пользователей, редирект, если не авторизован } А потом что-то вроде auto server = listenHTTP(new DataInterface()); И все. Далее оно само зарефлексит DataInterface вытащит из него имена функций, имена и типы параметров, и сгенерит код, для соответствующего роутинга и валидации параметров. В реальной либе все гораздо мощнее. Там и автоматическая сериализация/десериализация JSON, сессии, хуки и т.д. и т.п. Также рефлексия применяется похожим образом для роутинга Remote Procedure Call, с упаковкой параметров функции в MessagePack. |
Сообщ.
#416
,
|
|
|
Чтобы не флудить в тематике, буду спрашивать здесь.
Почему у меня черепашка не заливает фигуру цветом, а только рисует красный контур? 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() |
Сообщ.
#417
,
|
|
|
Может нужен явный t.fillcolor('blue')?
|
Сообщ.
#418
,
|
|
|
Цитата 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() |
Сообщ.
#419
,
|
|
|
Цитата OpenGL @ Ни разу не понадобилось, OpenGL. Перечисления по определению являются дискретным входом, для таких арифметические операции просто не определены. Если хочешь доопределить, это другой вопрос, но тут же встаёт новый: зачем оно понадобилось, не баг ли это в архитектуре?Подобная штука для enum-ов довольно полезна безотносительно желания повыпендриваться. Цитата D_KEY @ Ото ты не знаешь. Никто, кроме самого класса, не может знать лучше, как сохранить его состояние и как в дальнейшем восстановить. Какие-то атрибуты он вообще не хранит, а вычисляет при их запросе или принимает и раскладывает на составляющие при установке. (Типичнейший пример – атрибуты Ro и Fi для класса комплексных чисел, который в качестве полей хранит атрибуты Re и Im.) Какие-то вообще не его, а он их выдаёт за свои, сиречь они им делегируются. (Можно т.о. представить себе реализацию упомянутого Connection, чьи атрибуты опираются на объекты ОС.) В частном случае ты можешь реализовать сериализацию класса через его публичные гет/сеттеры, но в общем случае только сам класс знает, как это сделать не только правильно, но и эффективно. Он должен поддерживать этот интерфейс. Если его автор не озаботился, это либо ошибка дизайна класса, либо это значит, что вполне достаточно гет/сеттеров. И вот на этом нужно при обучении делать упор. А на том, как обходить недостатки дизайна, если вдруг архитектурно правильное решение – дополнить дизайн класса реализацией интерфейса сериализации – невозможно, обучать на факультативах. И там уже можно и рассказать про один из вариантов обхода неудачных проектных решений в лице рефлексии.Qraizer, ну вот сериализацию на C++ ты как предлагаешь делать? Понимаешь, D_KEY, проблема нынешнего образования в том, что не делается разницы между программированием как наукой и программированием как практическим навыком. И это ИМХО неправильно. Если первое выдавать за второе, мы получим армию крутых кодеров, а хотелось бы программеров. P.S. Твоё отношение к паттерну рефлексии я понял ещё с прошлого поста, applegame, не волнуйся. Теория программирования против сильных связей между сущностями более, чем это необходимо, но ты имеешь право на иное мнение. Добавлено P.P.S. И ты сильно недооцениваешь Плюсы. Мне никто не помешает распарсить любую формальную грамматику, которой я научу Плюсовый компилятор в компайл-тайм. Библиотек с поддержкой интерпретации любых скриптовых языков, реальных или выдуманных, хватает. boost::spirit к примеру ещё на C++03 была. Очень хочется посмотреть на метаклассы и концепты в боевом режиме, а не песочнице experimental, но в то же время я их боюсь. Боюсь, что придётся испытать революцию, сравнимую с той, что 18 лет назад испытал после ознакомления с трудом Александреску. |
Сообщ.
#420
,
|
|
|
Цитата Qraizer @ Перечисления по определению являются дискретным входом, для таких арифметические операции просто не определены. Если хочешь доопределить, это другой вопрос, но тут же встаёт новый: зачем оно понадобилось, не баг ли это в архитектуре? Описанная библиотека совсем не про арифметические операции с ними. Добавлено Цитата Qraizer @ Ото ты не знаешь. Никто, кроме самого класса, не может знать лучше, как сохранить его состояние и как в дальнейшем восстановить. Никто. Но в over99% случаев подойдёт "вызовем сериализацию всех полей, кроме ...". Писать такое руками не намного более интеллектуальное занятие, чем самому расставлять всякие финализаторы по выходу из скопа вместо того, чтобы заюзать raii. И даже если такая тупая реализация тебе по каким-то причинам не подходит, в нормальных языках ты всегда можешь реализовать её так, как это нужно конкретно для этого класса. Так что возможность написать это нормально без костылей - маст хев. |