Ruby范围和指南。哪个更好?为什么?

时间:2013-06-09 19:52:21

标签: ruby scope format

我对Ruby中的范围有疑问。我将粘贴相同脚本的两个版本,两个版本都可以工作,但是一个引入了在类上面的类中工作的变量,另一个在类实例和调用之前引入了它们。我更喜欢和他们一起在课堂上写作,因为我似乎更容易跟踪课程内容,如果有的话。我不能这样做吗?

脚本A

require 'ipaddress'

puts "What class network?"
network_class = gets.chomp.to_s.downcase
puts "What is the ip?"
ip = gets.chomp.to_s.downcase
puts "How many subnets?"
subnets = gets.chomp.to_i

class TheSubNetter

  def initialize(network_class, ip, subnets)
    @network_class = network_class
    @ip = ip
    @subnets = subnets
  end

  def ip_class
    if @network_class == "c"
      IPAddress "#{@ip}/24"
    elsif @network_class == "b"
      IPAddress "#{@ip}/16"
    elsif @network_class == "a"
      IPAddress "#{@ip}/8"
    else
      "Error!"
    end
  end

  def subnet(ip)
    subnets = ip.split(@subnets)
  end

  def ranges(subnets)
    bcast = subnets.map do |i|
      i.broadcast
    end
    bcast.map do |i|
      [i.first.to_string, i.last.to_string]  
    end
  end

end

get_subd = TheSubNetter.new(network_class, ip, subnets)
address = get_subd.ip_class
subnets = get_subd.subnet(address)
ranges = get_subd.ranges(subnets)
ranges.each do |i|
  puts i[0] + "  =>  " + i[1]
end

脚本B

require 'ipaddress'

class TheSubNetter

  def initialize(network_class, ip, subnets)
    @network_class = network_class
    @ip = ip
    @subnets = subnets
  end

  def ip_class
    if @network_class == "c"
      IPAddress "#{@ip}/24"
    elsif @network_class == "b"
      IPAddress "#{@ip}/16"
    elsif @network_class == "a"
      IPAddress "#{@ip}/8"
    else
      "Error!"
    end
  end

  def subnet(ip)
    subnets = ip.split(@subnets)
  end

  def ranges(subnets)
    bcast = subnets.map do |i|
      i.broadcast
    end
    bcast.map do |i|
      [i.first.to_string, i.last.to_string]  
    end
  end

end

puts "What class network?"
network_class = gets.chomp.to_s.downcase
puts "What is the ip?"
ip = gets.chomp.to_s.downcase
puts "How many subnets?"
subnets = gets.chomp.to_i

get_subd = TheSubNetter.new(network_class, ip, subnets)
address = get_subd.ip_class
subnets = get_subd.subnet(address)
ranges = get_subd.ranges(subnets)
ranges.each do |i|
  puts i[0] + "  =>  " + i[1]
end

1 个答案:

答案 0 :(得分:0)

您希望您的代码按概念依赖性排序,我的意思是; “信息来自哪里”和“信息如何使用”。

在开发期间,类内容在概念上依赖于第一个代码块 - 该块是信息​​的来源,而类是该信息的用法。然后,第二个块的含义取决于(可能)不断变化的类 - 再次,信息的起源和使用它。因此,在块期间将类定义放在块之间是有意义的

在制作期间,第二个块的含义依赖于第一个块,而中的类完全独立于,完成:它现在是静止的 - 不变的;你知道它在做什么。因此,块需要在一起,并且类需要“在其他地方”:信息的起源,已知的转换,信息的使用。

基本上,一旦课程完成,它就是“图书馆代码”,并且去“图书馆代码”总是去的地方:看不见。顶部,底部或其他文件。