变色龙功能

在《神秘博士》中,卡梅利恩(Kamelion)角色是可以采取任何形式的机器人。 据称,他们使用的物理道具非常麻烦,只有其创建者才能理解,而该创建者并没有帮助纠正它。

因此,Chamelion功能...

考虑以下代码:

 public List<Document> getAllDocuments(Request request, int userId, String field) { 
    Query q = createQueryFrom(request); 
    switch (field) { 
       case "title" : 
           q.addCriteria(Criteria.where( "title" ).is(request.getTitle()); 
           break ; 
       case "name" : 
           q.addCriteria(Criteria.where( "name" ).is(request.getName()); 
           break ;  
       default : 
           throw new IllegalArgumentException( "Bad field: " + field); 
    } 
    return q;  } 

上面有很多事情。 让我们来了解它。 出现了某种请求,我们可以从中进行基本查询。 然后,根据调用方提供的字段,我们使用该字段向查询中添加条件,并将操作数从请求中拉出。

最重要的是,如果调用者提供了一个我们不知道如何查询的字段,我们就必须抛出一个错误。

此功能有什么问题?

我会告诉你怎么了...

这不是功能。 这是两个功能。 另请参阅两种音乐

调用代码可能如下所示:

 // one call site  getAllDocuments(request, id, "title" );  // another  getAllDocumetns(request, id, "name" ); 

我们正在使用字符串选择来控制单个函数的一半流程。

比这更糟的是……当某些调用者发明一个我们从未听说过的字符串时,我们需要抛出一个异常。

让我们再重构一下:

 public List<Document> getAllDocumentsByTitle(Request request, int userId) { 
    Query q = createQueryFrom(request); 
    q.addCriteria(Criteria.where( "title" ).is(request.getTitle()); 
    return q;  }  public List<Document> getAllDocumentsByName(Request request, int userId) { 
    Query q = createQueryFrom(request); 
    q.addCriteria(Criteria.where( "name" ).is(request.getName()); 
    return q;  } 

通过将其分为两个功能,它可以自我记录,易于遵循并且不需要处理流氓字符串。 它可能会稍微快一点,但这并不是真正的主要驱动力。

但是重复呢?

我怀疑变色龙功能的一种驱动程序是减少代码重复的错误尝试。 请注意,以上示例提供了在两个函数( createQueryFrom)中重用的代码示例,但每个函数中都有独立的逻辑。 它不是重复的代码。

我从中提取的示例可能最初有多行代码,现在我们看到createQueryFrom可能引起了对重复的恐惧,这反过来又造成了怪物。 坚持不懈地重构以减少正确的重复,这样的事情就不会发生。

翻译自: https://www.javacodegeeks.com/2019/08/chameleon-function.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值