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

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

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: 在本例中,我可以直接对 SquarePeg 类调用 radius 方法,演化架构与紧急设计: 语言、表达性与设计:第 2 部分(9),因为它已经包含一个 radius 方法,通过开放类添加一个方法可以完全避免对单独适配器类的需要,这代码允许您为某个方法定义一个特定的接口,并设定该方法只能存在于特

在本例中,我可以直接对 SquarePeg 类调用 radius 方法,因为它已经包含一个 radius 方法。通过开放类添加一个方法可以完全避免对单独适配器类的需要,无论是通过手写还是自动生成。但是,此代码存在一个潜在的问题:如果 SquarePeg 类已经包含一个与圆孔没有任何关系的 radius 方法,那又该怎么办呢?使用开放类会重写这个原始类,从而导致意外行为。

这正是表达性语言的强大之处。考虑如清单 13 所示的 Ruby 代码:


清单 13. 接口切换
class SquarePeg 
 include InterfaceSwitching 
 
 def radius 
  @width 
 end 
 
 def_interface :square, :radius 
 
 def radius 
  Math.sqrt(((@width/2) ** 2) * 2) 
 end 
 
 def_interface :holes, :radius 
 
 def initialize(width) 
  set_interface :square 
  @width = width 
 end 
end 

此代码基本上无法使用 Java 语言或 Groovy 实现。注意,我使用 radius 这个名称定义了两个方法。在 Groovy 中,编译器不会编译此代码。但是,Ruby(以及 JRuby)是一种解释语言,它允许您在解释过程中 执行代码。某些 Ruby 爱好者将 Ruby 中的结构(constructs)称为 “一等市民”,表示该语言的所有部分都是随时可用的。此处的魔力在于(类似于关键字)def_interface 方法调用。这是对在解释时执行的 Class 类定义的一个元编程方法。这代码允许您为某个方法定义一个特定的接口,并设定该方法只能存在于特定的作用域内。此作用域是由 with_interface 方法调用定义的,如清单 14 所示:

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

Tags:演化 架构 紧急

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