锁定老帖子 主题:如何才算滥用annotation?
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-09-19
偶先举几个例子吧: 1. O/R Mapping 比如EJB3的持久化映射, 具体就不用说了, 规范里面非常清楚了, 看代码: @NamedQueries({ @NamedQuery( name="authorPosts", queryString="select p from Post p where p.author = :author" );, @NamedQuery( name="allPosts", queryString="select p from Post p" ); }); @Entity @Table(name="FORUM_POST", schema="javaeye"); public class Post { private Long _id; private String _title; private String _content; private User _author; @Id(generate=SEQUENCE, generator ="POST_SEQ"); public Long getId(); { return _id; } @Column(name="TITLE", nullable=false, length=255); public String getTitle(); { return _title; } @Column(name="CONTENT", columnDefinition="CLOB NOT NULL"); public String getContent(); { return _content; } @ManyToOne(optional=false); @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false); public User getAuthor(); { return _author; } } 2. 校验 比如WebWork的visitor方式校验,能够将action的校验,转发到Entity上, 以前的写法是写一个Post-validation.xml: <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"> <validators> <field name="title"> <field-validator type="requiredstring"> <message>Please input title.</message> </field-validator> </field> <field name="content"> <field-validator type="requiredstring"> <message>Please input content.</message> </field-validator> </field> </validators> 改用annotation成: @Validator(type="requiredstring", message="Please input title."); public String getTitle(); { return _title; } @Validator(type="requiredstring", message="Please input content."); public String getContent(); { return _content; } 3. 索引 比如用lucene做全文搜索,以前是写一个Post-lucene.xml, 当一个Post被持久化的时候,能够自动根据这个配置文件对相应的属性做不同的索引处理: <lucene> <field type="Keyword" fieldName="title"/> <field type="Text" fieldName="content"/> </lucene> 改用annotation成: @LuceneIndex(type="KEYWORD"); public String getTitle(); { return _title; } @LuceneIndex(type="TEXT"); public String getContent(); { return _content; } 如果将3种annotation都混合在一起,整个Post Entity将会变成: @NamedQueries({ @NamedQuery( name="authorPosts", queryString="select p from Post p where p.author = :author" );, @NamedQuery( name="allPosts", queryString="select p from Post p" ); }); @Entity @Table(name="FORUM_POST", schema="javaeye"); public class Post { private Long _id; private String _title; private String _content; private User _author; @Id(generate=SEQUENCE, generator ="POST_SEQ"); public Long getId(); { return _id; } @Column(name="TITLE", nullable=false, length=255); @Validator(type="requiredstring", message="Please input title."); @LuceneIndex(type="KEYWORD"); public String getTitle(); { return _title; } @Column(name="CONTENT", columnDefinition="CLOB NOT NULL"); @Validator(type="requiredstring", message="Please input content."); @LuceneIndex(type="TEXT"); public String getContent(); { return _content; } @ManyToOne(optional=false); @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false); public User getAuthor(); { return _author; } } 本来干干净净的一个Post POJO,变成了充满annotation的怪家伙,这可以称之为annotation的滥用么?难道又一个AOP出现了?难道以后偶们打开一个Java文件必须用Eclipse之类的IDE,好让它自动将annotation fold,免得花了眼睛么? 你对annotation的意见如何? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-09-19
我的观点:能放到配置文件里面的,一般还是不放在源码里
否则改起来岂不是自找麻烦 |
|
返回顶楼 | |
发表时间:2005-09-19
我对Annotation的感觉是:
他确实有被滥用的趋势。 但是我个人认为也有相当一部分人坚持这么一个观点: 与源代码放在一起未必是坏事,比如说它可以更方便编写配置,更大限度减少出错几率,更加将配置+编码结合在一起。 配置和编码一起写会比较方便而且会逻辑紧密一些。 但是Annotation有几个很大的缺陷: 1) 跟源代码放在一起,修改即等同于修改源代码。 2) 失去模块化的逻辑,使得本来一些联系比较紧密的配置分散到各个源代码中去。 3) 配置和代码放在一起,会不会造成模糊化 配置 和 编码之间的区别。 其实,就我实际的开发来说,我个人感觉仅仅对于编写映射信息方面,感觉Annotation更好写,比起XML 编写来说 ,主要原因是 我是看着源代码来编写,而且是在支持编译检查的IDE中编写。 至于说他造成源代码文件庞大的问题,这个问题倒不是关键,因为Annotation的语法区分在 IDE中还是一目了然的。 |
|
返回顶楼 | |
发表时间:2005-09-19
annotation 本来就是自定义的。搞民主,还怕乱,那怎么行?赫赫
|
|
返回顶楼 | |
发表时间:2005-09-19
只跟目前代码段有关的内容 (非全局的配置)一概放在Annotation\Attribute里,影响全局的放在XML里,例如dotNet里,App.config和Web.Config。
所以对你的例子而言,我会先把lunce放在XML里,因为它不是a part of entity,拆开没什么问题。 WebWork我不熟,不发表意见,但也是和上面一样的道理,可以拆之,或放XML,或在别的method的annotation里。 |
|
返回顶楼 | |
发表时间:2007-03-20
annotation的本意是有一些代码难以描述,但属于类紧密相关的的信息,如属性的值域范围,是否主key,唯一性约束,哪些属性受其影响等.这些信息都是代码的延伸,但代码没有描述的对象核心元数据。
但我不太同意将O/R Mapping(仅为hibernate或DAO使用)的元数据,Validation(为UI使用)的信息放到类中,首先在层次上就不够清晰,其次,annotation中将充斥着各个层次的元数据,维护,可阅读性都是问题 |
|
返回顶楼 | |
发表时间:2007-03-20
annotation本身就是程序的一部分,它和普通的代码之间,除了形式上的不同,没有什么区别.
所以,以前不想在程序中硬编码的功能,也就不要用annotation. 同一楼上的观点. |
|
返回顶楼 | |
发表时间:2007-03-20
引用 1) 跟源代码放在一起,修改即等同于修改源代码。 ----------------------------- 经常听人说,使用annotation使得修改一点点配置就要修改代码。可能不是任何东西都用annotation好,但是使用hibernate用annotation确实最棒的。 使用annotation能够快速开发系统,一个地方完成功能和配置需求,这个特点就值得你去使用。 使用annotation就能够在你看代码时,不必再在多种格式的文件中来回游荡,这个特点使人轻松。 更改配置时,改一下源代码,不是一件多恐怖的事情。 |
|
返回顶楼 | |
发表时间:2007-03-20
抛出异常的爱 写道 lighter 写道 抛出异常的爱 写道 annotation 人造夹层 本来单层的java 又加入了一层 比html标签中加入<%%>还恶心 平白的增加出错机会...不禁要问为什么? jsp面页难到不是大家用过的最恶心的东西么 灵活么?好用么?美么? 唯一的好处就是大牛门又可以写出如C++般的魔术代码 我们常在页面用JSP2.0的jstl,觉得功能有一些不完善,但也挺好用的啊 也不要一棍子把jsp打死 Annotation用得好,可以减去很多重复的xml配置,举一个例子 属性名与数据库属性字段相同时,用Annotaion可以简洁很多 自己乱说一通,跑题了 平空多加了一层 但是对他的好处也只是对xml打的补丁..... 或者它根本就不应该那么用.... 如果annotaion配错了 而且上传到SVN上之后布署不通过 怎么才能知道是哪个 annotation配错了? 看日志.....? |
|
返回顶楼 | |
发表时间:2007-03-20
annotation配错了,等价于相关的xml配错了。排错不是一样的吗?
看异常日志不是件坏事。看了日志不就知道是什么配错了吗(比如找不到列,或找不到类等等) 异常是个可爱的东西。 |
|
返回顶楼 | |