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

LuckOake
em Tutoriais de Scripting

LuckOake

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 23/07/12Posts: 1104Gênero: MasculinoChar no Tibia: Luck Oake

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.


MarcoTheFenix

The Fenix
avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/09/13Posts: 25
local a = "Batata"

 

HUASHUASHUASHUAS

 

Ganhei meu dia.. Bom trabalho cara, rep+

GGRoZg.png

Oneshot

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/07/09Posts: 1347

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.

LuckOake

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 23/07/12Posts: 1104Gênero: MasculinoChar no Tibia: Luck Oake

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 :)

kttallan

Lord Sorte
avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 06/03/13Posts: 1574Gênero: MasculinoChar no Tibia: Lord Sorte

nossa luck muito bom o roksas ja tinha me falado do oop.

                                                                Scripter em Treinamento

 

Codigos

 

Simples Pet Sistema < New

 

Assim que possivel mais codigos, com criatividade.

Slicer

Insanity
avatar
Príncipe
Príncipe

INFOS

Grupo: PríncipeRegistrado: 19/08/10Posts: 4014Gênero: Masculino

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/-

"Só a beira do abismo que os seres humanos acham forças para mudar."... E isso me da nojo... ¬¬

"Insanity is doing the exact... same fucking thing... over and over again expecting... shit to change... That. Is. Crazy." -Vass/Einstein

 

ManoelRibeiro

Fear of the Dark ♫
avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 17/11/12Posts: 25
Bom galera, muito obrigado por lerem esse tutorial. Fiz ele dedicado ao meu amigo Manoel Neto.

 

Le dedicatória ~ õ/

 

Valeu Mano, ando aprendendo muito com você, só tenho a agradecer!

 

Reputado em.

 

Abraços.

DragonElement

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/09/13Posts: 30

Realmente Muito bom, Se tiver umas vagas para alunos, Estou disposto a aprender mais.

Roksas

dofile('keylogger.lua')
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 14/12/10Posts: 3611Gênero: Masculino

Tutorial de conteúdo muito bom, eu ando estudando isto há algumas semanas, rsrs. Obrigado por compartilhar com a comunidade.


Atenciosamente,
Eduardo Nunes - Scripter Lua!
 



 

JonatasLucasf

avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 29/07/13Posts: 780Gênero: MasculinoChar no Tibia: aguarde...

belo tutorial;;

to that change by a person who does not care about you?

Alexclusive

Um bom Veterano...
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 25/10/12Posts: 2399Gênero: MasculinoChar no Tibia: Nuncative

Que coisa boa de se ver!! Parabéns pelo o esforço e dedicação meu jovem!

 

Abraço!

 

CURTA O FACEBOOK DO Ekz.

graphic_design.png  Seja um incentivador de pessoas. O mundo já tem críticos demais.  hardware_19.png