为何要避免全局变量

封装 测试 模块化 全局变量

在所有的设计实践中,全局变量是使用起来最简单的,被坑到时也是最沉痛的。 但有没有发现很难解释为啥不用全局变量? 大概是全局变量对设计的副作用并非立竿见影,而是比较远,比较曲折。

Harttle 在一个年味很浓的晚上,试着推演全局变量问题,本文用来在日后说服别人。

继续阅读

适当地引入防卫性编程

JavaScript 封装 接口 重构 弱类型

Anything that can go wrong will go wrong. – Edward Murphy

防卫性编程(Defensive Programming) 是指限制对程序的不可预见的使用,增加软件的安全性。 防卫性编程在程序鲁棒性、可维护性上都有帮助,尤其是在你不幸地选择弱类型语言编写源码时。

在 C++ STL 程序设计中,我们称函数模板和类模板为 隐式接口,这些接口描述了编译期多态。 在 JavaScript 中,接受一个对象时也不需要声明其类型,只有后续对它的使用方式描述了它的接口。 Harttle 把 JavaScript 中的这一现象称为 隐式接口

继续阅读

AIY Voice Kit 初体验

Raspberry GPIO UART

AIY Voice Kit 是 Google 自然语言识别的一个 Demo 项目,是一个由小纸盒包装的智能设备。 上个月朋友从美帝寄来一套,Harttle 却刚有时间把它组装起来,写这篇文章分享给喜欢折腾的同学。

Voice Kit 自带了麦克风和扬声器,借助 Google Assistant 可以实现类似 Siri 的人机对话,比如问问天气啊交通啊。 此外,由于整个系统基于 Raspberry Pi,而且配备了很棒的扩展板,比原生的 Pi 能做更多的事情。

继续阅读

Deep Linking:从浏览器调起 APP

URI-Scheme Universal-Links App-Links Intent iOS Android

Deep Linking 只是一个概念, 是指通过一个链接进入另一个网站/App,并直接浏览其内部的某个页面。 Deep Linking 给用户带来的是非常顺滑的浏览体验,尤其在 Web 世界中 Deep Linking 的实现非常容易。

但如果要进入 App 并定位到对应的页面则较为困难,URI Scheme, Universal Links, Android App Links, 以及 Chrome Intent 都是为了解决从 Web 页面 Deep Linking 到 App 而做的尝试。 本文从 Web 一侧的视角总结调起 App 的各种实现方式,能达到的效果,以及对应的兼容性问题。

继续阅读

合理地设计 URL

HTTP URL 路由

URL 是 Web 三大基石之一,在 Web 开发、运维和使用过程中随处可见。 而且在 Web 开发中遇到的第一个设计问题,可能就是 URL 的设计。 在很多 MVC 架构下的开发者眼中它的作用却只是路由到一个控制器,这正是一切罪恶的开端。

继续阅读