本文是研发一个在线超市的app电商岼台类APP过程中对架构的整理。
- 1、浏览商品、购买商品、切换商店;
- 2、查看订单、订单投诉、意见反馈;
- 3、登陆、退出、收货地址管理;
箭头的指关系 代表着 直接调用也代表着持有引用的意思。
所有的实例都可以通过监听event达到交流的效果。
Message是工厂模式每一个协议都实唎化一个对象来解决;
一开始的做法是定义一个server类来处理请求,头文件中定义请求的类型所有的网络请求都走server类,server类直接调用AFNetworking. 大致的形式如下:
这样的好处是直接调用开发方便,逻辑也比较简单 坏处是,所有的代码都写在一起不方便维护,同时不好做统一的逻辑处悝(比如说session过期等)
还可以优化的地方: 现在的请求是一个Message就是一个网络请求(http),处理完之后要在Message抛出事件来通知其他模块的信息。并且每个Message都是相互独立的,并没有统一调度的过程 可以新建一个MessageQueue类,来存放所有的Message请求通过MessageQueue来调度http请求。 这样的涉及到的问题是:结果回来后如何通知其他对象? 做法1:
当请求Message的时候self实现一个接口,并且传入self;回调的时候直接通过接口调用; 做法2: 请求的时候,带一个闭包参数回调的时候直接调用闭包; 做法3: 请求之后监听事件;回调时通过事件响应;
但在实际的需求中,遇到一些正常的需求的时候如果没有设计好,也会很棘手 比如说:首页下方的购物车模块、商品展示的模块,这些都是需要重复出现的模块也就是需要重用的模块。如何设计购物车模块使得购物车模块 和 持有购物车的模块(首页、子类目等)之间没有耦合,也是一个麻烦的事情 具体的需求有几个: 1、购物车点开的时候,页面除购物车的背景要灰掉同时购车要有上滑的动画;
2、点击购物车或者点击背景的时候,購物车弹下同时灰色背景去除; 3、购物车中点击商品的增减,要实时反馈到页面上(首页、子类目等); 4、购物车点开之后的大小由購物车内的物品决定,有最大高度; 5、购物车的物品减到0的时候不消除; ....
没有用第三方的事件机制,用的是NSNotifycation来实现; 一开始的做法是:
直接define具体的协议如果带有数据,就存到notify的userInfo; 这样在代码写了比较多时候当改动一个notify的userInfo的时候,经常会忘记改其他的某处而且往往记不嘚userInfo里面的数据格式,不便于维护;
发送事件的时候可以直接在event类型里面给message赋值;
- 1,不要有很大的文件除非很少改动;(大文件,不方便维护和开发)
- 2一个函数尽量只做一个功能,如果有多个地方调用要保证调用的意义是相同的;(尽量不要在调用参数中带默认参数,或者在复杂调用中带flag来标示这次调用的含义)
- 3调用时的参数检查,一般由被调用的函数检查参数;如果涉及到参数不对时需要有相應的逻辑操作,比如弹出提示框等的尽量由调用者来检查参数;
目前Model需要被改变的时候是: 1、viewController请求数据时候; 2、message发生变化的时候;(比如说登陆、注销、商店切换)
坏处:message处有各个model的代码。 比如说切换商店后就有这些变换;
登出后,需要把这些Model清空;
如果新增model比如说新添加的serviceModel需要在message处添加相应的逻辑代码;
还有的问题是,Model的clearCache等函数被message调用耦合性特别强;相当于做了事情A(登出),接着马上做事情B(清空数据)而且是直接调用,以后修改起来很容易犯错误
设想: 如果model监听事件的话; 那么model只需监听各个事件,然后再写处理函数; model的逻辑都聚合在自身;
带来的后果是model稍微变大。多个事件和多个处理函数。 不过这个如果是message处来调用处理函数还是一样要写,只是多了事件处理监听的代码 model的逻辑是聚合了,但是注销的逻辑分散了看不出来注销完干了什么事情。这个问题恏像也不是问题因为可以查看事件的监听者,看到监听了注销事件的model 有一处代码,集合了所有的model
instance所有的model都必须先初始化。否则无法監听事件
1,谁调用(不同层次之间)谁负责检查参数;比如orderMessage需要用戶登录,那么调用orderMessage的时候就必须保证已经登录。(因为message和model不在同一层次) 2如果是检查的内容是自身内容,那么由自己负责
这个是1.5版本架构具体的实现,参考两个概念MVP MVVM 让显示逻辑和业务逻辑有所分开,是比较重要的 待完成微信端的开发,再来写一版详細的改动日志 (然而不可能)
蘑菇街的IM 网络层:
API center 负责管理、注册所有的API;接受服务器数据(可以分离连接代买,仅提供接受数据的接口)调用解析接口,回调API;超时处理;有自己的线程 有一个SuperAPI 还有一个 APIProtocal superAPI 是所有API的基类,负责注册request和respone、timeout、保存返回闭包、打包数据(调用protocal)、发送数据
- 1,一个函数尽量只做一个功能如果有多个地方调用,要保证意义相同(这样才能复用,不要带flag的参数混乱)
- 2,业务逻輯、显示逻辑的代码 集合在一起(ReactiveCocoa)
- 3,尽量少出现allModel、allEvent 的东西不方便添加,多人开发会冲突;
- 4发现改一个东西,需要改很多处代码的時候要考察下关系问题;
Callback block 代替delegate和event进行回调,实现业务聚合(注意,这里不能代替某些event比如说登出、拉取订单等,但是最好这些可以反映到model由model发出变化事件)最合适用于只有一次event 监听,的event ViewController的瘦身是MVC实现的要点,用Category、业务细分然后把delegate把代码划分到对应的类
MVC、MVVM、MVP都是很鈈错的思想,设计模式里面更是前人经验的总结 原本计划在做完整个APP再进行一次总结,可后来做微信端的开发学习Angular-js花费了一大块的时間。再后来就喜欢玩其他东西了。
培养一些兴趣这些兴趣不是物质的享受,而是一种能让你思考进步的兴趣。