Riepilogo - Paghe del personale
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 26 di 57.
Sfida
MedioCrea un sistema di gestione delle paghe con l’ereditarietà. Employee.new(name, rate) ha pay(hours) (tariffa moltiplicata per le ore, con le ore oltre le 40 pagate a 1.5 volte la tariffa) e line(hours) che restituisce Ada (employee): 800.00, composto da pay(hours) e role, dove role restituisce employee. Manager.new(name, rate, bonus) passa nome e tariffa a super, aggiunge il bonus alla retribuzione di super e ha il ruolo manager. Contractor < Employee viene pagato con la tariffa moltiplicata per le ore, senza straordinari, e ha il ruolo contractor.
Il codice fornito legge righe come employee Ada 20 40, manager Bo 30 45 500 o contractor Cy 50 50 (nome, tariffa, ore e un bonus per i manager) e stampa line(hours) per ciascuna, poi staff: 3, managers: 1, employees: 3 (entrambi conteggiati con is_a?, quindi anche i manager e i contractor sono dipendenti) e la retribuzione totale.
Il tuo codice va inserito in employee.rb, manager.rb e contractor.rb. main.rb contiene il codice fornito per l’input/output e non può essere modificato.
Provalo tu
require_relative 'employee'
require_relative 'manager'
require_relative 'contractor'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
staff = input.map do |line|
kind, name, rate, hours, bonus = line.split
worker = case kind
when "manager" then Manager.new(name, rate.to_f, bonus.to_f)
when "contractor" then Contractor.new(name, rate.to_f)
else Employee.new(name, rate.to_f)
end
[worker, hours.to_i]
end
staff.each { |worker, hours| puts worker.line(hours) }
managers = staff.count { |w, _| w.is_a?(Manager) }
employees = staff.count { |w, _| w.is_a?(Employee) }
puts "staff: #{staff.size}, managers: #{managers}, employees: #{employees}"
puts format("total: %.2f", staff.sum { |w, h| w.pay(h) })
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