ООП и с чем его едят

Tema05

Известный
Автор темы
1,443
404
Версия MoonLoader
.026-beta
В lua как я понял нет нормального ООП. Только его подобие. Сейчас стало интересно как его конкретно можно использовать. И как организовать всё. Может кто-нибудь показать хорошие примеры или поведать о всяких приколах реализации?
 

хуега)

РП игрок
Модератор
2,566
2,262
В lua как я понял нет нормального ООП. Только его подобие. Сейчас стало интересно как его конкретно можно использовать. И как организовать всё. Может кто-нибудь показать хорошие примеры или поведать о всяких приколах реализации?
Вероятнее всего ты по-настоящему поймёшь необходимость ООП только тогда, когда тебе оно само понадобится. Перед тем, как изучать его в луа, советую хорошо разобраться в устройстве обычных таблиц, т.к. всё строится на них, после чего разберись с метатаблицами и скорее всего в итоге ты сам поймёшь, когда оно тебе нужно. Не стоит его сувать абсолютно везде, т.е. луа это не шарп, но порой его подобие очень сильно выручает. У @movebx есть несколько прикольных статей про метатаблицы и ООП, также есть @date со своей легендарной статьёй

Также советую изучить, какие принципы есть в других языках и как оно работает, имея эти и те знания, которые я описал выше, ты можешь придумать в целом, свою реализацию ООП.
В качестве примеров могу дать свои наработки, но не могу сказать, что это что-то из серии идеала
 
Последнее редактирование:
  • Нравится
Реакции: Tema05

Tema05

Известный
Автор темы
1,443
404
Вероятнее всего ты по-настоящему поймёшь необходимость ООП только тогда, когда тебе оно само понадобится. Перед тем, как изучать его в луа, советую хорошо разобраться в устройстве обычных таблиц, т.к. всё строится на них, после чего разберись с метатаблицами и скорее всего в итоге ты сам поймёшь, когда оно тебе нужно. Не стоит его сувать абсолютно везде, т.е. луа это не шарп, но порой его подобие очень сильно выручает. У @movebx есть несколько прикольных статей про метатаблицы и ООП, также есть @date со своей легендарной статьёй

Также советую изучить, какие принципы есть в других языках и как оно работает, имея эти и те знания, которые я описал выше, ты можешь придумать в целом, свою реализацию ООП.
В качестве примеров могу дать свои наработки, но не могу сказать, что это что-то из серии идеала
Я пишу на lua уже года 4. О таблицах и метатаблицах мне всё известно. Но вот почему-то у меня в голове не возникала потребность в ООП. Хотя есть и старые скрипты на 15к строк с кучей функционала. Но сейчас уже когда количество строк переваливает за тысячу руки чешутся всё структурировать.

Я об ООП задумался по одной причине. У меня сейчас достаточно блочный скрипт, в котором много разного независимого функционала. От автовводов и вспомогательных приколов до ботов и фиксов.

У каждого такого функционала есть свои переменные, часть кода должна исполняться в main, часть внутри onShowDialog, часть внутри onSendPacket, часть в бесконечном цикле. Они переплетаются только на уровне "не выполнять это пока работает то". Сейчас 2.5к строк и я уже ощущаю некий дискомфорт от того, что у меня в меня в том же калбеке onShowDialog 20 блоков от разного несвязанного друг с другом функционала. А когда я работаю с конкретным функционалом приходится скролить всё остальное.

Хочется разделить всё на блоки. Вот есть у меня авторелог. Пусть его 3 переменные, код что должен выполняться каждый кадр и 13 кусков кода для разных калбеков находится в 1 месте.

Хочу всё по красоте сделать и чтобы логику нигде не поломать. Было бы интересно посмотреть на удачные варианты реализации. С теми же калбеками. Как их можно "наследователь" и соединить все процессы в 1. Я сам посижу и выведу для себя оптимальные варианты, но всё равно интересно посмотреть как делают другие. Так сказать набраться вдохновения
 
