Ir para conteúdo
Entre para seguir isso  
Lwkass

POO em Lua

Recommended Posts

Lwkass    1
Lwkass

lua.gif

 

POO – Programação Orientada a Objeto

(em Lua)

 

Sei que tem muita gente querendo aprender ou com dúvida sobre POO, para quem programa em lua para otservers casualmente vai ser estranho e talvez até desnecessário, mas pra quem quer se tornar um futuro programador ou até mesmo acumular mais conhecimento, é mais do que necessário !

 

 

  • Porque Aprender ?

Certo, você aprende o que é POO, sabe aplicar sem dificuldades em lua, mas e ai... onde usar ? Bem, isso depende muito do que você quer, em lua, ao contrário de algumas linguagens, não é necessário saber POO para se programar, mas nada impede de você usá-lo e tornar seu código mais bonito, organizado e de fácil manutenção (Que são algumas das características da POO), resumindo, aprende quem quiser.

 

Nota Importante: A POO em lua não é realmente POO - mas, como assim ? - Lua não é naturalmente Orientada a Objetos, porque se caso fosse você já saberia. Em Lua é feita uma "simulação" usando meta tabelas - Mas, OMG, como assim ? meta tabelas ? - calma, calma, isso eu já explico vamos por partes.

 

 

  • Classe

Definição: Classe é onde fica armazenado atributos, métodos, é onde tudo acontece na Orientação a Objetos.

Pense em classe como se fosse uma receita, algo que armazena todas as informações como se fosse uma ficha técnica, trazendo mais para a realidade, pense em classe como nós, seres humanos ou um computador, uma televisão, uma cama, um instrumento musical, cada um tem suas informações próprias e ações próprias.

 

 

Exemplo:

 

Classe TV


    Informações/Atributos:
Polegadas: 29
Marca:  Philips
Canal: 31
Ligada: Sim
Volume: 35% 

    Ações/Métodos: 
Ligar
Desligar
Mudar de Canal
Diminuir Volume
Aumentar Volume

 

Entendeu ? Isso seria uma ficha técnica de alguma televisão qualquer, e quais ações essa determinada televisão possui, onde informações é a mesma coisa que atributos na POO e métodos é a mesma coisa que ações.

Agora vamos trabalhar nessa classe...

 

 

Vamos começar a escrevê-la usando Lua:

TV = {}

    function TV:new()
        return setmetatable({}, { __index = self })
    end

Nota: Explicarei com mais detalhes sobre a função setmetatable() e seus usos em outro tutorial(eu acho), por enquanto use-a dessa maneira

 

 

Agora é o momento que você olha isso e pergunta

- Mas, porque essa tabela ai no começo ? porque usar dois-pontos ? porque new ?

 

Como dito anteriormente, Lua é uma simulação de POO, ou seja, você não vai programar exatamente dessa maneira caso fosse programar em Java, C++, Ruby ou qualquer outra linguagem OO.

 

Mas explicando o porque de cada um:

TV = {}

Basicamente, essa tabela é onde irá ficar armazenada as informações da classe.

 

function TV:new()
        return setmetatable({}, { __index = self })
    end

Entenda TV:new como sendo Classe:método, onde TV é a nossa classe e new é o nosso método e nosso construtor, esse método é o primeiro a ser chamado, é ele que vai construir nossa classe (por isso que se chama construtor).

 

 

  • Atributo

Atributo são as características, as informações de um determinado objeto (não pense em objeto como um computador ou uma mesa, mas sim como qualquer coisa, até seres vivos).

 

Exemplo:

 

Como dito anteriormente, nossa classe possui esses atributos:

 


Polegadas: 29
Marca: Philips
Canal: 31
Ligada: Sim
Volume: 35%

 

 

Agora vamos tentar passá-las a lua e adicionar na classe:

 

TV = {}

    function TV:new(marca, polegadas)
        return setmetatable({ ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self })
    end

Certo, definimos os atributos e quais que queremos que possam ser modificados de começo, agora mais uma explicação aprofundada parte-a-parte:

 

