Annotation到底是“银弹”还是灾难?

随着软件越做越大、越做越复杂,配置文件也多如牛毛,于是我们开始在代码中写入Xdoclet Tag或Annotation代码,使用自动化工具生成相应的配置文件或者规避配置文件。
我开始想,配置文件的作用是什么?难道不是对软件进行解耦吗,比如在持久层和数据库之间解耦,以便更改数据库地址、用户、密码、表名之后不必再build代码。一个大型的开发团队可能有编码人员、架构师、测试员、部署员、数据库架构师这些角色,而且这些角色可能不由一个人担任。这些人之间的沟通也许不会通畅,客户与开发团队间也会存在沟通不通畅的时候,于是特别经常必需在客户的生产场所直接build软件,因为这时总会有代码与客户现存的生产软件之间有不匹配的地方,为便于修改于是直接选择在客户生产场所build。但是在软件交付运行之后,客户可能存在特殊的商业策略,比如定期更换数据库连接帐户的密码,这就不可能采用将密码硬编码在软件中的方法,因为每更换一次密码就要build一次软件这是不可思议的。如果采用配置文件就能解决这些问题。
问题是,既然配置文件是将易变的代码从硬编码的困境中解放出来,那么Annotation不是将一切回归原点吗?修改硬编码的配置再build软件和修改Annotation再build软件难道有区别吗?使用配置文件就是为了随时随地、容易的更改,而Annotation无疑让这些更困难了。
如果客户采用的策略是直接修改配置文件,那么他又不得不同步源代码中的Xdoclet Tag;如果采用Xdoclet Tag方式,那么他又不能较方便的更改配置文件;如果采用Annotation方式,那么他又不得不重复build软件。
我并不否认Xdoclet Tag的用处,在初次生成配置文件时它确实可以减少书写工作量,但是只要生成了配置文件之后,就要在同步Tag和配置文件上下功夫,这个工作量是以前所没有的。但是我实在搞不懂,回归紧耦合的Annotation到底好在哪里?Hibernate、Spring等框架一直致力于使用外置的xml文件来实现解耦,而Annotation一夜之间就让这些轰然倒塌。这些框架一开始费那个劲干嘛,直接做成硬编码不就好了。
因此,我在想对于开发团队来说,采用Xdoclet Tag生成配置文件的方式更好;对于客户来说,直接修改配置文件更好;对于Annotation来说,它本不该存在。

非常不错的观点,我曾经也写过类似的帖子:

终于有人开始反感Java 1.5的Annotation了
http://www.jdon.com/jivejdon/thread/22356.html

原来我也有将Annotation和Xdoclet比较的帖子,不过当时和我争吵的人还没有明白他们异同处。

Annotation是一个双刃剑。根据我近一年的思考,我认为可以给Annotation使用的一个相对准确定位:
Annotation应该看成是另外一种接口应用,是接口的另外一种形式表现吧。Annotation引入可以让代码更加优雅,能够体现主接口和次接口等作用,体现了主次之分,次要方面可以使用Annotation来实现。

使用Annotation还是坚持OO解耦原则,Annotation只是更加细分了以前XML配置作用其中一部分,而不是全部,一些数据库等配置还是必须用配置文件来实现。

Annotation在我的理解里就是一个提供类附加信息的方式,类似与Java Reflection API中的一些类操作对象。
例如,我们可以通过一个对象知道它的类型,并且知道它的结构(属性,方法等),包括Annotation,所有Annotation只是对现有的类结构信息的一点补充,它让我们知道在设计静态的类型的时候,我们不但可以知道一些语言状态下的结构信息,而且还可以知道一些除了语言之外的一些其他信息(例如业务,权限)等,这些信息能够进一步帮助我们在更高的层次上对“对象”进行反射操作(例如,过去我们也许只是根据方法名称来判断是否进行反射触发,现在可以有Annotation来做更多复杂的判断)
Annotation的作用并不在于它单独的实现,而是在于它和其他技术的有效结合,例如Annotation+AOP就是一个非常不错的例子(不再详细说明)
Annotation应用的地方应该还是局限于程序,也就是说Annotation是程序实现的一部分,如果觉得这种Annotation是程序的一部分,那么就可以使用,如果是配置的一部分,那么就不要滥用它,这样Annotation才不会被很多的人误解。
Annotation就是程序!!!

Annotation就是程序

赞同