Перейти к содержимому
  • 0
Гость Nick_Alps

[ООП] Рационально ли я пишу?

Вопрос

Гость Nick_Alps

Решил разобраться с этим кривым трудным ооп в lua. Мне кажется что я изобретаю велосипед и это работает проще

 

user =
{
    login = nil,
    password = nil,
    register = function(self, login0, password0) -- примитивно, но работает
    self.login = login0
    self.password = password0
    end
}

users = {}
local i
for i = 1,5 do
    users[i] = user -- чувствую вот тут бред уже пишу...
    print(users[i].name) -- print что бы было видно, что прога работает.
end

for i = 1,5 do
    users[i]:register('login' .. tostring(i),'password' .. tostring(i))
    print(users[i].name)
    print(users[i].password)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Это псевдо-ООП

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

local i
for i = 1,5 do
    users[i] = user -- чувствую вот тут бред уже пишу...
    print(users[i].name) -- print что бы было видно, что прога работает.
end
У тебя будет создан массив users с пятью элементами, каждый из которых является указателем на один и тот же объект user.

Попробуй как нибудь вот так

function NewUser()
  local obj={login = '', password = ''}
  return obj
end
for i = 1,5 do
  users[i] = NewUser() -- чувствую вот тут бред уже пишу...
  print(users[i].login) -- print что бы было видно, что прога работает.
end

А чтобы такая конструкция работала

users[i]:register('login' .. tostring(i),'password' .. tostring(i))
нужно метатаблицу переопределять. Вспомню как это делать - выложу.

Да, и объявлять локальной переменную цикла не обязательно. Она и так будет локальной

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот, как то так:

local user={}       -- Описываем класс user
user.__index=user   -- это обязательно

-- Это метод класса
function user:register(login0, password0)
    self.login = login0
    self.password = password0
end

-- Это конструктор класса
function user:new()
  local obj={login = '', password = ''} -- создаем новый объект
  setmetatable(obj,self) -- наделяем его свойствами класса
  return obj -- возвращаем полученный объект
end

users={} --тут будем хранить элементы класса
for i = 1,5 do
    -- для создания элемента класса вызываем конструктор
    users[i] = user:new()  -- можно было бы совместить new и register ...
    print('<'..users[i].login..'>') -- print что бы было видно, что прога работает.
    -- вызываем метод вновь созданного объекта
    users[i]:register('login' .. i,'password' .. i)
end

-- смотрим что получилось
for i=1,5 do
    print(users[i].login,' ',users[i].password)
end
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Zer, я не по теме . сеть создал но только статическую (буду делать позже динамическую). я вот с Nick-ом тестил, хочешь тоже потестить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

максимально сжал код, правильно получилось?

local user = {login, password}

user.__index=user

function user:new(login0,password0)
    self.login = login0
    self.password = password0
    local obj={login0,password0}
    setmetatable(obj,self)
    return obj
end

users={}
for i = 1,5 do
    users[i] = user:new('login' .. i, 'password' .. i)
    print(users[i].login .. ' ' .. users[i].password)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Прошу, критикуйте, думаю что что то можно сделать получше

 

local user =
{
login,
password,
getLogin = function(self)
    return self.login
end,

getPassword = function(self)
    return self.password
end,

setPassword = function(self, password0)
    self.password = password0
end
}

user.__index=user

function user:new(login0,password0)
    self.login = login0
    self.password = password0
    local obj={login0,password0}
    setmetatable(obj,self)
    return obj
end

users={}
for i = 1,5 do
    users[i] = user:new('login' .. i, 'password' .. i)
    print(users[i].login .. ' ' .. users[i].password)
end


for i = 1,5 do
    users[1]:setPassword('kokojamba')
    print(users[i].login .. ' ' .. users[i].password)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно.

Во-первых, определение user наверху достаточно свести к {}, строчку с __index перенести внутрь new (self.__index = self), а методы, описанные в user'е, для экономии памяти лучше реализовать на нотации с двоеточием. Она работает предельно просто: вызов X:m(args) превращается в X.m(X, args)

Ну и user лучше написать с большой буквы, т. к. это класс, а из названия это не очевидно. User - гораздо лучше.

Как-то так:

function User:getPassword()
 return self.password
end
function User:setPassword(password)
 self.password = password
end

Обращаю внимание, что если методы getX и setX написаны с такой логикой, то они нафиг не нужны.

 

Вот в этой шпаргалке есть неплохой раздел по "ООП". Рекомендую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...