Métodos privados
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 17 de 57.
Encapsulamento significa que um objeto oculta como funciona e oferece um pequeno conjunto de métodos públicos. Os métodos são públicos por padrão. Todo método definido depois da palavra private no corpo de uma classe é privado: os próprios métodos do objeto podem chamá-lo, mas o código externo não pode:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def total
subtotal + shipping
end
private
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
end
order = Order.new(10, 3)
puts order.total
begin
order.subtotal
rescue NoMethodError => e
puts e.message
endSaída:
35
private method `subtotal' called for an instance of OrderDentro da classe, um método privado é chamado sem um receptor ou com self.. Chamá-lo em outro objeto, mesmo que seja da mesma classe, é recusado:
class Coin
def initialize(cents)
@cents = cents
end
def describe
"#{self.label} / #{label}"
end
def same_as?(other)
other.label == label
end
private
def label
"#{@cents}c"
end
end
a = Coin.new(5)
puts a.describe
begin
a.same_as?(Coin.new(5))
rescue NoMethodError => e
puts e.message
endSaída:
5c / 5c
private method `label' called for an instance of Coinprivate também pode receber um nome de método, e def retorna o nome do método, portanto private def helper torna um único método privado exatamente onde ele é definido. Os métodos acima e ao redor dele permanecem públicos:
class Greeter
def greet(name)
"#{salutation}, #{name}!"
end
private def salutation
"Hello"
end
def wave
"*waves*"
end
end
g = Greeter.new
puts g.greet("Ada")
puts g.wave
p Greeter.private_instance_methods(false)Saída:
Hello, Ada!
*waves*
[:salutation]Mantenha os métodos auxiliares privados. Os métodos públicos são a promessa que uma classe faz ao restante do programa; os privados podem ser renomeados ou removidos posteriormente sem interromper nenhum chamador:
class Invoice
def total # public: os chamadores dependem disso
net + tax
end
private # livre para alterar depois
def net
...
end
def tax
...
end
endDesafio
FácilConclua a classe Order. Seu único método público além de initialize é receipt, que retorna 3 x 12.50 = 37.50, tax 7.50, total 45.00. Os métodos privados subtotal (preço vezes quantidade), tax (20% do subtotal) e total calculam os números.
O código fornecido lê os pedidos em linhas no formato quantity price e imprime cada recibo. Em seguida, tenta chamar tax de fora e imprime tax is private quando Ruby recusa.
Seu código deve ser colocado em order.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'order'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
orders = input.map do |line|
quantity, price = line.split
Order.new(quantity.to_i, price.to_f)
end
orders.each { |o| puts o.receipt }
begin
orders[0].tax
puts "tax is public"
rescue NoMethodError
puts "tax is private"
end
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online