合成监控(SyntheticMonitoring)

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/SyntheticMonitoring.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-26
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

合成监控(也称为语义监控 [1])会定期对线上生产系统执行应用程序中自动化测试的一个子集。其结果会推送到监控服务,如果失败则触发警告。这项技术结合了自动化测试和监控以便能检测生产环境中失败的业务需求。

在小型独立服务和频繁部署的时代,很难用与后面会出现在生产环境上完全相同的版本组合来测试预生产环境。缓解这个问题的一个途径是将可测试性从预生产环境扩展到生产环境 -- 即生产环境上的QA背后的想法。这样做,可把思维模式从关注平均故障时长(MTBF)切换到关注平均修复时间(MTTR)。

对于大部分F的类型,平均修复时间 > 平均故障时长。 -- John Allspaw


继续阅读»»»

持续集成认证(ContinuousIntegrationCertification)

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/ContinuousIntegrationCertification.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-22
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

持续集成是软件开发中一项流行的技术。很多开发人员在会议上讨论他们如何使用它,并且持续集成工具在大部分开发组织里很常见。但我们都知道任何正规的技术都需要认证流程 -- 而幸运的是确实存在那么一个。它由持续交付和devops最杰出的专家之一开发而来,以显著快速的管理而闻名,但对其结果非常有见解。尽管它很成熟,但它没有得到应有的流行,所以作为这项技术的粉丝之一,我觉得和读者分享这个认证流程对我来说是件重要的事情。准备好得到持续集成的认证了吗?你会如何处理测试过程中揭露的令人震惊的事实呢?

到现在,我以往的读者会在想他们是不是看到了一篇恶搞的博客 [1]


继续阅读»»»

隐藏的精度(HiddenPrecision)

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/HiddenPrecision.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-22
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

有时当我在处理某些数据时,这些数据比我想象中的更精确。有人可能会觉得这应该是件好事,毕竟精确度是有益的,所以越精细越好。但隐藏的精度可能会导致一些微妙的缺陷。

const validityStart = new Date("2016-10-01");   // JavaScript  
const validityEnd = new Date("2016-11-08");  
const isWithinValidity = aDate => (aDate >= validityStart && aDate <= validityEnd);  
con

继续阅读»»»

自封装(SelfEncapsulation) - Martin Fowler博客

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/SelfEncapsulation.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-17
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

自封装

数据封装是面向对象风格的核心原则。这表明一个对象的字段不应该公开地暴露,而是来自对象以外的全部访问都应该通过访问器方法(getter和setter)。有些语言允许公开访问的字段,但我们通常提醒程序员不要这样做。自封装(Self-encapsulation)更进了一步,意味着全部对于数据字段的内部访问同样也应该通过访问器方法。只有访问器方法本身才能接触到这些数据变量。如果数据字段不暴露给外部,这就意味着要添加额外的私有访问器。

以下是一个合理封装的Java类的例子。

class Charge...  
  private int units;
  private do

继续阅读»»»

函数即对象(FunctionAsObject)- Martin Fowler博客

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/FunctionAsObject.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-13
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

函数即对象

在编程中,对象的基本概念是绑定数据和行为。这为编写一系列相关函数时提供了一个公共的数据上下文。它还提供了一个用于操纵数据的接口,让对象可以控制对此数据的访问,使得支持衍生数据和预防无效的数据修改变得容易。很多语言提供了明确的语法来定义类,一如作为对象的定义。但如果你有一个支持一等函数(first-class functions)和闭包的语言,你可以通过函数即对象模式(最初由Eugene Wallingford提出)使用这些构造器创建对象。

这是一个简化的person对象例子,在JavaScript中通过使用函数即对象风格来完成。[1]

function createP

继续阅读»»»

值对象(ValueObject)- Martin Fowler博客

/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/ValueObject.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-10
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

编程时,我发现把东西表示成一个组合物是很有用的。一个二维坐标由x和y组合。一定数量金额由一个数值和一种货币组成。一个日期范围由开始和结束日期组成,而日期又可以由年、月、日组成。

当我这样做的话,我就会遇到了两个组合物是否是一样的问题。假设我有两个都是表示笛卡尔坐标(2,3)的point对象,把他们当作是相等是有意义的。根据其属性来判断相等性的对象被称为值对象,在这里的属性就是他们的x和y坐标。

但除非我在编程时很小心,不然在我的程序里可能得不到那样的效果。

比如想在JavaScript表示一个坐标。

const p1 = {x: 2, y: 3};  
const p2 =

继续阅读»»»