function TV:new([color=blue]marca[/color], [color=teal]polegadas[/color])
        return setmetatable({ligada = true, polegadas = [color=teal]polegadas[/color], volume = 5, canal = 31, marca = [color=blue]marca[/color]}, { __index = self })
    end

Onde está colorido possui o mesmo valor, ou seja, se você definir posteriormente marca como LG, ficará:

marca = [color=blue]"LG"[/color]

Para adicionar mais atributos, é só adicionar mais um parâmetro na função (se necessário) e adicionar mais um item na tabela, sendo que o "nome" pode ser qualquer coisa, não precisa necessariamente ser o mesmo nome do atributo, por exemplo, poderia ser assim ao invés do exemplo acima:

    function TV:new([color=blue]marca[/color], [color=teal]polegadas[/color])
        return setmetatable({lig = true, poleg = [color=teal]polegadas[/color], vol = 5, cal = 31,mc = [color=blue]marca[/color]}, { __index = self })
    end

Única coisa que mudaria, seria que ao invés de ser "marca" seria "mc".

 

Lembrando que todos os atributos poderão ser chamados depois.

 

  • Métodos

Métodos são as ações (como dito anteriormente) que podem ser feitas pelo objeto e também são os métodos que automatizam algumas coisas na classe.

 

Exemplo:

 

Como dito anteriormente, a classe possui esses métodos:

Ligar
Desligar
Mudar de Canal
Diminuir Volume
Aumentar Volume

Vamos adicioná-las na classe sem colocar instrução dentro por enquanto:

 

    TV = {} 

    function TV:new(marca, polegadas) 
        return setmetatable({ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self }) 
    end 

    function TV:Ligar() -- Ligar a TV 
    end 

    function TV:Desligar() -- Desligar a TV 
    end 

    function TV:setCanal() -- Mudar de Canal 
    end 

    function TV:setVolume() -- Definir Volume 
    end

Porque eu coloquei apenas “setVolume()” ao invés de 2 métodos, um para aumentar e outro para abaixar ?

Deixando dessa maneira você pode fazer as duas coisas em um método só !

 

Agora como cada um é um método da classe, é só adicionar a instrução de cada um:

Método TV:setCanal() por exemplo:

 

    function TV:setCanal(novocanal) -- Mudar de Canal 
       [color=darkorange]self[/color].[color=darkgreen]canal[/color] [color=darkred]=[/color] [color=purple]novocanal [/color]
    end

TV:setCanal é uma função como qualquer outra, ele tem que simplesmente trocar o canal da televisão.

Mas ai você pergunta – e esse "self" ai ? Da onde ele vem ? O que ele é ? - Simples, self se refere a nossa classe (self traduzido, seria algo como "eu", "próprio"), o self seria uma forma de se referir a classe, acessar os atributos e usá-los.

Lembre-se, como o self se refere a própria classe, você só pode utilizá-lo em métodos de classe !

 

Simplificando, usando palavras e cores, o que a função vai fazer é acessar o atributo canal da classe e definir seu valor para o mesmo valor de novocanal

 

E Você pode usar o self tanto para acessar atributos quanto para criar novos a partir de métodos, Simples não ?

 

 

Depois de definir a instrução de todos os métodos, a classe ficou dessa maneira:


TV = {}

function TV:new(marca, polegadas)
return setmetatable({ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self })
end

function TV:Ligar() -- Ligar a TV
self.ligada = true
end

function TV:Desligar() -- Desligar a TV
self.ligada = false
end

function TV:setCanal(novocanal) -- Mudar de Canal
self.canal = novocanal
end

function TV:setVolume(novovolume) -- Definir Volume
self.volume = novovolume
end

Agora vamos testá-la !

 

 

Essa parte fica a seu critério de como fazer o teste, a classe pode estar tanto no mesmo arquivo quanto em outro (ai é necessário chamar usando a função dofile())

O teste é simples, vai ser criado uma nova TV e definida a uma variavel, em seguida será exibido as informações da TV depois modificadas e exibidas novamente:

 


TV = {}

function TV:new(marca, polegadas)
return setmetatable({ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self })
end

function TV:Ligar() -- Ligar a TV
self.ligada = true
end

