天津福康纳米科技有限公司,电子烟,磁疗,远红外线产品。
2008年十月的日志归档
22

1.1.1 别重复自己

2008年十月22日,星期三,下午 3:03 | 分类:default | 给我留言 |

站在更高的角度看可以发现元编程对实现DRY(Don’t Repeat Yourself)原则很有帮助,该原则也被称作“一次且仅仅一次(Once and Only Once)”,DRY原则主张在系统中要表达的一则特定信息只需要出现一次就足够了。重复往往是没必要的,特别是诸如Ruby这样的动态语言。就像函数化抽象可以使我们得以避免重复编写相同或者相似的代码一样,元编程使得我们可以避免重复那些在整个应用中多次出现的概念。 元编程主要是为了简单化。体验元编程技术最简单的方法之一就是寻找出重复的代码并将其提取出来。多次重复的代码可被抽取为函数;多次重复的函数或模式通常可以通过使用元编程将其提取出来。 在这里所说的设计模式是几个领域的交集;模式的设计是为了将解决同一问题时需要重复的次数降低到最小。在Ruby社区中,设计模式没有获得很好的评价。对于一些开发人员来说,模式仅仅是一个很普通的词汇,它用于描述应用中重复出现的问题的解决方案。对于另外的一些开发人员来说,它们则太过工程化了。 固然,模式可能被过度的使用,但是明智的使用则另当别论。设计模式到目前为止只是在减少认知复杂性方面非常有用。在Ruby中,一些细粒度的模式因为其透明性非常高,已不适于称其“模式”了;它们事实上已经成为一种习惯用法,大多数 “以Ruby方式思考(think in Ruby)” 的程序员都会不加思索的使用它们。模式应该被当作描述架构的一个词汇,而不是实现了某种解决方案的一个预先打包好的库文件。从这个角度想,好的Ruby设计模式与好的C++设计模式相比有非常大的差别。 元编程通常不应该被简单的用来减少代码重复。你应该经常评估是否有另外的技术选择能更好的解决问题,例如函数化抽象。但是,在少数情况下通过使用元编程来减少重复代码是最佳的解决方式。例如,当几个非常相似的函数必须得定义在相同的一个对象上时,就像ActiveRecord helper方法,元编程就可以发挥其作用了。

(阅读更多精彩内容...)
22

1.1 什么是元编程?

2008年十月22日,星期三,下午 2:02 | 分类:default | 给我留言(2 条留言) |

从今天开始,我将陆续在这里复制别人翻译好的书。这是很无耻的一件事,但是为了流量。我就无耻一把了。翻译者如果看到本文,有权利要求我删除相关内容。希望你们看不到。 ********************************* 我 是 分 割 线 ********************************* Rails 使元编程变得大众化。虽然它肯定不是第一个利用Ruby的广泛功能进行内省(introspection)的应用,但它却很可能是最受欢迎的Ruby应用。为了理解Rails,我们必须首先搞清楚Ruby中使Rails的实现变为可能的那些部分。本章介绍了后文中讨论的技术的基础。 元编程是一种使用代码来编写其它代码以及进行自省的编程技术。Meta(源于希腊语)这个前缀在这里的意思是抽象。使用了元编程技术的代码在两个抽象层次上同时进行工作。 元编程技术在多种编程语言中都可以使用,但更多的还是被应用于动态语言中,因为动态语言提供了更多的在运行时将代码视为数据进行操纵的能力。虽然像C#和Java这样较为静态的语言也提供了反射机制,但是仍然没有诸如Ruby这样的更趋动态性的语言那么透明,这是因为静态语言在运行时其代码和数据是分布在两个层次上的。 自省通常是在这两个层次上的某一个层上完成的。语法层的自省是最底层的——直接检查程序文本或者符号流。基于模板和基于宏的元编程一般来说都是在语法层进行的。 Lisp 通过既可以用于代码也可以用于数据的S表达式(本质上是程序抽象语法树的直接翻译)支持语法层的元编程。Lisp的元编程大量的使用了宏,宏的本质是代码模板。Lisp的这种方式带来的好处是可以在单一的层次上进行编程,代码及数据都以相同的方式表现,唯一的区别在于是否会被估值(evaluate)。然而语法层的元编程模式也有其弊端,用在同一命名空间下运行和估值的代码对两个抽象层次进行操作,会直接导致变量捕获(Variable Capture)和不经意的多次估值这类问题的出现。纵使有标准的Lisp惯用法可以处理这些问题,Lisp程序员仍然是需要学习和考虑更多的东西。 Ruby可以通过ParseTree库来完成语法层的自省,ParseTree可以将Ruby源代码翻译成S表达式。使用此库来编写的一个有趣的应用叫做Heckle,它是一个“测试的测试”框架,能够对Ruby代码解析及改变,例如改变字符串或者将‘true’和‘false’进行来回的调换。其想法是如果测试覆盖率很好,那么对代码任何部分的任何变更都应该导致单元测试的失败。 与语法自省相对应的一种更高层次的自省叫做语义自省,既通过语言更高层次的数据结构对程序进行探查。在不同的编程语言中语义自省的方式十分不同,在Ruby语言中一般来说都是作用于类及方法层上:创建方法,重写方法,给方法赋予别名(alias);截取方法调用;操纵继承链。这些技术和语法层自省相比与已有的代码更为正交(相关度更小),因为它们倾向于将已存在的方法视为黑盒而不是修改其内部实现。

(阅读更多精彩内容...)
  • 信息发布
  • 最新留言
  • 热评日志
我的2010,新的开始啦

稍后把团队的介绍放上,呵呵。
关于 里克
里克:本名李伟,全职SOHO开发,技术顾问
长春互联 技术总监
邮件:liwei@echangchun.net
QQ:5175486
MSN:liwei78@live.com
某高潜力SNS网站团队成员
对iphone和android的开发很感兴趣