Интересует такой простой(или не очень) вопрос: как работают сервисы по типу javaRush, Codecademy? Мне очень захотелос сделать в учебных целях что-то похожое
Как я это вижу сейчас:
Есть форма, где я пишу код. При нажатии на кнопку к ним на сервер отправляется POST-запрос, который содержит этот код. Далее этот код должен быть проанализирован или пропущен через тесты. И в результат тестов будет выведен пользоователю
Сама большая проблема, с которой я столкнулся - анализ кода при запущеном сервере. Я использую Tomcat&Java Servlets, код анализирую в спомощью Java Reflection, а для самого сайта использую JSP(Spring я не знаю)
Вся эта возня с рефлексией, jsp и сервлетами довольно муторная. И в случае с несколькими классами, которые вместе связаны я вообще в замешательстве. Меня все время не покидает чувство, что я делаю что-то неправильно.
Так вот вопрос: какие технологии использует JavaRush например? Может есть что-то вроде готовых решений\движков\фреймворков для реализации на Java моей задумки? Заранее благодарю
Зачем вам анализировать код? что вы хотите в нем найти? Если ошибки синтаксиса - пропустите через компилятор он вам всё скажет. Ошибки выполнения вылезут при запуске.
Такое делается обычно в песочнице - делаете безопасное окружения для запуска кода, запускаете его там, если какие-то ошибки - вам компилятор или среда выполнения все скажут, если нет - вывод скрипта проверяете и отправляете обратно в браузер результат.
Как делать песочницу - отдельный вопрос. Возможно есть какие-то готовые решения для запуска java кода в изоляции, тут гугл вам в помощь. Я бы для простоты запускал в изолированном докере - тяжеловато и не слишком ограничено там внутри но быстро и надежно. Для учебных целей подойдет. Можно и свою песочницу нагородить, если уверены в безопасности.
Да, ошибки синтаксиса и так компилятор покажет через Exception, но мне интересно не просто скомпилировать код, а проанализировать классы, которые пользователь ввел.
Под анализом я имел в виду пропуск кода через тесты, то есть анализ через рефлексию, правильные ли аттрибуты, сеттеры, конструкторы и прочее написал юзер и выполнили ли он задание. А задание по типу "создайте класс Person с аттрибутами String name, int age"
Про докер ничего не слышал к сожалению(я всего студент), но почитаю, спасибо за совет
Igor_ku, Для меня задача анализа структуры класса выглядит сомнительно. Или у вас будут крайне жесткие задания типа "напишите класс A с методом m у которого два параметра - строка и число", и смысла в них особо нет, (и их можно проверить регуляркой какой-нибудь прямо по исходнику)
Либо у вас будут 100500 совершенно разных вариантов решения, которые только человек сможет нормально проанализировать.
Приведите пример задания где для проверки нужен анализ структуры кода, интересно.
Robur, да, именно такой случай и интересует, "создайте класс А с методом m у которого два параметра - строка и число, метод m2, который выводит число 5 на экран, конструктор который принимает два значения и тд". Только болле расплывчато сформулировано
И тут какраз поможет рефлексия и извращения. Я беру код в виде строки, записываю его в файл, компилирую файл и получаю объект из этого файла, как нормальный класс. Потом могу забирать оттуда методы, конструкторы, поля да и все возможное через рефлексию. Ну и когда у меня есть данные про класс
Как бы вы проверили это еще? У меня получилось как я описал выше, но есть некоторые проблемы. Возможно, я замахнулся на слишком сложную задачу, или делаю что-то совсем не так
Как пример можно привести создание класса "Automobil", что-то вроде "создайте класс Мотор, Колесо и Автомобиль. Автомобиль содержит 4 колеса, один мотор. Эти атрибуты автомобиль получает в конструкторе: Automobil(Motor motor, Wheel wheel1, Wheel wheel2...){}"
Если вы хотите проверять насколько человек овладел конструкциями языка, паттернами, хорошими и плохими подходами - то это действительно крайне сложная задача. Если дать этот код пятерым опытным программистам - у каждого будет свое мнение, как стоило написать. двое скажут что все отлично, один скажет говно какое-то, еще пара - что пойдет но надо вот тут и тут по другому было. В дверь заглянет шестой и скажет что наследование без причины признак дурачины и то что вы проверяете - вообще не правильно поставленная задача.
Если вы хотите проверять смог ли человек по заданию "Эти атрибуты автомобиль получает в конструкторе: Automobil(Motor motor, Wheel wheel1, Wheel wheel2...)" создать конструктор с параметрами "Motor motor, Wheel wheel1, Wheel wheel2" - то это задача бестолковая. Ничему не учит кроме способности копипасты.
Мое имхо.
Как бы вы проверили это еще
в простых случаях, когда надо просто проверить что есть конструктор, созданы классы, есть нужные параметры - я бы проверил регуляркой прямо по тексту. В более сложных - смотри комент выше про оценку кода.
Но, ничто не мешает вам делать то что вы хотите :) удачи.
Можно крч через ANTLR прогнать) для каждой задачки написать парсер) если разбор строки происходит правильно, то пробуем скомпилить и прогнать через тесты, если и тут все ок, отправляем, что все ок) но это мб чутка муторно, хотя если приловчиться)