likes
comments
collection
share

《代码整洁之道》读书笔记-Chapter8 Boundaries边界

作者站长头像
站长
· 阅读数 46

出于某种原因,我们需要将外部的代码整合进我们的自己的项目中

Using Third-Party Code

第三方软件包和框架的提供者努力争取广泛的适用性,以便它们能够在许多环境中工作,并吸引广泛的受众。但对开发者来说,他们只想其interface提供他们想要的功能。这个矛盾关系会影响我们系统的边界

例如,我们的应用程序可能会建立一个Map并将其传递给其他人。我们的目的可能是让我们的Map的接收者都不删除Map中的任何东西。但Map的API提供了clear()方法,并且Map的任何使用者都有权力清除它

例子: 如果我们需要一个存储Sensor的Map

Map sensors = new HashMap(); 
                                
Sensor s = (Sensor)sensors.get(sensorId ); 

这段代码可以实现,但是不够clean,可以使用范型

Map<Sensor> sensors = new HashMap<Sensor>(); 
... 
Sensor s = sensors.get(sensorId); 

这样更简洁,但是没有解决这个map提供比我们期望得更多的方法的问题

最好的方法是包装一下

                                            
public class Sensors {  
    private Map sensors = new HashMap(); 
    
    public Sensor getById(String id) { 
        return (Sensor) sensors.get(id); 
    } 
    
    //snip 
} 

作者并不建议将Map的每一次使用都以这种形式封装起来。相反,作者建议你不要在你的系统中传递Map(或任何其他边界Interface)。如果你使用像Map这样的边界接口,请将其保留在使用该接口的类或类的近亲中。避免从公共API中返回它,或接受它作为参数。(因为他们提供了很多多余的API)

Exploring and Learning Boundaries

我们可以写一些tests来探索我们对第三方代码的理解。Jim Newkirk称这种测试为学习测试learning tests

Learning Tests Are Better Than Free

Using Code That Does Not Yet Exist

写一些从无到有的代码是另一种的边界,区分知道和不知道的代码

最好的做法是先定义一个interface提供给调用者,这样做的好处是我们可以很好的掌控新增的代码,并且很适合完成边界测试

Clean Boundaries

好的软件设计在改代码的时候不需要大量的工作。

我们需要拒绝让我们的代码了解过多的第三方包或者API,好的方式是用一个类写一遍自己需要的API,然后把第三方的实现封装起立。方便我们control我们的代码

就像包装Map一样,或者使用适配器来转换API成我们需要的API

转载自:https://juejin.cn/post/7156410709578874916
评论
请登录