重构 Ruby CLI 程序
Refactor the Ruby CLI program
我是 Ruby 的编程新手。
- 如何使输出显示收入和损益?
- 如何重构以下代码以使其看起来更整洁?我知道这是错误的,但我不知道如何将我的
if profit
从初始化方法中取出。
class Theater
attr_accessor :ticket_price, :number_of_attendees, :revenue, :cost
def initialize
puts "What is your selling price of the ticket?"
@ticket_price = gets.chomp.to_i
puts "How many audience are there?"
@number_of_attendees = gets.chomp.to_i
@revenue = (@number_of_attendees * @ticket_price)
@cost = (@number_of_attendees * 3) + 180
@profit = (@revenue - @cost)
if @profit > 0
puts "Profit made: $#{@profit}"
else
puts "Loss incurred: $#{@profit.abs}"
end
end
end
theater = Theater.new
# theater.profit
# puts "Revenue for the theater is RM#{theater.revenue}."
# I hope to put my Profit/Loss here
#
# puts theater.revenue
谢谢大家。
不要使用用户的输入来初始化对象,让您的对象接受所需的值。创建一个方法来读取所需的输入,然后 return 你是新的 Theater
。最后将 if 放在单独的方法中,如 #report_profit
.
记住构造函数用于设置对象的初始状态,确保它处于有效状态。构造函数不应有副作用(在您的系统 input/output 中)。这是所有编程语言都需要注意的事情,而不仅仅是 ruby.
试试这个:
class Theatre
COST = { running: 3, fixed: 180 }
attr_accessor :number_of_audience, :ticket_price
def revenue
@number_of_audience * @ticket_price
end
def total_cost
COST[:fixed] + (@number_of_audience * COST[:running])
end
def net
revenue - total_cost
end
def profit?
net > 0
end
end
class TheatreCLI
def initialize
@theatre = Theatre.new
end
def seek_number_of_attendes
print 'Number of audience: '
@theatre.number_of_audience = gets.chomp.to_i
end
def seek_ticket_price
print 'Ticket price: '
@theatre.ticket_price = gets.chomp.to_i
end
def print_revenue
puts "Revenue for the theatre is RM #{@theatre.revenue}."
end
def print_profit
message_prefix = @theatre.profit? ? 'Profit made' : 'Loss incurred'
puts "#{message_prefix} #{@theatre.net.abs}."
end
def self.run
TheatreCLI.new.instance_eval do
seek_ticket_price
seek_number_of_attendes
print_revenue
print_profit
end
end
end
TheatreCLI.run
备注:
- 切勿将构造函数(
initialize
方法)用于初始设置以外的任何用途。
- 尽量将所有方法保持在 5 行以内。
- 始终尽量让每个 class 处理单一职责;例如,剧院 class 不需要关心打印和格式化输出。
- 尝试提取所有硬编码值;例如,查看
COST
散列。
- 使用与域一致的 apt 变量。例如:
net
而不是 profit
使意图明确。
我是 Ruby 的编程新手。
- 如何使输出显示收入和损益?
- 如何重构以下代码以使其看起来更整洁?我知道这是错误的,但我不知道如何将我的
if profit
从初始化方法中取出。
class Theater
attr_accessor :ticket_price, :number_of_attendees, :revenue, :cost
def initialize
puts "What is your selling price of the ticket?"
@ticket_price = gets.chomp.to_i
puts "How many audience are there?"
@number_of_attendees = gets.chomp.to_i
@revenue = (@number_of_attendees * @ticket_price)
@cost = (@number_of_attendees * 3) + 180
@profit = (@revenue - @cost)
if @profit > 0
puts "Profit made: $#{@profit}"
else
puts "Loss incurred: $#{@profit.abs}"
end
end
end
theater = Theater.new
# theater.profit
# puts "Revenue for the theater is RM#{theater.revenue}."
# I hope to put my Profit/Loss here
#
# puts theater.revenue
谢谢大家。
不要使用用户的输入来初始化对象,让您的对象接受所需的值。创建一个方法来读取所需的输入,然后 return 你是新的 Theater
。最后将 if 放在单独的方法中,如 #report_profit
.
记住构造函数用于设置对象的初始状态,确保它处于有效状态。构造函数不应有副作用(在您的系统 input/output 中)。这是所有编程语言都需要注意的事情,而不仅仅是 ruby.
试试这个:
class Theatre
COST = { running: 3, fixed: 180 }
attr_accessor :number_of_audience, :ticket_price
def revenue
@number_of_audience * @ticket_price
end
def total_cost
COST[:fixed] + (@number_of_audience * COST[:running])
end
def net
revenue - total_cost
end
def profit?
net > 0
end
end
class TheatreCLI
def initialize
@theatre = Theatre.new
end
def seek_number_of_attendes
print 'Number of audience: '
@theatre.number_of_audience = gets.chomp.to_i
end
def seek_ticket_price
print 'Ticket price: '
@theatre.ticket_price = gets.chomp.to_i
end
def print_revenue
puts "Revenue for the theatre is RM #{@theatre.revenue}."
end
def print_profit
message_prefix = @theatre.profit? ? 'Profit made' : 'Loss incurred'
puts "#{message_prefix} #{@theatre.net.abs}."
end
def self.run
TheatreCLI.new.instance_eval do
seek_ticket_price
seek_number_of_attendes
print_revenue
print_profit
end
end
end
TheatreCLI.run
备注:
- 切勿将构造函数(
initialize
方法)用于初始设置以外的任何用途。 - 尽量将所有方法保持在 5 行以内。
- 始终尽量让每个 class 处理单一职责;例如,剧院 class 不需要关心打印和格式化输出。
- 尝试提取所有硬编码值;例如,查看
COST
散列。 - 使用与域一致的 apt 变量。例如:
net
而不是profit
使意图明确。