function TV:Desligar() -- Desligar a TV
self.ligada = false
end

function TV:setCanal(novocanal) -- Mudar de Canal
self.canal = novocanal
end

function TV:setVolume(novovolume) -- Definir Volume
self.volume = novovolume
end

----

minhatv = TV:new("LG", 29) -- Aqui eu defino que minha marca é LG e polegadas é 29
print("Minha Televisão é da marca " .. minhatv.marca .. ", possui " .. minhatv.polegadas .. " polegadas, está no canal " .. minhatv.canal .. " e volume " .. minhatv.volume .. "%")
minhatv:setCanal(73) -- Mudo o canal para 73
minhatv:setVolume(40) -- Mudo o volume para 40
print("Agora minha TV está no canal " .. minhatv.canal .. " e o volume está em " .. minhatv.volume .. "%")
minhatv:setVolume(10) -- Mudo o volume para 10
print("Agora minha TV está no canal " .. minhatv.canal .. " e o volume está em " .. minhatv.volume .. "%")

minhatv:Desligar() -- Desligo a tv (mesma coisa que minhatv.ligada = false)

if (not minhatv.ligada) then -- Se não estiver ligada
print("A TV foi desligada")
end

Muito simples, não ?

 

 

Qualquer dúvida ou sugestão sobre o tutorial é só dizer :issoae:

Espero ter sido o mais claro possível :pega-el:

 

Lwkass

Editado por Lwkass

Compartilhar este post


Link para o post
Socket    0
Socket

O Tutorial ficou um pouco superficial, faltou citar algumas coisas, como a syntax sugar do operador :

function TV:Ligar()

function TV.Ligar(self) -- Origem do self
TV.Ligar = function(self)

Além disso, a única coisa que acho muito importante que deveria ser citada, é que como em Lua não existe POO, não há diferença entre uma "classe" e um "objeto", tornando isso possível:

TV = {} 

function TV:new(marca, polegadas) 
   return setmetatable({ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self }) 
end 

function TV:Ligar() -- Ligar a TV 
   self.ligada = true 
end 

function TV:Desligar() -- Desligar a TV 
   self.ligada = false     
end 

function TV:setCanal(novocanal) -- Mudar de Canal 
   self.canal = novocanal 
end 

function TV:setVolume(novovolume) -- Definir Volume 
   self.volume = novovolume 
end 

LG = TV:new("LG", 29)    -- Classe
CCE = TV:new("CCE", 29)    -- Classe

tv = LG:new()
print(tv.marca, tv.polegadas)

Atenciosamente, Socket.

Editado por Socket

Compartilhar este post


Link para o post
dalvorsn    46
dalvorsn

Eu achei simplesmente perfeito o tutorial, explico de maneira simples e objetiva, qualquer iniciante lendo esse tutorial compreende e aprende a usar POO facilmente.

Meus parabéns, muito merecidos por sinal!

Rep+

 

#Socket

Já que o tutorial é superficial porque não faz um aprofundado?

Até então não tinha visto um tutorial tão bom quanto o do Lwkass, claro e objetivo, como todo bom tutorial.

 

Atenciosamente, dalvorsn.

Compartilhar este post


Link para o post
Lwkass    1
Lwkass

@Socket

Não, de boa cara, tudo bem se você já manja de POO e vem criticar dizendo que sabe o que é syntax sugar ou que não há diferenças entre classe e objeto e que ta faltando isso no tópico...

O alvo do tópico é para ser desde novatos, quem nem sabe direito programar, agora vc quer que eu despeje coisas que ninguem usa, que são coisas inutilizadas, é bom saber oque é syntax sugar, mas você acha que eu precisava falar ?

se fosse assim eu teria que falar do setmetatable, meta métodos, userdata e o escambal a quatro.

 

Agora você vem me dizer que ta superficial ?

Firmeza, então eu vou ter que ensinar herança, polimorfismo, sobrecarga, esse e mais outros conceitos de POO, ou seja tudo que lua não tem ou simula que tem, ah cara, faça me o favor, vai fazer algo da vida

 

Se tu é o "aluno prodigio" e é o melhor dos melhores, desculpa ai então, pelo menos eu fiz algo que você não fez

Qualquer coisa, apaga meu tutorial e faz um seu, já que o meu ta superficial, mostre-me oque é um tutorial não surperfical

 

Não to afim de ser hater, mas cara já não é a primeira vez que você ataca um tópico com desmotivação, querendo apontar coisas que muitas vezes nem são necessárias, criticar é uma coisa, agora dizer q ta superficial é outra conversa, acho que o trabalho do moderador é motivar, ajudar a seção a se levantar, coisa que a seção de scripting ta precisando

 

Se ofendeu, pouco me importo, é a minha opinião fikdik

---

Editado por Lwkass

Compartilhar este post


Link para o post
iuniX    4
iuniX

@Topic: É, falto algumas coisas citadas a cima. Porem está bem objetivo e de fácil entendimento. Parabéns Lwkass.

 

@Off Topic: Grande Socket e sua incrível habilidade de ser o mais filodaputa o possível. Parabéns aprendiz do Conde2.

Compartilhar este post


Link para o post
Dreus Exozol    0
Dreus Exozol

Lwkass parabéns pelo tutorial, eu o achei muito interessante e bem explicado de forma que qualquer iniciante ou profissional pode tirar algo de bom dele, entretanto o que mais me surpreendeu em seu tópico foi a formatação, você fez questão de além de explicar direito usar a formatação do tópico para apontar as coisas de formas que até um leigo compreenderia.

 

Concluindo, além de contribuir com a OTBR com um ÓTIMO tutorial, você ainda por cima soube utilizar os bbcodes de forma que ninguém pudesse reclamar da formatação.

 

Bom, depois de ler esse tutorial e de ter falado tudo isso, só me resta lhe agradecer pelo tutorial e a minha forma de agradecer será dando Rep+, espero que aprecie :).

 

 

Atenciosamente.

Dreus Exozol

Compartilhar este post


Link para o post
Gpwjhlkdcf    21
Gpwjhlkdcf

Então ao invés de incentivar a postagem de tutoriais, os moderadores preferem mostrar que entendem do assunto ao fuçar por meia hora no tópico que algumas pessoas tem o trabalho de fazer, só pra dizer que está superficial e tinha que ser melhor. Se não queria que postassem um tutorial 'incompleto', que tivesse postado antes. O Lwkass tomou a iniciativa e fez o que você não se deu ao trabalho de fazer.

 

Seu senso de superiorismo, socket, já me cansou a muito tempo, assim como o do conde2. Seria bom se vocês largassem um pouco essa arrogância e entendessem que vocês já foram tão novatos quanto quem está começando agora com programação, e que seu trabalho não é se mostrar superior a eles e a qualquer um que cruze seus caminhos.

 

Também seria bom que vocês entendessem que nenhuma obra é livre de erros, e se você acha que o tutorial do Lwkass tem erros, podia dar uma olhada pro seu próprio post. O nome correto é syntactic sugar, e como Lua não tem OO nativo, já está errado dizer que não há diferença entre objetos e classes, já que os mesmos também não existem.

Compartilhar este post


Link para o post
Mock    32
Mock

Essas 2 linhas aqui:

function TV.Ligar(self) -- Origem do self

TV.Ligar = function(self)

Em um tutorial como esse seria a mesma coisa de colocar

if 1 == 1 then

if not 1 ~= 1 then

em um tutorial de string cara ¬¬'

isolando a primeira claro... você apenas esta queendo incluir um pouco de sintaxe basica em um tutorial de POO PO.

Colocar

Variavel = função
não é syntax sugar.

 

A proposito, esta sendo hipocrita. Aquela vez que você me deu uma bronca por falar "arquivo base" ao inves de "modulo base" para o arquivo que iria carregar as outras extensoes da lib luasql, a bronca foi por usar termos errados. Deacordo com você os termos devem ser usado igualmente aos pre definidos. Então se no site do lua diz que em lua isso é POO entao vocÊ deveria ser o utimo a desafirmar isso depois do que vc falou :D

Compartilhar este post


Link para o post
Kydrai    0
Kydrai

