演化架构与紧急设计: 语言、表达性与设计:第 2 部分
2009-11-05 00:00:00 来源:WEB开发网如果您完全不愿意为适配器创建额外的类,那么应该怎么办呢?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
更多精彩
赞助商链接