《代码整洁之道》 108 109页缺失翻译

简介: 《代码整洁之道》中文电子版 少了两页 本人帮翻译出来 仅供参考 有错误的地方多批评指正by 明明如月 QQ 605283073

附  英文版 中文版 电子书  




360网盘: http://yunpan.cn/c3ISX4cRsqcMU  访问密码 67b9





合我们的利益诉求。


这半句为了和上一页接上。但是不够特别通顺。这一段最后一句话重新翻译:


测试第三方代码并非我们的职责所在,但是为我们使用到第三方代码写测试代码对我们最有好处。


      假如我们并不知道怎么使用我们的第三方库。我们可能需要花费一天或者两天(甚至更长)的时间来阅读其文档才搞懂怎样去使用它。然后我们利用第三方代码来编写我们的代码,并判断它是否按照我们设想的来执行。由此我们停滞在尝试找出bug是出自我们的代码还是第三方代码里面的漫长的调试阶,就不足为奇了。


      学习第三方代码不容易。整合第三方代码也很难。学习的同时又整合代码难度更是双倍。如果我们另辟蹊径怎样?不是实验和尝试在我们产品代码中加入新的东西,而是去写测试来加深我们对第三方代码的理解。Jim Newkirk称这种测试为学习性测试。


      因为我们想在我们的应用上使用第三方库,所以在学习性测试中我们称第三方(库)为API。我们本质上是通过可控的实验来验证我们对API的理解。实验重点关注我对API本身以外的需求。


8.3学习log4j


 比起我们自己定制日志记录器,我们更倾向于使用apache公司的log4j包。我们下载log4j包,并打开其介绍功能的文档页面。在没有充分阅读文档的情况下,我们写第一个测试用例,期待它能够写“hello”这个单词到控制台。


@Test

public voidtestLogCreate() {

Logger logger =Logger.getLogger("MyLogger");

logger.info("hello");

}



      运行它的时候,日志记录器产生一个错误,提示我们需要一个叫Appender(日志目的地)的东西。稍微读了一下文档,我们发现有一个叫ConsoleAppender的类。所以我们创建一个ConsoleAppender ,看看这样是否已经解开了输入到控制台的秘密。


@Test

public voidtestLogAddAppender() {

Logger logger =Logger.getLogger("MyLogger");

ConsoleAppender appender= new ConsoleAppender();

logger.addAppender(appender);

logger.info("hello");

}



这次我们发现Appender并没有输出流。奇怪—逻辑上它应该有一个输出流才对。通过在谷歌上一番搜索后,我们尝试对代码作如下修改:


@Test

public voidtestLogAddAppender() {

Logger logger =Logger.getLogger("MyLogger");

logger.removeAllAppenders();

logger.addAppender(newConsoleAppender(

newPatternLayout("%p %t %m%n"),

ConsoleAppender.SYSTEM_OUT));

logger.info("hello");}



      问题搞定了,一个包含“hello”的日志信息在控制台出现了!似乎很奇怪我们必须告诉ConsoleAppender让它写入到控制台。


有趣的是,当我们移除ConsoleAppender.SystemOut这个参数,“hello”仍然可以打印



出来。但是当我们移除PatternLayout(格式化布局器),它仍然提示我们缺少输出流。这非常奇怪。


如果我们更仔细的阅读文档会发现,默认的ConsoleAppender构造器是“未配置(输出流)”的,但是这点并不显眼也没啥益处。在log4j中,这点更像是一个bug或者至少也是前后矛盾的。


通过更多的谷歌搜索以及阅读文档和测试,我们最终以列表8-1代码来结束这个示例。


我们已经对log4j的工作方式有了一些了解。我们将这部分知识展现在一个简单的单元测试集中。


Listing 8-1


LogTest.java


public class LogTest {

private Logger logger;

@Before

public void initialize() {

logger = Logger.getLogger("logger");

logger.removeAllAppenders();

Logger.getRootLogger().removeAllAppenders();

}

@Test

public void basicLogger() {

BasicConfigurator.configure();

logger.info("basicLogger");

}

@Test

public void addAppenderWithStream() {

logger.addAppender(new ConsoleAppender(

new PatternLayout("%p %t %m%n"),

ConsoleAppender.SYSTEM_OUT));

logger.info("addAppenderWithStream");

}

@Test

public void addAppenderWithoutStream() {

logger.addAppender(new ConsoleAppender(

new PatternLayout("%p %t %m%n")));

logger.info("addAppenderWithoutStream");

}

}




既然现在我们已经了解了怎样对一个简单的控制台日志输出器初始化,那么我们就可以将其封装到我们自己的日志输出器中,以便应用中其他部分能够与log4j边界接口隔离开来。

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/50353014

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
机器学习/深度学习 人工智能 安全
面向企业的 ChatGPT 究极手册:第九章到附录 A
面向企业的 ChatGPT 究极手册:第九章到附录 A
72 0
|
8月前
|
Linux Go 数据库
技术阅读摘要 - 1.十二要素应用原则
十二要素应用原则(The Twelve-Factor App) 在如今的微服务领域非常流行,相信大家或多或少有所耳闻,但了解其中细节的并不多。 今天,我将对这12个原则做一个概要分析,结合Go语言中的相关例子,根据开源与大厂的具体实践,和大家一起看看个中究竟。
27 0
|
缓存 Kubernetes 算法
公开下载 | 300+页《服务端开发与面试知识手册》,12.8w字经典架构知识
公开下载 | 300+页《服务端开发与面试知识手册》,12.8w字经典架构知识
565 0
|
存储 SQL XML
搜索引擎项目开发过程以及重难点整理(一)
搜索引擎项目开发过程以及重难点整理(一)
426 0
搜索引擎项目开发过程以及重难点整理(一)
|
SQL 自然语言处理 搜索推荐
搜索引擎项目开发过程以及重难点整理(二)
搜索引擎项目开发过程以及重难点整理(二)
124 0
搜索引擎项目开发过程以及重难点整理(二)
|
前端开发
带你读书之“红宝书”:第三章 语法基础(上)之 关键词后续
带你读书之“红宝书”:第三章 语法基础(上)之 关键词后续
81 0
带你读书之“红宝书”:第三章 语法基础(上)之 关键词后续
|
传感器 前端开发 安全
【宝典】开发人员常见英语术语,掌握后,效率提升N倍(持续更新...)
【宝典】开发人员常见英语术语,掌握后,效率提升N倍(持续更新...)
130 0
|
机器学习/深度学习 算法 知识图谱
重磅 | 19 页花书精髓笔记!你可能正需要这份知识清单
重磅 | 19 页花书精髓笔记!你可能正需要这份知识清单
298 0
重磅 | 19 页花书精髓笔记!你可能正需要这份知识清单
网友提问:当我要使用一个陌生的标准BAPI,我可以去哪里找到比较详尽的文档指导一类的资料
网友提问:当我要使用一个陌生的标准BAPI,我可以去哪里找到比较详尽的文档指导一类的资料
网友提问:当我要使用一个陌生的标准BAPI,我可以去哪里找到比较详尽的文档指导一类的资料