zouruixin 2012-12-30 05:53
浏览 255
已采纳

如何避免使controller等控制器的代码膨胀

以下这段代码为例。。。

里面包含了几部分:
1. 从表单获取数据
2. 查询相应数据(具体的业务 一行代码搞定了)
3. 转化为 页面所需要的相关格式
4. 数据排序 并放到map里

我明白“将业务逻辑提取出来放到service”之类的话, 但是这里面确实无任何业务逻辑, 百分之九十以上都是为页面服务的数据转化。 如果放到业务层或者领域层会明显污染业务代码。

请大家以这个为例说说应该如何去做

(如果把一部分map的操作放进facade 或者service , 纯粹的数据加工这类的代码, 放到 这两个层里面 是否合适? 还是有其他的方式? 老实说写完我就觉得乱糟糟了这种代码)

[code="java"]
public ModelAndView tochoose(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map map = new HashMap();

    String buildingNum = request.getParameter("buildingNum");
    String scanCode = request.getParameter("scanCode");
    Validate.notEmpty(scanCode);

    Subscribe sc = subscribeRepository.load(scanCode);

    if (sc != null && sc.isLotteryScan()) {
        // 加载所有楼号
        List<String> allBuildNums = houseChooseService.getAllBuildingNum();
        map.put("sc", new SubscribeViewAdapter(sc));
        map.put("scanCode", scanCode);
        map.put("allBuildingNum", allBuildNums);
    } else {
        return new ModelAndView("choose/error");
    }

    //选择了楼号
    if (null != buildingNum && !"".equals(buildingNum)) {
        //查出小区
        List<Area> allArea = areaRepository.findAll();
        if(allArea.size() == 0){
            throw new Exception("请先配置本小区的名称");
        }else{
            map.put("area", allArea.get(0).getName());
        }
        // 通过楼号, 查出01 和02 不同朝向 的房间
        List<HouseSource> houseList = houseChooseService.listByBuildingNum(buildingNum);

        List<HouseChooseViewAdapter> leftList = new ArrayList<HouseChooseViewAdapter>();
        List<HouseChooseViewAdapter> rightList = new ArrayList<HouseChooseViewAdapter>();

        for (HouseSource h : houseList) {
            if (h.direction().equals(Constants.ROOM_NUMBER_DIRECTORY_LEFT)) {
                leftList.add(new HouseChooseViewAdapter(h));
            }else if (h.direction().equals(Constants.ROOM_NUMBER_DIRECTORY_RIGHT)) {
                rightList.add(new HouseChooseViewAdapter(h));
            }else{
                throw new Exception("该楼盘房间号格式错误,最后两位为 "+Constants.ROOM_NUMBER_DIRECTORY_LEFT
                        +" 或 "+Constants.ROOM_NUMBER_DIRECTORY_RIGHT+" 房间号:"+h.roomNum() + " 楼号:"+h.buildingNum());
            }
        }
        //房间号从大到小
        Collections.sort(leftList);
        Collections.sort(rightList);
        map.put("west", leftList);
        map.put("east", rightList);

    }
    return new ModelAndView("choose/choose", map);
}

[/code]

  • 写回答

6条回答 默认 最新

  • Bo6Bear 2013-01-01 16:45
    关注

    一个方法内部的代码应该建立在同一层次的逻辑抽象上。
    [quote]
    1. 从表单获取数据
    2. 查询相应数据(具体的业务 一行代码搞定了)
    3. 转化为 页面所需要的相关格式
    4. 数据排序 并放到map里
    [/quote]
    按照楼主对代码的抽象,确实有很多是与业务无关的数据操作,这些代码放在controller中就会出现代码的冗余,[b]即使抽象成了1行工具方法也是冗余的[/b]。

    我建议楼住考虑使用servlet中的[b]filter(过滤器机制)[/b],可以了解一下不但可以在servlet的service方法前进行处理,也可以在service之后进行处理(struts2等其他框架也有类似的技术)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 如何实验stm32主通道和互补通道独立输出
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题