Ir para conteúdo

O melhor tutorial de Programação Orientada a Objetos em Lua (Em português)


LuckOake

Posts Recomendados


Introdução ao OOP (Object-Oriented Programming)




"A orientação a objetos é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos."


Traduzindo, cada coisa que está presente em um programa é considerado um objeto. Exemplo disso são os jogos. Os personagens são objetos, podendo ser da classe NPC, Character, Monster...


Mas o que é classe e objeto?


- Definições


Existem algumas definições essenciais para entender a orientação a objetos. As principais são classe, objeto, método e atributo.


Classe: Podemos dizer que classes são grupos com características inicialmente iguais. Exemplo, na vida real, temos as classes "Humano", "Pássaro", "Inseto", etc. Cada classe tem seus membros, que são os objetos, suas características, que são os atributos, e suas ações, que são os métodos.

Objeto: Cada membro das classes é chamado de objeto, por exemplo, na classe "Humano" existem os objetos eu, você, seu amigo, etc. Dá pra dizer que cada pessoa é um objeto da classe "Humano".

Atributo: São as características da classe. Exemplo, na classe "Humano" temos algumas características como "Nome", "Altura" e "Idade", que variam de indivíduo para indivíduo, ou em programação, que variam de objeto para objeto.

Método: São as ações que os objetos de uma classe podem realizar. Exemplo, objetos da classe "Humano" podem realizar ações como Beber, Comer, Correr. Em programação, cada ação dessa seria uma função ligada à classe, que é executada por um objeto.


- OOP em Lua


Lua, na verdade, não é uma linguagem orientada a objetos. Porém, possui uma biblioteca com artifícios que simulam isso, que são os meta-métodos e meta-tabelas.


A principal função dessa biblioteca é a setmetatable. Ela transforma uma tabela normal em uma "tabela-objeto".


- Criando classes:


Para deixar mais claro, vamos criar uma tabela normal.



Humano = {}


OBS: Em orientação a objetos, sempre use Camel Case, que é deixar os nomes de classes e métodos iniciando com letra maiúscula. É só pra deixar o código mais bonito mesmo.


Agora que criamos a tabela Humano, vamos colocar alguns atributos (características) nela:



Humano = {
nome = "",
altura = 0,
idade = 0,
}


Agora temos uma classe Humano com os atributos nome, altura e idade. Agora vamos criar um objeto dessa classe. Para isso, vamos criar uma função que transforma essa tabela em uma meta-tabela.


Para isso, usamos a função setmetatable(table, metatable):



function Humano:New(nome, altura, idade)
local obj = {}
obj.nome = nome
obj.altura = altura
obj.idade = idade

return setmetatable(obj, {__index = self})
end


Mas o que fiz ali? Simples. Peguei os parâmetros da função, coloquei dentro da tabela obj e depois criei uma meta-tabela.


O que significa aquele self? Bom, o parâmetro self está implícito, então fica meio confuso. Você poderia fazer assim:



function Humano.New(self, nome, altura, idade)


No lugar de:



function Humano:New(nome, altura, idade)


Ou seja, aqueles : (dois pontos) são para não precisar declarar o self.


O self serve para retornar o objeto da classe. Fazendo {__index = self}, você consegue acessar os atributos direto do objeto. Você entenderá isso um pouco mais pra frente.


- Criando métodos:


Vamos agora criar métodos, ou seja, o que os objetos da classe conseguem fazer, ou melhor, as funções que eles conseguem executar.


Criaremos um método que faz a altura do objeto da classe Humano aumentar. Traduzindo, a pessoa cresce.



function Humano:Grow(amount)
amount = amount == nil and 1 or amount
self.altura = self.altura+amount
end


O que fizemos ali? Primeiro, criamos um método ligado à classe Humano, chamado Grow (crescer em inglês).

Depois, fizemos o seguinte para não dar erro: amount = amount == nil and 1 or amount. Ou seja, se o amount não for declarado, ele passa a valer 1.

Depois, pegamos o atributo altura do objeto utilizando self.altura (lembra do self?) e acrescentamos o amount. Ou seja, se amount = 3, acrescentará 3 na altura do objeto.


Simples, não?


OBS: Métodos criados ligados à uma classe só podem ser executados por objetos dessa mesma classe! Se você tem um objeto da classe "Inseto", você não pode utilizar nele os métodos da classe "Humano".


- Criando objetos


Agora que você sabe criar classes e métodos, você pode criar objetos. É super simples, só fazer assim:



hi = Humano:New("Manoel", 1.77, 16)


Pronto, agora você tem um objeto na variável hi com o nome Manoel, altura de 1.77 e 16 anos.


E como executar métodos nesse objeto? Simples também, veja:



hi:Grow(0.34)


No caso, o objeto da variável hi vai ter a altura aumentada em 0.34.


E como modificar atributos do objeto sem precisar de funções? Outra coisa muito simples:



hi.altura = 1.80


Isso fará a altura do objeto da variável hi ficar em 1.80.


- Percepções


Agora que você já sabe uma base de orientação a objetos, você perceberá que quando você usa uma função como string.lower(str), você está usando orientação a objetos, com um método da classe string.



local a = "Batata"


string.lower(a) é o mesmo que a:lower()


Por que? Porque string é uma classe, lower é um método, e o método é string:lower(). Lembra do self implícito? :)


- Final


Bom galera, muito obrigado por lerem esse tutorial. Fiz ele dedicado ao meu amigo Manoel Neto.


Utilizei como base os conhecimentos passados pelo meu mestre Oneshot.


Quaisquer dúvidas e/ou sugestões, podem postar aqui no tópico.



Proibido postar em qualquer outro fórum de Open Tibia brasileiro.


Editado por LuckOake
Link para o comentário
Compartilhar em outros sites

Bom trabalho, meu garoto.

 

Obrigado pela dedicatória, apesar que quem merece tudo é você por ter sido um pupilo excepcional e ter levado o aprendizado tão a sério, se tornando um grande scriptwriter em Lua.

 

Parabéns.

Link para o comentário
Compartilhar em outros sites

Bom trabalho, meu garoto.

 

Obrigado pela dedicatória, apesar que quem merece tudo é você por ter sido um pupilo excepcional e ter levado o aprendizado tão a sério, se tornando um grande scriptwriter em Lua.

 

Parabéns.

 

É uma honra receber um elogio seu, ó grande mestre.

 

Hihi :)

Link para o comentário
Compartilhar em outros sites

realmente otimo tutorial grande Luck cada vez aprendendo mais ^^ jaja passa da galera da 'velha guarda' ae kk'

-ta na hora de eu aprender essa bagaça \o/-

Editado por Slicer
Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
×
×
  • Criar Novo...