FileKit 是我今天看到的一个库, 本来还以为是一个 iOS 的文件管理框架, 我想想无非就是 iOS bundle 内的那几种文件夹, 这种东西一查就知道了, 但是显然的, 它其实是为了 swift 在 cocoa 和 linux 上使用而出现的, 当然既然是工具类库, 其实也就应该没有什么高深的知识了, 有的是作者对我们操作的各种封装, 工具的好坏我感觉也就是 效率和功能, 所以如何能找到痛点, 并且以 简洁 高效 优雅 的方式写出来, 这就是考验我们功力的地方了. 正好, 今天我就来说一下如何写出一个好的工具.
工具需要/能够帮助我们做什么
工具能够帮助我们的就是把复杂的事情变得简单, 把啰嗦的事情变得简洁.
举文件管理的一个简单例子, 我们要实现某个对象和文件的读写的时候,往往要先把对象转化为一个 data, 然后再进行文件存储, 那么其实这个过程在我看来就是啰嗦的.
说到这里, 就该说到我所认为的工具应该有的样子是什么呢:
就是输入参数 得到结果
工具隐藏了所有的中间状态, 因为那些并不是我所关心的, 一个对象是否需要变成 data 我不关心, 保存是否成功才是我所关心的. 而且我希望的能够重复的在不同地方都可以使用这个工具
那么我们说到这里其实已经说出了工具核心 -- 封装和复用
, 这里的封装就不用多说了,就是把代码扔到函数中, 而复用我要用我自己的理解说明一下, 我所理解的复用是工具的方法的调用不应该相互影响, 这个就有点函数式编程的味道了, 无状态. 当然, 这个核函数式编程还是千差万别的.
虽然我上面说工具不应该相互影响, 但是这个也是相对的, 在为了效率的前提下, 我们往往要对工具做一些配置, 或者对线程进行一些调度, 或者把同时运行的相同的工作合并起来, 这些都是我们要考虑的.
那么如何写好一个工具呢
如果一定要强行给好的工具加一些特性的话, 我觉得我们应该从这几个方面进行思考和优化
- 从需求分析
上面其实已经简单的说了一下, 工具就是把我们的操作封装起来, 那么我们到底到把那些操作封装呢, 这是一个问题, 我的理解就是- 第一种情况是把那些使用频次很高的操作组合进行封装
- 第二种情况就是把逻辑或者操作复杂的操作进行封装
- 如果一定要把什么东西都凑成 3 的话, 那么第三种情况我认为就是把枯燥的/或者不适于人类做的事情使用工具, 比如说大段文的本修改或者对某些事物进行监听
- 从使用者的角度出发
工具好不好用, 不仅要看他能不能满足我的需求, 其次当然也要看用起来爽不爽- 对开发者友好是个很重要的前提, 如果你这个工具很好很吊,但是完全没有文档,难道你希望使用者自己去看源代码吗,显然是不可能的,所以好的借口设计和文档是好的工具必备属性
- 使用者都是贪心的, 他们往往希望一个工具能够满足他们所有的愿望, 所有的使用场景, 所有的需求, 所有喽, 满足他们, 尽可能的满足他们, 给他们自定义的权限, 尽可能的考虑所有的使用场景
- 不要把使用者想的太聪明, 所以不要对使用者传进来的东西深信不疑, 去验证这些东西, 当他们出现错误的时候也不要给使用者留下任何后患, 比如说发生错误的时候要清理所有的临时文件等等
- 最后要说点什么,恩,这个就是我最后的感触了了,就是作为一个工具要解决问题,要先集中一个方向去做,不要在很早的时候就试图去解决一些很大的问题,但是最后其实每一个小问题都不能很好的解决.