Программирование Lego EV3 на freepascal
Модератор: Модераторы
Программирование Lego EV3 на freepascal
Разработал ООП-библиотеку на FreePascal для программирования контроллера Lego EV3, обозвал Rubirobot, разместил на http://rubirobot.ru/, лицензия LGPL. Сейчас активно отлаживаю, расширяю документацию и примеры. Получится что-то востребованное, размещу на гитхаб для совместной разработки. Буду рад любым замечаниям, предложениям, конструктивной критике.
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
Судя по документации, работа проделана нешуточная, достойная уважения. Конструктора у меня нет, поэтому по поводу функционала ничего сказать не могу. А вот по поводу стиля кода есть замечания:
Вредное решение, нарушающее принцип уменьшения числа связей и зависимостей через глобальные переменные. И еще нарушается принцип говорящих имен. Короткие имена из одной-двух знаков можно создавать внутри коротких блоков, где весь код на виду и "время жизни" переменной очень мало.
Такой стиль кода характерен для языков, где даже nil является объектом и где существует автоматическое удаление объектов. Для языка ObjectPascal это значительно усложняет отладку и удлиняет стек вызовов, то есть жрет больше памяти во время работы. Вы экономите 2-3 знака в каждой строке кода, но теряете десятки байтов на строку во время выполнения.
Базовый модуль uev3 содержит 286 переменных
типа Variant, с именами a, a0, a1..a9, b, b0, b1..b9, ... z, z0, z1..z9. Это позволяет быстро
создавать программы, не отвлекаясь на объявление переменных
Вредное решение, нарушающее принцип уменьшения числа связей и зависимостей через глобальные переменные. И еще нарушается принцип говорящих имен. Короткие имена из одной-двух знаков можно создавать внутри коротких блоков, где весь код на виду и "время жизни" переменной очень мало.
Код: Выделить всё
ev3screen
.print(10,20,'Привет!!!')
.fontBig()
.print(10,40,'Привет!!!')
.fontRotate(-30)
.fontStd
.print(10,60,'Поворот -30')
.show;
Такой стиль кода характерен для языков, где даже nil является объектом и где существует автоматическое удаление объектов. Для языка ObjectPascal это значительно усложняет отладку и удлиняет стек вызовов, то есть жрет больше памяти во время работы. Вы экономите 2-3 знака в каждой строке кода, но теряете десятки байтов на строку во время выполнения.
Спасибо за конструктивные замечания.
Оба подхода предназначены для сокращения времени кодирования. Это важно во время робототехнических соревнований.
1. Про набор переменных в uev3. Фактически, это костыль, который позволяет не объявлять переменные, если очень торопишься. Если не торопишься - просто его не используешь. Все эти переменные в своем пространстве имен, библиотекой никак не используются, ни с чем не пересекаются и не конфликтуют. Можно их закомментировать, это никак не скажется на работе библиотеки.
2. Представленный механизм - не более чем удобство и при хорошо отлаженном коде библиотеки проблем не вызывает. В конце концов никто не мешает те-же самые действия проделать так:
или так:
Оба подхода предназначены для сокращения времени кодирования. Это важно во время робототехнических соревнований.
1. Про набор переменных в uev3. Фактически, это костыль, который позволяет не объявлять переменные, если очень торопишься. Если не торопишься - просто его не используешь. Все эти переменные в своем пространстве имен, библиотекой никак не используются, ни с чем не пересекаются и не конфликтуют. Можно их закомментировать, это никак не скажется на работе библиотеки.
2. Представленный механизм - не более чем удобство и при хорошо отлаженном коде библиотеки проблем не вызывает. В конце концов никто не мешает те-же самые действия проделать так:
Код: Выделить всё
ev3screen.print(10,20,'Привет!!!');
ev3screen.fontBig();
ev3screen.print(10,40,'Привет!!!');
ev3screen.fontRotate(-30);
ev3screen.fontStd;
ev3screen.print(10,60,'Поворот -30');
ev3screen.show;
или так:
Код: Выделить всё
with ev3screen do begin
print(10,20,'Привет!!!');
fontBig();
print(10,40,'Привет!!!');
fontRotate(-30);
fontStd;
print(10,60,'Поворот -30');
show;
end;