移交工程给其他开发者时,如果需要花大半天时间去讲解代码,做所谓的「对接」,就得思考一下这工程开发得是否足够失败了。

个人觉得工程开发其实和做产品没有差别,一个目的就是让用户更方便地使用,在工程开发中,「用户」实际上就是除自己以外的开发者。

非常喜欢 Objective-C 的命名方式,配合 Xcode 智能而优雅的编辑功能,实际开发中,对大部分方法几乎不需要额外查阅文档,长长的方法名使使其表征意义一目了然。这应该就是 Objective-C 的体验观吧。

现象

说说在 Android 开发中看到的一些现象

Handler 的滥用

作为一个消息传递机制,Handler 主要是为了解决多线程的问题。在同一个 UI 线程中,把明明可以直接执行的方法经过消息机制绕了一圈才调用,接盘的开发者不明就里,应该是可以感觉到满满的恶意的。

基类的滥用

dry,本来是一件好事情。所谓基类,顾名思义所有派生类共同的东西,才能存在在基类之中。基类的滥用,会给后期解耦带来十分大的困难。

接口不规范

接口不规范,导致的问题就是,啥事都得问其他人,或者仔细阅读代码,默默地就损失了很多时间。

方案

大多用户都不知道自己要做什么,没有被引导、被约束的用户是迷茫的。

引导

  • 良好的,广泛流传,约定俗成的命名方式
  • 逐步求精的代码结构

约束

当前的环境下,靠用户(开发者)的自觉性已经不适用了;放任存在隐患,倒不如提前做好约束。

最小权限

只给开发者满足开发的最小权限。

一个手表,不会让你直接拨动表盘去调整时间。

于是一个类的成员,能 private 的就不需要 public;基类更是如此。约束调用方式,就是为了避免滥用。

最小权限,在协同工作中意义重大。很直观的,在服务器维护中,信任人品,也得防止误操作吧。

明确调用

举个例子,在 T1Activity 中通过 intent 传参数启动 T2Activity,常用的方式如下:

1
2
3
4
Intent intent = new Intent(this, T2Activity.class);
intent.putExtra("key1", "value1");
intent.putExtra("key2", "value2");
startActivity(intent);

好,那现在需要在 T3Activity 中启动 T2Activity。对于 T2Activity 需要的参数,是全局搜代码并且阅读 T2Activity 呢;还是去询问原作者?而且手抖误删了一行 putExtra 呢?

无论是哪种方式,都是损失效率的。

实际上,大可以在 T2Activity 中明确启动方式。

Objective-C 常用的命名方式是这样的

1
2
3
4
- (id)initWithValue1:(NSString *)value1 value2:(NSString *)value2
{

}

Android 中可以在 T2Activity 中这么写这么一个静态函数

1
2
3
4
5
6
7
public static void initWithValue1AndValue2(Context context, String value1, String value2)
{
Intent intent = new Intent(context, T2Activity.class);
intent.putExtra("key1", value1);
intent.putExtra("key2", value2);
context.startActivity(intent);
}

在任何界面需要启动 T2Activity 时,都可以调用 T2Activity.initWithValue1AndValue2 方法,这样,就把需要传递的参数约束好了。

嗯,对于各种网络请求的接口定义更是如此;以明确调用作为约束,方便自己,方便他人。

…………

有新的体会再做更新