用分层结构打造苗条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年,甚至现在,从某种程度上讲,每一个项目都把我带进了未知领域。有太多太 多不同的技术,并且新技术正以如此


继续阅读»»»

写给小团队的软件发布管理

/**
 * 谨献给会“越狱”的小黑
 *
 * 原文出处:https://www.toptal.com/devops/guide-release-management-for-small-teams
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-04-02
 */

使发布管理流程正规化(如果还没有的话)

在某些团队配备里,尤其是那些在初创公司的,当发布一个新产品版本时,既没有DevOps也没有基础设施工程师来提供支持。

况且,不像有着定义正式流程的大型官僚公司,在初创公司的CTO或者软件开发团队的一把手并不总是可以意识到 软件发布管理流程的复杂性;在公司的少数开发人员可能意识到了流程的复杂细节,但并不是每个人。如果没有很 好地文档化这块知识,我相信会导致不少困惑。

在此篇文章中,我会尝试专门从开发人员的视角,提供关于如何正规化发布流程的一些技巧。

进入软件发布清单

你可能了解写给某些外科专家的清单概念,根据由阿图•葛文德编著的《清单革命》一书。 我相信一个正规的发布流程(像软件开发


继续阅读»»»

如何引导和创建.NET项目

/**
 * 原文出处:https://www.toptal.com/dot-net/bootstrap-and-create-dot-net-projects
 * @author dogstar.huang <chanzonghuang@gmail.com> 2016-03-22
 */

创建.NET项目

使用Visual Studio向导创建一个.NET项目就像嗖一下那么简单。去到文件 => 新项目,或者``添加新项目```到一个已有的解决方案。 一旦新项目创建好后,你就可以马上进行编码了。然而,由向导产生的默认项目配置对于专业的团队是很难接受的,因为他们设定的质量太 低了。况且,也没有向导可以知道你需要在特定开发环境所执行的其他启动步骤。

在此篇文章中,我会带你走进若干个重要的、当你一旦创建项目就应该开启的配置,这对于最小化未来的技术债务很重要。同时,我们还会 回顾很多.NET开发人员在他们构建解决方案和新项目时会应用的一些通用实践。即使你没有应用其中 的某些想法,学习和大致了解一下大部分团队所做的也是很不错的。

结构

拥有一个良好定义的结


继续阅读»»»