首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby作用域和指南。哪一个更好?为什么?

Ruby作用域和指南。哪一个更好?为什么?
EN

Stack Overflow用户
提问于 2013-06-10 03:52:21
回答 1查看 73关注 0票数 0

我有一个关于Ruby的作用域的问题。我将粘贴同一脚本的两个版本,两个版本都可以工作,但一个版本在类的上方引入变量,另一个版本在类实例和调用之前在类中引入变量。我更喜欢在类的上面用它们来写,因为这样对我来说似乎更容易跟踪将要进入类的内容。有什么原因我不能这样做吗?

脚本A

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-10 08:02:21

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

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

在生产期间,第二个块的含义依赖于第一个块,并且类完全独立于任何一个,正在完成:它现在是静态的-不变;你知道它在做什么。所以,块需要在一起,类需要在“别处”:信息的来源,已知的转换,信息的使用。

基本上,一旦类完成,它就是“库代码”,并且总是去“库代码”所在的地方:看不见。顶部、底部或其他文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17013548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档