Metodi privati
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 17 di 57.
L'incapsulamento significa che un oggetto nasconde il proprio funzionamento e offre un piccolo insieme di metodi pubblici. I metodi sono pubblici per impostazione predefinita. Ogni metodo definito dopo la parola private nel corpo di una classe è privato: i metodi dell'oggetto stesso possono chiamarlo, il codice esterno no:
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
endOutput:
35
private method `subtotal' called for an instance of OrderAll'interno della classe, un metodo privato viene chiamato senza un ricevitore o con self.. Chiamarlo su un altro oggetto, anche se appartiene alla stessa classe, non è consentito:
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
endOutput:
5c / 5c
private method `label' called for an instance of Coinprivate può anche ricevere il nome di un metodo, e def restituisce il nome del metodo, quindi private def helper rende privato un singolo metodo proprio nel punto in cui viene definito. I metodi precedenti e successivi restano pubblici:
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)Output:
Hello, Ada!
*waves*
[:salutation]Mantieni privati i metodi di supporto. I metodi pubblici sono la promessa che una classe fa al resto del programma; quelli privati possono essere rinominati o rimossi in seguito senza interrompere alcun chiamante:
class Invoice
def total # public: chi lo chiama fa affidamento su di esso
net + tax
end
private # libero di modificarlo in seguito
def net
...
end
def tax
...
end
endSfida
FacileCompleta la classe Order. Il suo unico metodo pubblico oltre a initialize è receipt, che restituisce 3 x 12.50 = 37.50, tax 7.50, total 45.00. I metodi privati subtotal (prezzo moltiplicato per quantità), tax (il 20% del subtotale) e total calcolano i valori.
Il codice fornito legge gli ordini da righe nel formato quantity price e stampa ogni ricevuta. Poi prova a chiamare tax dall'esterno e stampa tax is private quando Ruby rifiuta.
Il tuo codice va in order.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'order'
# Supplied input/output code: keep it as it is
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online