用分层结构打造苗条MVC框架

原文请访问:Maintain Slim PHP MVC Frameworks with a Layered Structure

基于诸如Yii和Laravel这样MVC框架的一个必然问题就是:臃肿的controller(控制器)和臃肿的model(模型)。而使控制器和模型变得臃肿的主要东西就是这些框架中强大而又必要的组件 -- Active Record。

问题:违反了单一职责原则的Active Record

Active Record是一个架构模式,一种访问数据库中数据的方式。由Martin Fowler在他2003年的《企业应用框架模式》一书命名并广泛应用在PHP框架中。

尽管它一是个非常必要的方式,然而Active Record(AR)模式违反了单一职责原则(SRP),因为AR模型:

  • 处理了数据查询与数据存储。
  • (通过关系)知道了系统中太多其他的模型。
  • 经常在应用的业务逻辑中直接调用(因为数据存储的实现与业务逻辑的表达密切相关)。

当需要尽快创建一个应用原型时,违反SRP对于快速开发来说是一桩好的交易,但当应用成长为一个中等或者大型项目时,


继续阅读»»»

合成监控(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

继续阅读»»»

印度朋友手把手教你学Scala(10):Scala里的样本对象

/**
 * 谨献给我最爱的YoYo 
 * 原文出处:https://madusudanan.com/blog/scala-tutorials-part-10-case-objects-in-scala/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-14
 */

本翻译已征得Madusudanan.B.N同意,并链接在原文教程前面。

样本对象

我们已经学习了对象样本类。样本对象是这两者的合体,即它是一个类似对象的单例并且有在样本类中大量的和大量的样板。唯一的区别是,样板是为一个对象而不是一个类完成的。

这是关于Scala系列教程的第十章。点击这里可查看整个系列。

目录

  • 简介
  • 样本对象和样本类
  • 样本对象的优势
  • 结论

简介

如果你需要针对样本类的样板,样本对象是非常有用的。

它们可以这样创建。

case object CaseObjectDemo {

  println("I am a case object")

}

当你将一个样本对


继续阅读»»»

印度朋友手把手教你学Scala(8):特质

/**
 * 谨献给我最爱的YoYo 
 * 原文出处:https://madusudanan.com/blog/scala-tutorials-part-8-traits/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-13
 */

本翻译已征得Madusudanan.B.N同意,并链接在原文教程前面。

特质

这是关于Scala系列教程的第八章。点击这里可查看整个系列。

目录

  • 特质简介
  • 一个基本的特质 - 语法解释
  • Java的抽象变量概念
  • 抽象变量的类型注解
  • 混合抽象和具体成员
  • Java语法区别
  • 扩展特质
  • with关键字
  • 混入类的组成
  • 结论

特质简介

对于Scala,特质就像样本类那样,是一个新的概念。它们补充了OOP中已有的特性。

理解特质一个更好的方式是把它和Java语言的特性进行比较。

它们类似于接口,但它们可以有方法的实现,它们像抽象类一样工作,除了特质没有构造函数外。

最好的方式是通过例子来了解他们。所以,让我们来


继续阅读»»»

函数即对象(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 =

继续阅读»»»

印度朋友手把手教你学Scala(7):无处不在的对象

/**
 * 谨献给我最爱的YoYo 
 *
 * 原文出处:https://madusudanan.com/blog/scala-tutorials-part-7-objects-everywhere/
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-06
 */

本翻译已征得Madusudanan.B.N同意,并链接在原文教程前面。

无处不在的对象

在这篇文章中,我们会讨论为什么Scala中对象的概念更为普遍,以及它的优点是什么。大部分示例是数据类型,因为它们是Scala语言的基础。

这是关于Scala系列教程的第七章。点击这里可查看整个系列。

目录

  • 简介
  • 作为对象的数据类型
  • 类型的操作
  • 创建自定义类型
  • Java数据类型装箱/拆箱的比较
  • Bigint例子
  • 类型转换(Typecasting)
  • 值比较
  • 在其他语言的实现和一些注意事项

简介

Scala是一种多范式语言,主要是结合了面向对象和函数式。

为了支持这种语言,有必要制定一个围绕什么东西而构建的想法。正


继续阅读»»»