Stay Hungry,Stay Foolish!

以一则LUA实例说明敏捷开发中“分离构造和使用”原则

分离构造和使用

构造含义是功能的实现, 此功能是一个定义明确的处理过程, 开放出明确的接口给调用者使用。

则使用者可以直接调用接口进行使用, 但是使用者需要搞清楚, 那些是构造, 那些是使用。

不要再使用的地方, 将构造的代码也实现。 否则, 构造的代码会淹没掉 使用地方的 业务逻辑。

 

LUA需求

在一个lua表中, 查询指定参数名称的参数值,  并将此参数值转换为 html encode编码方式。

instData = {

[“para”] = “paravalue<”,

[“para1”] = “paravalue1”,

}

要实现这种编码转换, 将html敏感的字符进行转义。例如 将 < 转换为 &lt;

instData.para   --->  paravalue&lt;

 

分析:

实现上分为两个步骤:

1、 找到 para参数的值

2、 对参数值进行转义

 

不分离构造和使用的实现

给table定一个函数叫 GetHTMLCode, 同时实现查找和转码的工作:

table.GetHTMLCode = function(self, paraname)

local val = self[paraname]

local transhtml = function 。。。。

local html = trans2html(val)

return html

end

 

使用:

instData.GetHtmlCode(instData, "para")

instData:GetHtmlCode("para")

 

问题:

1、 table添加了 获取参数值, 并执行html转码的行为。 混乱了table的一般性功能, table只负责寻找具体的参数值, 但是html转码不应该table负责。table提供GetParaValue接口就足够了,  职责尽量单一。

2、 trans2html在此接口中实现,违背分离构造和使用的场景。

 

分析:

本例子中, 需要两处构造:

1、 table 添加 GetParaValue 接口的实现构造。

2、 string 添加转为 html code的 tohtmlcode 接口的实现构造。

然后本例子中一处使用:

即 目标table获取参数值,然后转换为htmlcode。

 

分离工作和使用的lua例子改写

 

先执行string的tohtmlcode转换

string.tohtmlcode = function(self)

return 。。。

end

 

然后添加table的 获取参数值的 接口实现:

table.GetParaValue = function(self, paraname)

   ……

end

 

最后使用:

instData:GetParaValue(“para”).tohtmlcode()

 

多么优美!!

这就是unix编程艺术的杰出体现, 系统上有很多多如牛毛的小程序, 各个耽搁没有什么特殊的地方,

但是一旦组合起来使用, 则会发挥无穷的威力。

posted @ 2016-04-30 23:34  lightsong  阅读(331)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel