(下)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

精简语法

当前的实现还有最后一个地方让人揪心——在配置代码块里不得不重复配置每一行。恰如其分的DSL都应知道,配置代码块里的所有东西将在配置对象的上下文内执行,并且这样可以实现同样的效果:

MyApp.configure do  
  app_id "my_app"
  title "My App"
  cookie_name "my_app_session"
end  

来,撸起袖子继续加油干!从表面上看,需要做两件事。首先,需要一种方式来执行在配置对象上下文内传递给configure的代码块,以便在代码块的方法调用作用于那个对象。其次,要修改访问器方法,以便做到有一个参数时就写入该值、没有参数时就读取。一个可能的实现是:

module Configurable  
  def self.with(*attrs)
    not_provided = Object.new

    config_class = Class.new do

继续阅读»»»

(上)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

领域特定语言(DSL)是一个强大到令人难以置信的工具,因为它把编写或者配置复杂的系统变得更为简单。同时它们无处不在——作为一名软件工程师,你很可能在日常事务中使用了多种不同的DSL。

在这篇文章,你将会学习到什么是领域特定语言,什么时候应该使用它们,以及如何使用Ruby的高级元编程技术创建你自己专属的DSL。

此文章基于Nikola Todorovic发布在Toptal博客上关于Ruby元编程的介绍,如果你是初次接触元编程,请先阅读一下那篇文章。

什么是领域特定语言?

对于DSL的普遍定义是,它们是某一特定应用域或用例的专门语言。这意味着,你只能在指定的方面使用DSL——它们不适合普遍目的的软件开发。如果这听起来有点虚,是因为——DSL本来就千奇百怪。以下是一些重要的分类:

  • 标记性语言,例如HTML和CSS设计用于描述类似结构、内容、网站页面风格这些指定的事物。标记性语言不能用于编写任何算法,所以它们适合DSL的描述。

  • 在某


继续阅读»»»

Twitter数据挖掘:如何使用Python分析大数据

原文请见Twitter Data Mining: A Guide to Big Data Analytics Using Python

大数据无处不在。在时下这个年代,不管你喜欢与否,在运营一个成功的商业的过程中都有可能会遇到它。

本教程将会简要介绍何谓大数据,无论你是尝试抓住时机的商人,抑或是寻找下一个项目的编程高手,你都可以学到它是如何为你所用,以及如何使用Twitter API和Python快速开始。

何谓大数据?

大数据就像它看起来那样——有大量的数据。单独而言,你能从单一的数据获取的洞见穷其有限。但是结合复杂数学模型以及强大计算能力的TB级数据,却能创造出人类无法制造的洞见。大数据分析提供给商业的价值是无形的,并且每天都在超越人类的能力。

大数据分析的第一步就是要收集数据本身,也就是众所周知的“数据挖掘”。数据来自于四面八方。大部分的企业处理着GB级的数据,这些数据有用户数据、产品数据和地理位置数据。在本教程中,我们将会探索如何使用数据挖掘技术收集Twitter的数据,这可能会比你想象中的更有用。

举个例子,假设你运营着脸书,想使用Mes


继续阅读»»»

服务端I/O性能大比拼:Node、PHP、Java和Go

原文请见:Server-side I/O Performance: Node vs. PHP vs. Java vs. Go

理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应用程序的负载逐渐上涨,采用错误的I/O模型有可能会让你到处踩坑,伤痕累累。

正如大部分存在多种解决途径的场景一样,重点不在于哪一种途径更好,而是在于理解如何进行权衡。让我们来参观下I/O的景观,看下可以从中窃取点什么。

在这篇文章,我们将会结合Apache分别比较Node,Java,Go,和PHP,讨论这些不同的语言如何对他们的I/O进行建模,各个模型的优点和缺点,并得出一些初步基准的结论。如果关心你下一个Web应用的I/O性能,那你就找对文章了。

I/O基础知识:快速回顾

为了理解与I/O密切相关的因素,必须先来回顾在操作系统底层的概念。虽然不会直接处理这些概念的大部分,但通过应用程序的运行时环境你一直在间接地处理他们。而关键在于细节。

系统调用

首先,我们有系统


继续阅读»»»

用分层结构打造苗条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")

}

当你将一个样本对


继续阅读»»»