WEB开发网
开发学院软件开发Java 演化架构与紧急设计: 语言、表达性与设计:第 2 部... 阅读

演化架构与紧急设计: 语言、表达性与设计:第 2 部分

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: 如果您完全不愿意为适配器创建额外的类,那么应该怎么办呢?Groovy 和 Ruby 都支持开放开放类,演化架构与紧急设计: 语言、表达性与设计:第 2 部分(8),因此您可以直接在相关类中添加所需的方法,Ruby 中的方形木条和圆孔实现(通过 JRuby)如清单 11 所示: 清单 11. Ru

如果您完全不愿意为适配器创建额外的类,那么应该怎么办呢?Groovy 和 Ruby 都支持开放开放类,因此您可以直接在相关类中添加所需的方法。Ruby 中的方形木条和圆孔实现(通过 JRuby)如清单 11 所示:


清单 11. Ruby 中的开放类适配器
class SquarePeg 
 attr_reader :width 
 
 def initialize(width) 
  @width = width 
 end 
end 
 
class SquarePeg 
 def radius 
  Math.sqrt(((@width/2) ** 2) * 2 ) 
 end 
end 
 
class RoundPeg 
 attr_reader :radius 
 
 def initialize(radius) 
   @radius = radius 
 end 
 
 def width 
  @radius * @radius 
 end 
end 
 
class RoundHole 
 attr_reader :radius 
 
 def initialize(r) 
  @radius = r 
 end 
 
 def peg_fits?( peg ) 
  peg.radius <= radius 
 end 
end 

清单 11 中的第二个 SquarePeg 类定义并没有错:Ruby 的开放类语法看上去类似于普通的定定义。在使用某个类名时,Ruby 会检查是否已经从类路径中加载了相同名称的类,如果是,则会在第二次操作时重新打开这个类。当然,在本例中,我可以将 radius() 方法直接添加到类中,但我假定原始的 SquarePeg 类在此代码之前定义。清单 12 显示了开放类适配器的单元测试:


清单 12. 测试开放类适配器
def test_open_class_pegs 
 hole = RoundHole.new( 4.0 ) 
 4.upto(7) do |i| 
  peg = SquarePeg.new(i.to_f) 
  if (i < 6) 
   assert hole.peg_fits?(peg) 
  else 
   assert ! hole.peg_fits?(peg) 
  end 
 end 
end 

上一页  3 4 5 6 7 8 9 10  下一页

Tags:演化 架构 紧急

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接