Последнее редактирование:

wojciech?

Известный
220
132
ООП стоит использовать, когда у тебя есть однотипные структуры кода, имеющие в себе заранее известнее свойства и методы, которые ты к ним хочешь применять.

Сейчас 2.5к строк и я уже ощущаю некий дискомфорт от того то у меня в меня в том же калбеке onShowDialog 20 блоков от разного несвязанного друг с другом функционала. А когда я работаю с конкретным функционалом приходится скролить всё остальное.
В этом случае, ты можешь написать структуру, которая регистрирует события для samp.events (сделать аналог addEventHandler) и в каждом отдельном блоке подписываться на эти события, чтобы не совмещать всё в одном обработчике.
 

Tema05

Известный
Автор темы
1,443
404
ООП стоит использовать, когда у тебя есть однотипные структуры кода, имеющие в себе заранее известнее свойства и методы, которые ты к ним хочешь применять.


В этом случае, ты можешь написать структуру, которая регистрирует события для samp.events (сделать аналог addEventHandler) и в каждом отдельном блоке подписываться на эти события, чтобы не совмещать всё в одном обработчике.
Разве не наоборот лучше всё в 1 обработчике совмещать? И что делать если важна последовательность выполнения 2 разных блоков кода от разного функционала в калбеке? Или это по определению плохая практика?
 

wojciech?

Известный
220
132
Разве не наоборот лучше всё в 1 обработчике совмещать
Если это создает неудобство и код отдельных блоков не связан между собой, то почему бы и не развести их по коду.

И что делать если важна последовательность выполнения 2 разных блоков кода от разного функционала в калбеке
Под подпиской я понимал, что ты создаешь одно событие samp.events и при его вызове перебираешь таблицу с обработчиками, поочередно вызывая их. Собственно расположением обработчиков в таблице ты можешь задать нужную тебе последовательность.
 

movebx

Известный
54
157
В lua как я понял нет нормального ООП. Только его подобие. Сейчас стало интересно как его конкретно можно использовать. И как организовать всё. Может кто-нибудь показать хорошие примеры или поведать о всяких приколах реализации?
В луа есть все 3 парадигмы ООП, но, зачастую, используется только наследование и инкапсуляция ( я, например, использую ее неявно, просто добавляя два андерскора к названию филда )

Что насчет того, как это использовать - тут ты уже должен понять сугубо сам, но дам пример:
Использовать ООП нужно тогда, когда у тебя огромная куча говна из одинаковых переменных.
Допустим у тя есть какой то player, в котором есть какое-то айди, хпшка, броня, стамина и т.д. и т.п. Но, если мы будем брать именно игру в мультиплеере, то игроков же несколько, и будет немного неразумно хранить это все в одной большой таблице players. Проще сделать так:
Lua:
local player = { } do
    player.new = function( self, id, health, armor, stamina )
        local player = { }
            player.id = id
            player.health = health
            player.armor = armor
            player.stamina = stamind
            
        return setmetatable( player, {
            __index = self
        } )
    end

    player.get_id = function( self )
        return self.id
    end

    --И типа того, продолжаешь так же

    setmetatable( player, {
        __call = player.new
    } )
end
И теперь, условно, когда создается новый игрок, ты можешь не пушить таблицу со всеми филдами в другую таблицу и не ебаться с кучей вложенных циклов.

Но есть моментик, что player - это объект, у него должны быть свойства, характерные нативному объекту в каком-то движке, условно какой то там class_name.
И этот момент ты можешь унаследовать, создав класс entity по такому же шаблону и вместо
return setmetatable( player, {
__index = self
} )
сделать
return setmetatable( player, {
__index = entity
} )

и тогда ты можешь обращаться к player как к нативному объкту. Как то так.

Я упростил все, что только можно, но опять же, понять концепцию ООП тебе придется только тогда, когда она тебе действительно понадобится. Любишь жрать говно и писать говнокод - не лезь в ооп, сидите в процедурке