Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

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:

Código:


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: Código:

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: Código:

TV = {}

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

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: Código:

Polegadas: 29

Marca: Philips

Canal: 31

Ligada: Sim

Volume: 35%

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

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: Código:

function TV:new(marca, polegadas)

		 return setmetatable({ligada = true, polegadas = polegadas, volume = 5, canal = 31, marca = marca}, { __index = self })

	 end

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

marca = "LG"

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: Código:

   function TV:new(marca, polegadas)

		 return setmetatable({lig = true, poleg = polegadas, vol = 5, cal = 31,mc = marca}, { __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: Código:

Ligar

Desligar

Mudar de Canal

Diminuir Volume

Aumentar Volume

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

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: Código:

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

	    self.canal = novocanal

	 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: Código:

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: Código:

	 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 isso%20ae.gif

Espero ter sido o mais claro possível Pega-el.gif

Creditos

Lwkass

Contato;

6yonKDJ.png god.marinii

ulXJjub.pngryzor@tibiaking.com

TaxNfhb.png

  • 3 years later...
Postado

Ajudou muito, procurei alguns tutoriais e eram muito estanhos, não eram detalhados e os exemplos não tinham relação com o outro, mas esse é perfeito

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo