`

不要向上层暴露本层以及所依赖的接口细节

阅读更多
h1.背景

在攻略全文搜索中,搜索的接口很丰富,并且将来可能会增加更多的需求。搜索业务类提供的接口既要能满足将来的扩展,
又不能暴露底层的细节,还要避免功能组合带来接口的膨胀。

h1.设计方法
搜索接口的依赖关系,如下图:
前端控制器 ----> 搜索业务方法 --> QP搜索API

QP主要需要一下参数控制搜索条件:
普通的: key=key
指定字段搜索: search_in=field
按照月份过滤: travelmonths=month
飘红: hl=true,hl.fl=highlightFields,
      hl.simple.pre=飘红开始标签
      hl.simple.post=飘红结束标签

h2.不好的设计1
如果Service层像控制器层提供一个functionParams,让Controller根据
不同的情景设置不同的参数进行搜索:
public SearchBookBean searchBooks(String key, Map<String,Object> functionParams)

这样可以满足接口扩展的功能,但是这样就把控制器层依赖QP的接口参数,qp参数变化会跨层影响控制层。

所以最好再提供一个封装,让QP对于控制器层透明。

h2.不好的设计2
常用的方式,对不同的条件封装出不同的接口,这样可能就会有:
普通的搜索:
public SearchBookBean searchBooks(String key, boolean highlight){
    //1.根据普通搜索需要的参数设置到functionParams
    Map<String, Object> functionParams = new HashMap<String,Object>();
    if(highlight){
        addhighlightParams(functionParams);
    }
    //2.调用public SearchBookBean searchBooks(String key, Map<String,Object> functionParams)
    return searchBooks(key,functionParams);
}

同样对于只在作者中搜索:
public SearchBookBean searchBooksOnlyUserName(String key, boolean highlight){
     Map<String, Object> functionParams = new HashMap<String,Object>();
     if(highlight){
        addhighlightParams(functionParams);
     }  
     functionParams.put("search_in", "userName");
     return searchBooks(key,functionParams);
}

然后同样会有按照月份过滤:
public SearchBookBean searchBooksWithMonthFilter(String key,int month, boolean highlight){
//...
}

然后还会有只在作者中搜索并且按照月份过滤...
这样接口就会组合性的增长。

h2.Best practice

比较好的方法是能够抽象出一个动态组合各种功能的东东来搞定这个。
 class SearchFunction {
    private Map<String,Object> functionParams;
    
    public SearchFunction(){
        functionParams = new HashMap<String, Object>();
    }
    
    public SearchFunction withOnlyUserName(){
        functionParams.put("search_in", "userName");
        return this;
    }
    
    public SearchFunction withMonthFilter(int month){
        functionParams.put("travelmonths", month);
        return this;
    }
    
    public SearchFunction withDefaultHighlight(){
        List<String> highlightFields = new ArrayList<String>();
        highlightFields.add("title");
        highlightFields.add("travelRoute");
        highlightFields.add("destCities");
        return withHighlight(highlightFields);
    }
    
    public SearchFunction withHighlight(List<String> highlightFields){
        functionParams.put("hl", true);
        functionParams.put("hl.fl", StringUtils.join(highlightFields,','));
        functionParams.put("hl.simple.pre", "<span class=\"colOrange\">");
        functionParams.put("hl.simple.post","</span>");
        return this;
    }
    
    public Map<String,Object> getFunctionParams(){
        return functionParams;
    }
}



这样我们就可以定义一个接口来搞定所有的需求:
public SearchBookBean searchBooks(String key, SearchFunction function){
    Map<String, Object> functionParams = null;
        
        if(function == null){
            functionParams = new HashMap<String,Object>();
        }else{
            functionParams = function.getFunctionParams();
        }
        return searchBooks(key, functionParams);
}

控制器就可以动态的组合各种功能了:
普通带飘红搜索:
SearchFunction sf = new SearchFunction();
sf.withDefaultHighlight();
SearchBookBean searchBean = service.searchBooks("keyword", sf);

复杂一些的搜索: 只在作者中搜索并且按照月份过滤带飘红的搜索
SearchFunction sf = new SearchFunction();
sf.withOnlyUserName().withMonthFilter(1).withDefaultHighlight();
SearchBookBean searchBean = service.searchBooks("keyword", sf);
分享到:
评论

相关推荐

    车载CAN网络数据链路层和传输层软件的设计与实现_李璐璐

    接口层为上层提供访问硬件单元的统一接口,管理硬 件状态,通过缓存机制保证 L_PDU 传输服务;传输层通过超时机制和流量控制, 提供数据收发和数据拆分重组等功能。同时结合当下通讯系统测试领域的研究成 果,创建...

    html5+css3 弹出遮罩层

    这是一款使用html5 svg和css3制作的全屏遮罩导航菜单...这里使用一些视觉差小把戏使遮罩层消失:我们为可见元素设置transition delay使透明度首先开始改变。 其他一些demo中我们使用了Snap.svg来制作SVG路径变形动画。

    WEB网页DIV层背景图循环向上滚动效果

    1.适用于但网页APP推广页面美化,WEB网页DIV层背景图循环向上滚动效果 2.此效果为静态HTML效果美化

    电子线路板设计与制作 自底向上层次原理图的设计.pdf

    电子线路板设计与制作 自底向上层次原理图的设计.pdf 学习资料 复习资料 教学资源

    自下而上画OrCAD层次原理图实例

    自下而上画OrCAD层次原理图实例 层次原理图的优点 在层次原理图设计中,能在总模块图中清晰的看到各模块之间的信号连接关系,能通过右键相应模块,选择“Descend Hierarchy”进入相应模块的原理图,非常方便。

    五层电梯源码及注释

    要求设有电梯所处位置指示装置以及电梯运行模式(上升或者下降)指示装置。电梯每秒升降一层楼。 电梯到达有停站请求的楼层,经过1秒电梯门打开,开门5秒后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完...

    上保护层开采底板破坏深度和应力分析研究

    上保护层开采导致的底板变形、应力释放会使被保护层内高瓦斯沿着上覆岩层内形成的空隙裂隙结构向上运移,很容易造成所采工作面采空区内瓦斯增加,造成工作面瓦斯超限。以峰峰集团以黄沙矿为研究实例,针对其主采的2号...

    Android硬件抽象层(HAL)

    这个层次恰好对应了Android系统的架构层次,它向下涉及到Linux内核,向上涉及到应用程序框架层的服务,以及应用程序层对它的使用。Android硬件抽象层模块的开发本身也遵循一定的规范。有了这个规范之后,系统就可以...

    三层架构与设计模式思想

    有时候出于对效率的考虑,这一层可能会在向上传输用户输入之前进行合法性验证。这一层通常采用前端工具(如 VB、VC 和 Java)开发。 ②业务逻辑层BLL:这一层是上下两层的纽带,它建立实际的数据库连接,根据用户的...

    变速向上滑动的向上按钮

    变速向上滑动的向上按钮

    Android下如何通过JNI方法向上提供接口总结

    JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够...

    jquery浮动层制作右下角float浮动提示框向上滑动提示

    jquery浮动层提示框制作右下角float div提示框向上滑动提示,类似MSN/QQ、阿里旺旺的浮动层提示框特效

    论文研究 - 观测到的中层平流层QBO的太阳周期变化,并由向上传播的波放大

    数值结果表明,来自对流层的向上传播的小尺度重力波放大了平流层QBO和EAO的SC调制,这是SC机制的一部分。 赤道QBO和EAO的纬向风通过子午环流在高纬度的平流层和对流层温度中产生可测量的SC变化。 对NCEP温度和纬向...

    洗衣机电路PCB由下向上层次图及内电层 设计

    很好的pcb设计学习例子,资源很好!资源类型

    DIV弹出层+定位

    这个例子是,div弹出层并且固定位置,弹出层的弹出方式为滑动方式。

    Linux Input 子系统框架

    硬件输入设备:最底层具体设备(如:触摸屏...负责双向提供接口,向下提供驱动层接口,向上提供事件处理的接口。 事件层:底层的设备抽象出对应的接口提供给应用层。将底层设备的触发的事件通过这个接口传达给应用层。

    电梯模拟仿真系统

    在楼的每一层,有电梯数,有按钮表示有人等待向上或向下,由若干人在等待,有若干电梯在本层停下,等等。 在大楼中(包括进出)的总人数不超过500 人,每个人站在电梯前有个目标层,他有一个最大的忍受等待时间,...

    数字系统设计 电梯

    (1)设电梯当前在2 层,向上运行,LED 指示希望在6 层停,此时若键入4,则电梯将在4 楼停,若再按运行键,则继续运行至6 层停; (2)同上情况,若键入的不是4 而是8,则电梯将先停在6 层,再按运行键,运行至8 层...

    向上滚动,可控制,点击向上滚动,点击向下滚动

    向上滚动,可控制,点击向上滚动,点击向下滚动

    保护层卸压开采煤层变形与增透效应研究

    利用该研究结果在顾桥矿沿空留巷内布置斜向上长短穿层钻孔,代替传统的底板巷内布置向上穿层钻孔抽采本层采空区内和上覆卸压煤层内瓦斯,可使沿空留巷中回风流和上隅角瓦斯体积分数均控制在0.5%以下,平均瓦斯抽采率达...

Global site tag (gtag.js) - Google Analytics