Всем привет!
Пока я писал скрипт по анализу паттерна "падающая звезда", то многое накипело на душе в части самого языка программирования LUA. И в этом выпуске я хотел бы обозначить эти, на мой взгляд, недостатки. Возможно, что я не донца прочувствовал всю мощь этого языка программирования, и больше ориентируюсь на Си-подобные языки типа PHP, JavaScript, C# и пр.
Итак, поехали.
1. Отсутствие инкремента.
Во многих языках программирования, которые я встречал есть такой оператор. Пишется он так:
i++
В результате этого действия переменная увеличится на единицу. Но, в LUA почему-то такой операции нет. Если вы смотрели написанный мною код, то могли видеть такую конструкцию:
i = i +1;
Мелочь, а неприятно. Насколько я помню, операция инкремента реализована даже на языке Ассемблер - языке более низкого уровня.
2. Отсутствие команды автодобавления в массив.
Во многих языках программирования есть возможность просто дать команду - добавить новый элемент в массив, не заботясь об его индексе. Программа сама создаст новый индекс и добавит элемент в массив. Например, это может выглядеть так (на PHP):
arr[] = new_elem;
Но, в LUA так нельзя. Нужно четко прописывать индекс нового элемента. Для этого приходится создавать счетчик, значение которого увеличивать после добавления нового элемента. А при отсутствии инкремента это раздражает вдвойне.
3. Нет команды определения длины массива.
Вот вообще, на мой взгляд, простая и необходимая команда - определение количества элементов в массиве. Ну везде это есть. Тут же приходится реализовывать самому эту функцию. Вот ее код:
function give_size_array(arr) -- функция получает массив и выдает количество его элементов.
local i = 0;
for key_i, val_1 in pairs(arr) do
i = i + 1;
end
return i;
end
4. Нет команды завершения итерации цикла.
Во многих языках программирования есть такая возможность: в цикле делается проверка, и если прошла определенная проверка можно сказать программе - давай рассматривай следующий элемент. Если же проверка не прошла, то код из тела цикла продолжает выполняться. Команды называются по разному: next(), contintue()
Но в LUA такого нет. Автор этого языка программирования Роберту Иерузалимски предлагает обходить этот недостаток используя команду goto. О ней я поговорю в следующем пункте.
Почему хотелось бы видеть команду завершения очередной итерации? Это упрощает код.
Смотрите, как выглядит код без этой команды:
for i = 1, 5 do
if (perem1 == 1) then
(код при выполнении условия по переменной perem1)
else
(при невыполнении условия по переменной perem1)
if (perem2 == 1) then
(код при выполнении условия по переменной perem2)
else
(код при невыполнении условия по переменной perem2)
end
end
end
В таком хитросплетении сложно разобраться - а кода минимум.
При наличии же команды завершения итерации код бы выглядел так:
for i = 1, 5 do
if (perem1 == 1) then (завершить итерацию) end;
if (perem2 == 1) then (завершить итерацию) end;
(Код, выполняется, если perem1 не равна 1 и perem2 не равна 1).
end
Так гораздо понятнее. Гораздо проще добавить новые проверочные условия и пр.
5. Наличие команды goto
Как ни странно, недостаток языка связан не с тем, что чего-то нет. А с тем, что что-то есть. Дело в том, что в среде программистов использование этой команды считается дурным тоном. Многие языки программирования не содержат этой команды.
Суть этой команды в том, что она позволяет перепрыгивать в какую-то часть программы. Это делает программу очень сложной для восприятия.
Соответственно авторы языка программирования LUA в своей книге "Программирование на языке LUA" предлагают отсутствие команды завершения итерации купировать использованием команды goto. Примерно так:
for i = 1, 5 do
if (perem1 == 1) then (goto end_iteration) end;
if (perem2 == 1) then (goto end_iteration) end;
(Код, выполняется, если perem1 не равна 1 и perem2 не равна 1).
::end_iteration::
end
Всё это непривычно, мягко говоря. И, я ощущаю, что нагрешил, когда использую этот анахронизм.
6. Странная реализация объектно-ориентированного программирования (ООП).
Я не до конца разобрался в том как на LUA реализован ООП. Но, есть достаточно стандартные схемы такой реализации с отличиями только в деталях на разных языках программирования. Но, когда, я в книге по LUA в главе по ООП читаю, что "в LUA нет понятия класса".... я понимаю, что я что-то не понимаю. Наверное, в этом нужно хорошенько разобраться. Но, однозначно, реализация ООП в LUA очень своеобразная.
7. Отсутствие тернарного оператора.
Также во многих языках программирования существует, так называемый тернарный оператор. Это сокращенная форма записи конструкции if..else.
Выглядит так:
(условие) ? (команда, выполняется при выполнении условия) : (команда, выполняемая при несоблюдении условия)
Наличие такого оператора в языке программирования позволяет часто кратко писать код, не разворачивая полный синтаксис конструкции if...else.
На сегодня у меня все. Всем пока.
=================================
Краткое содержание данного канала.
=================================