重构 Ruby CLI 程序

Refactor the Ruby CLI program

我是 Ruby 的编程新手。

  1. 如何使输出显示收入和损益?
  2. 如何重构以下代码以使其看起来更整洁?我知道这是错误的,但我不知道如何将我的 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 使意图明确。