O tutorial ficou muito bom, acho que ta bem prático pra quem quer aprender.

Compartilhar este post


Link para o post
Conde2    0
Conde2

Isso era realmente útil quando se tinha a possibilidade de states juntos.

Agora perdeu um pouco da utilidade, mas mesmo assim dependendo de suas habilidades o uso do mesmo pode ser de grande uso.

 

O Tutorial ficou um pouco superficial, faltou citar algumas coisas, como a syntax sugar do operador :
É um dos melhores tutorial que tem sobre esse assunto se não o melhor, como você fala isso FACEPALM

 

 

Sobre os comentários do Iunix e do Skyen melhor não responder, mesmo porque os dois não me conhecem atualmente tão bem para fazer esses tipos de comentários.

Editado por Conde2

Compartilhar este post


Link para o post
Zirun    11
Zirun

@Socket

Você tem o pleno direito de dizer que um tópico está superficial, afinal você é o moderador da área e está é sua função, mas tenho que dizer que você não teve bom senso, faltou valorizar o trabalho do Lucas, essa confusão toda poderia ter sido evitada se você tivesse decido do pedestal por um minuto e escrito uma frase mais humana levando em conta os sentimentos de quem fez o trabalho.

 

Você poderia simplesmente ter falado:

O tutorial ficou bom, porem faltou citar algumas coisas, como a syntax sugar do operador :

 

Do mais, meu bot do irc tem funcionalidade .-.

Att.

Zirun

Compartilhar este post


Link para o post
Mock    32
Mock
Isso era realmente útil quando se tinha a possibilidade de states juntos.

Agora perdeu um pouco da utilidade, mas mesmo assim dependendo de suas habilidades o uso do mesmo pode ser de grande uso.

 

É um dos melhores tutorial que tem sobre esse assunto se não o melhor, como você fala isso FACEPALM

 

 

Sobre os comentários do Iunix e do Skyen melhor não responder, mesmo porque os dois não me conhecem atualmente tão bem para fazer esses tipos de comentários.

 

Bem ele disse tutorial POO em lua, ele n especificou pra otserv não é? :P

mais é verdade n adianta tanto em toserv n... mas ainda sim é bom e ajuda³

Compartilhar este post


Link para o post
Zeephiroth    42
Zeephiroth

@Lwkass

Bom tutorial, até eu que sou terrível pra scripting consegui entender algumas coisas. Parabéns pela organização do tópico, e obrigado pela contribuição! :)

 

@Socket

Humildade, bom senso, incentivo. Três coisas que se tornam ainda mais indispensáveis quando o indivíduo é moderador, não ví nenhuma delas aí.

Compartilhar este post


Link para o post
dalvorsn    46
dalvorsn

Por favor alguém fixe este tópico, não quero ver ele cair no esquecimento, está muito bom (Y)

Compartilhar este post


Link para o post
Socket    0
Socket

Depois dessa, me retiro da OTBR.

Zeephiroth, falta é interpretação de texto. A minha intenção, foi unica e simplesmente complementar o tutorial do Lwkass, em nenhum momento eu quis desvalorizar o trabalho dele, nem "me achar" superior como muitos disseram.

 

Eu disse superficial, porquê "POO em Lua", é simplesmente a utilização de uma ferramente que Lua nos proporciona, Metatabelas. O tutorial apenas explica o uso de um metamétodo, o __index.

Para que realmente fosse totalmente completo, sem faltar nada, poderia explicar, mesmo que superficialmente, a função de todos os outros metamétodos.

 

Mock, não, não é simplesmente isso, uma pessoa que realmente busca conhecimento, gostaria de saber de onde vêm essa variável, e não apenas decorar que ela existe, e saber usá-la.

E sim, syntactic sugar é simplesmente isso, pode ver que no próprio manual Lua, eles dão uma espécie de "passo a passo" como eu fiz:

O comando

function f () corpo end

é traduzido para

f = function () corpo end

 

O comando

function t.a.b.c.f () corpo end

é traduzido para

t.a.b.c.f = function () corpo end

 

O comando

local function f () corpo end

é traduzido para

local f; f = function () corpo end

e não para

