论坛首页 Java企业应用论坛

在Java 实现真正的富领域Model层

浏览 20910 次
精华帖 (10) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-08-09  
allwefantasy 写道
nakupanda 写道
我反而觉得DAO+POJO结构更清晰

关键在于,
1. dao+pojo太多重复代码。一上来就定义大量pojo类,然后定义相应的dao,不同项目你的通用dao类可能需要拷贝来拷贝去,并且每个人都可能会有自己喜欢的dao实现。
2. hibernate 配置过于繁杂,要么通过hibernate自己的配置文件,要么通过spring提供的胶水配置。一票的配置,你不找template,基本上没人能够配置的下来。
3 只有代码越少越集中,才能更清晰,更容易维护

这些都是充血模型带来的好处。简单一个Model类,就把pojo,dao,以及部分service都给处理了。而且责任也更加清晰。比如,我要取出tag所有status为1的记录。我直接向该模型类要,不是更合理吗?

还有一点需要指出的,充血模型你唯一需要做的就是一个关联申明,然后所有的方法和属性都给你提供了。你可以参看主题帖的第一篇,四个模型类,有三个模型类里面的代码就一行和一个最最简单的注解。



只能处理部分service,对于企业应用业务逻辑比较复杂的模块,service或类似service的这么一层还是必要的。
0 请登录后投票
   发表时间:2012-08-09  
ror, grails都有接触过, 现在在写PHP, 在用的orm工具也是类似于你支持的这种方式, 但个人觉得这种写法不伦不类.

饼干和饼干机一起售卖太可怕了.
0 请登录后投票
   发表时间:2012-08-09  
nakupanda 写道
ror, grails都有接触过, 现在在写PHP, 在用的orm工具也是类似于你支持的这种方式, 但个人觉得这种写法不伦不类.

饼干和饼干机一起售卖太可怕了.

这种方式最好的地方是:
1  方便的拼接sql。即使是很复杂的sql也能非常结构化的拼接,举个例子

 @At(path = "/blog_tags/search", types = GET)
    public void search() {

        Set<String> newTags = Tag.synonym(param("tags"));

        JPQL query = BlogTag.where("tag.name in (" + join(newTags, ",", "'") + ")");

        if (!isEmpty(param("channelIds"))) {
            String channelIds = join(param("channelIds").split(","), ",", "'");
            query.where("channel_id in (" + channelIds + ")");
        }

        if (!isEmpty(param("blockedTagsNames"))) {
            String blockedTagsNames = join(param("blockedTagsNames").split(","), ",", "'");
            String abc = "select object_id from " + param("type") + " where  tag.name in (" + blockedTagsNames + ")";
            query.where("object_id not in (" + abc + ")");
        }

        long count = query.count_fetch("count(distinct object_id ) as count");

        if (!isEmpty("orderFields")) {
            query.order(order());
        }

        List<Model> models = query.offset(paramAsInt("start", 0)).limit(paramAsInt("size", 15)).fetch();

        //设置json输出
        config.setExcludes(new String[]{"blog_tags"});
        config.setPretty(true);
        // JSONArray data = remoteDataService.findByIds(param("type"), param("fields"), fetch_object_ids(models));
        render(map("total", count, "data", models));
    }


2  规范每个人的代码

在一个ROR项目中。你会发现controller层的代码非常的统一,并且代码很少。这便得意于ActiveRecord的 Query Interface 风格
0 请登录后投票
   发表时间:2012-08-09  
rjbj 写道
用过rails就知道这种模式的方便,易用。我也一直在找这方面的框架,如果有这样的项目或者你是项目发起人,我愿意参与进去,贡献代码。

呵呵 这个项目已经基本开完了。开源前,我想先看看大家的是否有兴趣。免得这种想法只是自己认为合理,但是大家都不接受。
0 请登录后投票
   发表时间:2012-08-09  
很赞同这种充血model的写法.
不过对于不用get/set方式,总是有点担心维护的时候会不会有什么不便?
0 请登录后投票
   发表时间:2012-08-09  
joaboo 写道
很赞同这种充血model的写法.
不过对于不用get/set方式,总是有点担心维护的时候会不会有什么不便?

本质上 是有 get/set 方法的。只是你看不到而已。是程序启动的时候框架会给这些类添加。
get/set 方法其实主要是为了方便一些库,比如hibernate,一些json库,他们需要你的模型类有这些方法。
实际开发中,我个人认为你用不用get/set 无所谓。
0 请登录后投票
   发表时间:2012-08-09  
我喜欢这样的框架,简洁而不简单。
0 请登录后投票
   发表时间:2012-08-09  
zlpgm 写道
我喜欢这样的框架,简洁而不简单。


能否让用户能够用最简单的方式解决80%的问题才是框架真正应该追求的。Java 很多框架就是为了追求框架本身的完美和扩展性而忽略了上面的原则。
0 请登录后投票
   发表时间:2012-08-13  
olivechinese 写道
这是是什么框架?

该项目已经开源。下面是地址:
https://github.com/allwefantasy/ServiceFramework
0 请登录后投票
   发表时间:2012-08-13  
melin 写道
allwefantasy 写道
yxb1990 写道
java 能实现吗?

当然可以实现。上面的文档就来自一个真实的框架的wiki文档。只是不知道大家对这种模型的接受程度。

比如假设在模型类不定义任何属性(当然你可以定义)。那么就需要一定的语法格式才能取出属性。比如你希望取出tag的name.
通常是:

 tag.getName();


但是如果你没有定义这个属性而是靠框架给你自动生成,那么就需要
 tag.attr("name",String.class);

来获取。

一般而言,这不会造成问题。你很少会有取出属性这种需求。比如form表单填充,模型类已经有相应的方式给你。

  Tag tag = Tag.create(params());


其中 params()会返回一个map对象。任何模型类都有从map对象构建自身的一个功能,通过create() .
所以基本需要你直接设置model或者取出model属性的状况比较少。尤其是一些移动应用后端。






什么项目? 地址?


该项目已经开源。下面是地址:
https://github.com/allwefantasy/ServiceFramework
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics