mihacooper [МСК -2]
Мне кажется, что заиспользовав объектную абстракцию (условные классы), ты по инерции начинаешь выстраивать каноническую ООП структуру. Единственное "но", что в динамически типизируемых языках это ООП довольно условное.
Snusmumriken
Да пофигу. Если какой-то модуль не укладывается в простую функцию, и эффективнее хранить данные вместе с операциями над ними — мутится ООП, дерево абстракций (глубиной 3-5) и прочая муть. Если не хочется ООП — можно сбацать миксины или что-то такое.
Лепикоршев
Без привязки к lua - просто с одной стороны, обычный синтаксический сахар таблиц позволяет реализовать что-то способом, похожим на методы ООП. С другой ооп - это же инкапсуляция, наследование и полиморфизм + дофига менее строгих условий, вроде private, public и protected методов.
Лепикоршев
Вот и интересно, на луа что из каноничного ооп люди используют на практике, а что - академический рудимент, не имеющий применения.
Snusmumriken
Бюрократические рудименты используются там, где важна бюрократия, то есть в интырпрайзе и прочем мегапафосном софте. В норме — инкапсуляция работает через соглашение между джентльменами, и чтение документации.
Лепикоршев
О том и речь) кто какие способы реализации использует. Кому-то private нужен? Если да, то как используете? Protected? Тот же вопрос) Например, наследование кому-то хоть раз в луа пригодилось? Или, может, потребовалось настолько, что вы сами вручную его реализовывали?
Лепикоршев
нее, оно прикольно, но это же кукушечкой поехать можно отлаживая такое.
Что именно? ООП? Или его какие-то части? Или даже таблицы с методами table:function(self,...) - это плохо и некошерно?
mihacooper [МСК -2]
Ничего специфического для инкапсуляции не использую
Лепикоршев
Я наследование использую в lua
А как именно? Метатаблицы к метатаблицам?
Лепикоршев
Ничего специфического для инкапсуляции не использую
Просто данные внутри, никак не пряча?
mihacooper [МСК -2]
Snusmumriken
О том и речь) кто какие способы реализации использует. Кому-то private нужен? Если да, то как используете? Protected? Тот же вопрос) Например, наследование кому-то хоть раз в луа пригодилось? Или, может, потребовалось настолько, что вы сами вручную его реализовывали?
Private и protected — объективно особо не особо нужны, но если прям требуются — локальные переменные внутри модуля, фактически upvalue: *module.lua* local bar = 300 --< типа private local M = {} function M.foo(v) return v + bar end return M Делать прям приватные поля конкретных объектов — несколько сложнее и нужны извращения, но тоже можно теми же upvalue.
Snusmumriken
Наследование — полезное. Но только до определённой глубины, пока оно влезает в твою голову. На практике — 2-3 уровня наследования — максимум.
Lucky
Что именно? ООП? Или его какие-то части? Или даже таблицы с методами table:function(self,...) - это плохо и некошерно?
Таблицы - торт. Речь про ООП во всей его академической замороченности.
mihacooper [МСК -2]
Просто данные внутри, никак не пряча?
Не прячу. Не нужно это, если нет "типа", то все это бессмысленно)
mihacooper [МСК -2]
Эм, чего именно нет?)
Ну нет системы типов как в статических языках. Статичкой проверки интерфейсов, доступности полей, и т.п.
Snusmumriken
Private и protected — объективно особо не особо нужны, но если прям требуются — локальные переменные внутри модуля, фактически upvalue: *module.lua* local bar = 300 --< типа private local M = {} function M.foo(v) return v + bar end return M Делать прям приватные поля конкретных объектов — несколько сложнее и нужны извращения, но тоже можно теми же upvalue.
НО, никто не мешает именовать "приватные" методы и функции начиная с "_", типа function Class:new(x, y) self.x = x self.y = y -- "приватное" поле self._area = self.x * self.y end -- "приватный" метод, пользователь его видит -- но понимает что лучше не лезть руками function Class._raw_set(x, y) self.x = x self.y = y end Соглашение между джентльменами. Это работает.
Лепикоршев
Private и protected — объективно особо не особо нужны, но если прям требуются — локальные переменные внутри модуля, фактически upvalue: *module.lua* local bar = 300 --< типа private local M = {} function M.foo(v) return v + bar end return M Делать прям приватные поля конкретных объектов — несколько сложнее и нужны извращения, но тоже можно теми же upvalue.
Можно многое) но нужно ли - знают только люди, которые либо это используют на практике, либо нет. Я использовал и классы, и наследование, и управление этим зоопарком через специальные деревья. Вот и стало интересно, кто-то ещё погружался в этот вопрос? Если да, то насколько и в каких моментах?
Лепикоршев
Ну нет системы типов как в статических языках. Статичкой проверки интерфейсов, доступности полей, и т.п.
Т.е. для вас все эти "тонкости" нужны ровно настолько, насколько того требует язык, и не больше? И если интерпретатору не нужны объявления private/public, то и незачем их объявлять?))
Snusmumriken
А мне норм : )
Snusmumriken
Лепикоршев
Вот я выше ответил снусу, там мое мнение на это счёт)
Т. Е. Просто прописать, как всем командам работать с кодовой базой? Без того, чтобы прятать реализацию инкапсуляция за private/public/protected? Без перегрузок там, где можно обойтись без них? Без управления наследованием на больших объёмах объектов?
mihacooper [МСК -2]
Можно сделать как скрытую метатаблица, тогда другой джентльмен даже захочет, не залезет =) Но требовалось ли кому-то такое?
Ну вот если ты их уже используешь для наследования, например, то можно. А так это будет оверхед производительность без реального функционального выигрыша
mihacooper [МСК -2]
Метатаблицу все-таки не за бесплатно работают. Думаю Снус даже знает какие нибудь цифирьки на этот счет
Лепикоршев
А есть сравнение производительности метатаблица с обычными? Черт, это интересно ^_^
mihacooper [МСК -2]
А есть сравнение производительности метатаблица с обычными? Черт, это интересно ^_^
Думаю есть готовые. Но можно и померить побырику, это же не сложно
Лепикоршев
Думаю есть готовые. Но можно и померить побырику, это же не сложно
Например, с какой логикой измерений? Память? Скорость?
Лепикоршев
Чем вообще одна таблица с метатаблицей будет отличаться от двух метатаблиц?
Лепикоршев
Никогда не пытался просто пересчитать накладные расходы. Типа, это же базовый механизм языка, он не может стоить много
mihacooper [МСК -2]
Никогда не пытался просто пересчитать накладные расходы. Типа, это же базовый механизм языка, он не может стоить много
Ну ты представь, ты вместо одного обращение к хеш таблице делаешь как минимум два.
mihacooper [МСК -2]
Лепикоршев
Ну а две таблица перебрать - будет ли разница?
Лепикоршев
local a = setmetastable( {}, {key="value"}) local b, c = {}, {key="value"} Будет ли разница в производительности между: print( a.key) и print( b.key or c.key)?
Лепикоршев
Если нет, то метатаблица будет удобнее в организации кода, нет?
Лепикоршев
* Имел ввиду local a_ = {key="value"} a_.__index = a_ local a = setmetastable( {}, a_)
mihacooper [МСК -2]
👍
mihacooper [МСК -2]
Интересно как jit оптимизирует работу с метатаблицами
Snusmumriken
Просто удаляет нафиг все промежуточные шаги переходов, и сразу возвращает найденное.
Anonymous
@Snusmumriken вопрос, если знаешь ответ Вот тут pcall load в зашифрованном скрипте находится сверху, но когда я шифрую, то pcall load снизу. Вопрос: в чём преимущества или почему? Если нужен этот скрипт могу скинуть
Snusmumriken
Потому что это байткод. Он прямой и развёрнутый, в отличии от твоего кода. Это просто лента инструкций для виртуальной машины.
Igor
И байткод != шифрование, кстати
Igor
Байткод - это то, что создаёт виртуальная машина из кода, понятного человеку
Igor
Она его создаёт из любого скрипта, который ты передаёшь. Если скармливаешь сразу ей байткод, то этот шаг пропускается.
Igor
Это тот же самый твой код, но в виде, понятном программе. Вот, так понятнее будет.
Anonymous
Вот, тут же зашифрованный скрипт
Igor
Повторяюсь, это не шифрование
Snusmumriken
😅 можно немного развёрнутее? Не понятно что-то
Представь что тебе надо развернуть такой код в список инструкций: function foo(v) return v + 20 end function bar() print(foo(10)) end bar() Прямые инструкции будут выглядеть примерно так: *псевдобайткод* goto bar, call goto foo, call, 10 return 10 + 20 goto print, call 30 Последовательно и развёрнуто
Snusmumriken
Ну вот у тебя весь скрипт запускается в pcall — и это первое что нужно сделать виртуальной машине, запихнуть всё в pcall, поэтому оно в начале файла.
Snusmumriken
С другой стороны, это больше похоже на заголовок байткодовой фигни, типа "список имён используемых функций + метки". Надо лучше разобраться в луёвом байткоде.
Лепикоршев
Не очень понял, два разных интерпретатору сравнивают я на одной и той же задаче?
Snusmumriken
Тут разные версии луажыта, не обращай внимания, это для форумного поста.
Snusmumriken
Основное сравнение — скорость наследований разного рода с жытом и без. Жит скрадывает совершенно любую вложенностью, кстати, если трасса таки разогрелась. Он буквально удоляет промежуточные шаги, сколько бы их ни было.
Snusmumriken
Нет, будет точно такой же. Не быстрее, не медленнее, а просто такой же.
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
@Snusmumriken Help me
Snusmumriken
No
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
I want ask
Snusmumriken
Google it.
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
empty
Snusmumriken
Moar
Ivan
@Snusmumriken Help me
Have you tried to ask you quesitons on https://stackoverflow.com ?
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
Ivan
It is ok to ask even simple questions on stackoverflow.
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
print("100") How To Read 100 only ? Use String.find