local f = function () corpo end

Skyen Hasus, podia dar uma olhada no que você ensina às pessoas, porquê essa "curiosidade" foi você que me mostrou, nessas mesmas palavras, e novamente, faltou interpretação de texto, pois eu usei aspas para me referir, e também disse que não existe POO nativo em Lua.

 

Não vejo qual o problema de dar a minha opinião, o problema da sociedade é não saber lidar com a sinceridade, não é mesmo iunix? Certo dia nosso amado usuário iunix, me perguntou por msn se tal script que ele havia feito, merecia ser "exclusivo", após eu falar que na minha opinião, não, ele não merecia, o iunix ficou bravo comigo, e falou que eu estava desmerecendo seu trabalho.

 

Novamente digo, que falta interpretação de texto e bom senso nesse fórum, em nenhum momento eu desmereci o trabalho do Lwkass, apenas disse que ele não estava completo, agora, vocês querem que todo tutorial postado seja elogiado. Acordem para a vida.

 

Fica aqui meu último recado para o fórum, Adeus.

Compartilhar este post


Link para o post
Mock    32
Mock
Mock, não, não é simplesmente isso, uma pessoa que realmente busca conhecimento, gostaria de saber de onde vêm essa variável, e não apenas decorar que ela existe, e saber usá-la.

E sim, syntactic sugar é simplesmente isso, pode ver que no próprio manual Lua, eles dão uma espécie de "passo a passo" como eu fiz:

 

Eu olhei e nao vi nada falando que syntax sugar era formas diferentes de se declarar uma variavel...

Compartilhar este post


Link para o post
Eventide    7
Eventide

apenas pela forma como você disse dá pra notar que não foi para complementar o tópico e sim para se superiorizar diante dele, tudo pela sua falta de humildade ao escrever:

O Tutorial ficou um pouco superficial

 

primeiro que, para um scripter de otserv, que nunca teve contato com nenhuma outra linguagem, e em maioria dos casos nem ao menos com outras aplicações de Lua, o conceito de metatables, mesmo que abordado de forma simples apenas para uso de classes, não é nada superficial...

Compartilhar este post


Link para o post
Bajt    0
Bajt

Nós sabemos que você é bom nessa área, mas não precisa jogar na cara dos outros que é superior. Não teve nenhum momento que você falou que o tutorial estava bom, o que realmente estava, eu que sou iniciante (sei nem se posso dizer isso) entendi perfeitamente o tutorial dele. Pelo que eu saiba uma das principais funções de um moderador da OTBr é incentivar o trabalho dos outros, o tutorial dos outros, para que eles continuem postando e assim movimentando mais a função. Mas não, por mais excelente que o tutorial esteja você sempre tem que por um defeito para se mostrar superior e entende mais do assunto do que tal pessoa que postou o tutorial.

O membro postou com a maior boa vontade o tutorial, esperando no mínimo um reconhecimento pelo trabalho que ele teve, para chegar um mod e não falar nem que ficou bom. E essa não é a primeira vez.

Eu esperava mais de um moderador de um dos maiores fóruns de OTServer do brasil, ou o melhor fórum, pois se continuar com moderação do seu nível (não de conhecimento da área, pois você ja jogou na cara de vários que sabe), mas sim de humildade e reconhecimento está longe de ser um dos.

 

@Lwkass

Ótimo tutorial, parabéns cara.

 

 

Bajt.

Compartilhar este post


Link para o post
Majesty    1755
Majesty

Obrigado pela contribuição, é um ótimo tutorial para quem não entende muito do assunto na área e a pedidos o tópico foi fixado. E peço a alguns senhores que não continuem a discussão que não esteja ligada ao assunto do tópico.

 

(Y).

Compartilhar este post


Link para o post
LsM    2
LsM

Cara, eu estava estudando(ralando para estudar) POO em lua um tempo atrás, mas seu tutorial foi perfeito, me tirou todas as duvidas. Vale ressaltar também, o uso da manipulação de metatables. Sei que é dificil abordar tudo, mas só o que você abordou, já deu uma ajuda e tanto para quem ainda não conhecia. Parabéns Lwkass

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×