Menu
Coddy logo textTech

Propriedades Calculadas

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 15 de 70.

Getters e setters fornecem acesso a valores armazenados, mas às vezes você precisa de dados que não existem como um campo armazenado. Eles precisam ser calculados a partir de outros atributos. Essas são chamadas de propriedades calculadas.

Considere um retângulo. Você armazena sua largura e altura, mas a área não é armazenada em nenhum lugar: ela é calculada multiplicando esses dois valores. Em vez de armazenar dados redundantes, você cria um método que calcula e retorna o resultado:

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

O método :getArea() não retorna um valor armazenado. Ele calcula a área novamente a cada vez que você o chama. Essa abordagem tem uma vantagem importante: se a largura ou a altura mudar, a área refletirá automaticamente as novas dimensões sem que você precise atualizar nada.

local box = Rectangle:new(5, 3)
print(box:getArea())  -- Saída: 15

box.width = 10
print(box:getArea())  -- Saída: 30

Propriedades calculadas mantêm seus objetos consistentes. Em vez de armazenar valores que dependem de outros campos (e correr o risco de eles ficarem desatualizados), você os calcula sob demanda. Esse padrão se aplica a qualquer dado derivado: perímetros, médias, strings formatadas ou qualquer valor que possa ser determinado a partir de atributos existentes.

challenge icon

Desafio

Fácil

Vamos criar uma classe Box que calcula seu volume sob demanda! Em vez de armazenar o volume como um campo, você criará uma propriedade calculada que o computa a partir das dimensões da caixa sempre que necessário.

Você organizará seu código em dois arquivos:

  • Box.lua: Defina sua classe Box com o padrão de protótipo. Cada caixa armazena três dimensões: width, height e depth. Inclua:
    • Um construtor :new(width, height, depth) que armazena as três dimensões
    • Um método :getVolume() que calcula e retorna o volume (largura × altura × profundidade)
    • Um método :getSurfaceArea() que calcula e retorna a área total da superfície
  • main.lua: Importe seu módulo Box, crie uma instância da caixa e demonstre como as propriedades calculadas refletem automaticamente as dimensões atuais.

A área da superfície de uma caixa é calculada como: 2 × (width×height + height×depth + width×depth)

Você receberá três entradas que representam as dimensões da caixa:

  1. Largura
  2. Altura
  3. Profundidade

No arquivo principal, crie uma caixa com as dimensões fornecidas e, em seguida, imprima duas linhas:

  1. O volume usando :getVolume()
  2. A área da superfície usando :getSurfaceArea()

Por exemplo, se as entradas forem 3, 4 e 5, a saída deverá ser:

60
94

A beleza das propriedades calculadas é que elas permanecem sempre precisas. Se você alterar posteriormente uma das dimensões da caixa, chamar :getVolume() novamente retornará automaticamente o novo valor correto: não são necessárias atualizações manuais!

Experimente você mesmo

-- Requer o módulo Box
local Box = require('Box')

-- Lê as dimensões de entrada
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())

-- TODO: Crie uma instância de box com as dimensões dadas

-- TODO: Imprima o volume usando :getVolume()

-- TODO: Imprima a área da superfície usando :getSurfaceArea()
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online