(下)高级元编程指南:创建一个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的描述。

  • 在某


继续阅读»»»

用分层结构打造苗条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对于快速开发来说是一桩好的交易,但当应用成长为一个中等或者大型项目时,


继续阅读»»»

Swift面向协议编程简介

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/swift/introduction-protocol-oriented-programming-swift
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-12-06
 */

协议是Swift编程语言中一个非常强大的特性。

协议用于定义“符合某个指定任务或者功能片的方法蓝图,属性,以及其他要求”。

Swift在编译时检查协议一致性问题,使得开发者可以在运行程序前发现代码中的一些致命错误。协议使得开发者可以在Swift编写灵活和可扩展的代码而不用妥协该语言的表现力。

Swfit通过提供一些最常见奇怪问题的解决方案以及许多其他编程语言的接口限制,进一步获得了使用协议的便利性。

通过面向协议编程,编写灵活、可扩展的Swfit代码。

在早期的Swfit版本中,只能扩展类、结构以及枚举类型,在很多现代编程语言里也是这样的。然而,自从Swift 2 开始,也能对协议进行扩展了。


继续阅读»»»

好代码的六条戒律:编写经得起时间考验的代码

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/software/six-commandments-of-good-code
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-10-16
 */

人类奋斗在计算机编程的艺术和科学大约只有半个世纪。与大多数艺术和科学相比,计算机科学在许多方面仍然只是一个小孩,走路会撞墙,给自己的脚绊倒,偶尔在桌子上扔食物。作为其相对年轻的结果,我不认为我们对什么是“好代码”的正确定义有所共识,因为该定义继续在演进。有些人会说“好代码”是具有100%测试覆盖率的代码。其他人会说,它超级快,有一个杀手级的性能,并能兼容运行在10年前的硬件上。虽然这些都是软件开发人员值得称赞的目标,但我尝试抛出另一个混合的目标:可维护性。具体来说,“良好的代码”是一个组织(而不仅仅是它的作者!)容易且易于维护的代码,并且活得会比编写它所用的sprint还要长。以下是我在职业生涯中,任职在美国或国外,在大公司或小公司,作为一名工程师发现的一些东西,这些


继续阅读»»»

从正确的方式开始测试你的Go应用

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/go/your-introductory-course-to-testing-with-go
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-08-11
 */

本翻译已被图灵社区转载至《码农·Just Go!(第27期)》

在学习任何新的东西时,具备清醒的头脑是很重要的。

如果你对Go相当陌生,并来自诸如JavaScript或Ruby这样的语言,你很可能习惯于使用现成的框架来帮助你模拟、断言以及做一些其他测试巫术。

现在,消除基于于外部依赖或框架的想法!几年前在学习这门出众的编程语言时,测试是我遇到的第一个障碍,那时只有相当少的一些资源可用。

现在我知道了,在GO中测试成功,意味着对依赖轻装上阵(如同和GO所有事情那样),最少依赖于外部类库,以及编写更好、可重用的代码。此Blake Mizerany的经验介绍敢于向第三方测试库尝试,是一个调整你思想很好的开始。你将看到一些关于使用外部类


继续阅读»»»

声明式编程:它是一个真实的东西?

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/software/declarative-programming
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-05-15
 */

目前,声明式编程是诸如数据库,模板和配置管理这样广泛而多样领域的主导范式。

简而言之,声明式编程由需要指导一个程序需要做什么,而不是告诉它如何做到组成。在实践中,这种方法需要提供一个用于表达用户想要什么,并通过屏蔽底层结构(循环,条件,任务)实现期望的最终状态的领域特定语言(DSL)。

虽然这种模式在其必要的地方是有着显著的改善,但我主张,声明式编程有明显的局限性,此限制我会在本文中进行探讨。此外,我建议双管齐下,既抓住声明式编程的好处,同时又取代其局限性。

警告这篇文章是多年来个人在声明工具中奋斗的结果。许多我在这里的说法都是没有彻底证明的,有的甚至基于事实价值。一个适当的、批评的声明式编程会花费大量的时间,精力,并且我要回到过去使用很多这样的工具;我的心是


继续阅读»»»

幕后的gulp:构建一个基于流的任务自动化工具

/**
 * 谨献给Yoyo
 *
 * 原文出处:https://www.toptal.com/nodejs/gulp-under-the-hood
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-05-14
 */

前端开发人员现在正在使用多种工具把日常操作自动化。三个最流行的解决方案是Grunt,Gulp和Webpack。每个工具都建立在不同的理念,但是它们共享同一个目标:精简前端构建过程。例如,Grunt是配置驱动的,而Gulp几乎不需要配置即可执行。事实上,Gulp依赖于开发人员编写代码来实现构建流程 - 各种构建任务。

当谈到选择这些工具之一时,我个人最喜欢的是Gulp。总而言之,这是一个简单,快速和可靠的解决方案。在这篇文章中,我们将看到幕后的Gulp是如何工作,通过花点心思在实现我们自己的像Gulp这样的工具。

Gulp API 接口

Gulp自带的只有四个简单的功能

  • gulp.task
  • gulp.src
  • gulp.dest
  • gulp.watch

这四个简单的功能


继续阅读»»»

给开发人员的10个前端设计规则

/**
 * 谨献给可爱的毛球
 *
 * 原文出处:https://www.toptal.com/front-end/front-end-design-principles
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-05-01
 */

作为前端开发人员,我的工作本质上是通过代码把设计转变成现实。理解,并且能够胜任是设计的重要组成部分。不幸的是,确切地理解前端设计,说起来容易做起来难。编码与美学设计需要一些非同寻常的技能。正因如此,一些前端开发并没像他们应该那样精通于设计方面,结果他们工作得步履维艰。

我的目标是给你一些来自于这些前端开发的容易遵循的规则和概念,他们可以帮助你从开始一个项目到完成一个项目,而不至于把设计者如此努力工作的项目给搞砸(或者甚至可能允许你通过体面的结果设计自己的项目)。

当然,这些规则不会在阅读一篇文章的时间内就能让你马上蜕变,但如果你能把他们应用到工作中,他们应该会产生很大影响。

1、在图形程序中干活

你完成了一个项目,并且从头到尾保持了设计文件中每一个


继续阅读»»»

你需要一位英雄:项目经理

/**
 * 谨献给不知什么时候能再见的小黑
 *
 * 原文出处:https://www.toptal.com/qa/you-need-a-hero-the-project-manager
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-04-23
 */

勇敢的、在内心有一个应用想法的、且在银行有一点钱的企业家啊,这篇文章是专为你而准备的。你在鸡尾酒 餐巾写下的图表将会影响整个世界,装满钱的大卡车已经派往你的房子。为了确保他们能按时到达,这里有一 些可使产品周期运转顺畅的简单建议。

为什么在首位需要一位项目经理

"计算机程序是人类制造的最复杂的东西",道格拉斯·克罗克福德说道。可能你没听说过这个名字,但对于程序 员来说他真的相当有名。他现在是一位贝宝资深软件架构师,并且开创了各种很酷的技术,此部分已超出本文 的范围。他是知道很多关于如何工作于大型项目的人。

就我个人而言,我已经编程了13年,甚至现在,从某种程度上讲,每一个项目都把我带进了未知领域。有太多太 多不同的技术,并且新技术正以如此


继续阅读»»»