如何做客户端功能模块的设计

最近大家在对通讯录相关功能进行重构, 我想拿这个做个例子跟大家讲一下如何做具体的某个功能模块设计(不了解上下文的,可以参考微信的通讯录以及聊天功能)。

理解功能需求

这个是做好设计的第一步。需要完整的理解功能需求, 包括功能的主要跳转流程,有哪些相关功能模块,有哪些类似功能,异常情况考虑是否完备等等。

拿通讯录来说,会涉及到如下模块:

  • 通讯录列表
  • 群组列表
  • 商会通讯录 (类似于通讯录的一个界面)
  • 联系人选择 (发起群聊,从联系人添加)
  • 最近聊天列表

等等。

抽象

接下来对相关的功能进行抽象,发现这些界面有类似的功能:

  • 列表展示 都有列表展示功能,只是各个列表的数据源和具体每个cell展示形式不一样。
  • 即时搜索/搜索列表展示 都有即时搜索功能, 只是各个具体展示不一样。
  • 列表分组 有的列表有按首字母分组的功能。

所以我们可以很自然的抽取出SearchableViewController 和 SearchableViewModel这两个基类,然后让其它列表都继承自该基类。

经过合理的抽象, 基本上可以得到相关的类图, 定义每个类的职责以及Public API.

考虑可能的扩展

  • 消息列表 后续可能引入对历史消息记录的搜索。
  • 扩展到更多的搜索类型
    • 数据类型不一样
    • 展示方式不一样
    • 结果组织不一样
  • 更多的搜索源 : 本地搜索 + 远程搜索
  • 索引: 为了提高性能

考虑到这些扩展,我们很自然的可以抽象出ISearchableItem, ISeachDataSource 这两个类。

好的设计实践

  • Design by Contact
  • Don’t repeat your self
  • Law of Demeter

好的设计原则 Solid Pricinples

  • Single Responsbility Principle
  • Open for extension, closed for change
  • Liskov Substitution Principle
  • Interface Segregation Principle
  • Dependency Inversion Principle

广告

招聘从一线城市回到武汉的iOS, 前端,服务器端,C++ 工程师, 详情请点击 Hiring

留言

本站总访问量

留言