三层分离的编程思

Posted fallever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三层分离的编程思相关的知识,希望对你有一定的参考价值。

好代码是天生的!
文章本天成,妙手偶得之。

作为是一个菜鸟,在编程上不懂的还有很多,抛弃高深的算法和广漠的技术底层,在我看来写代码和以前上学时写作文毫无差别。文章是把自己的所见所得附加上自己的思考以及感情用文字的形式表达出来,写代码也只不过把逻辑通过组织代码的方式来表达出来。关于在表达这一点上,甚至编程更要简单一些,大多时候不需要优雅的修辞手法,平铺直叙即可,并且这样的代码是更有益处的——方便他人理解。另外一点,一篇好文章的要点是:文章组织架构得体,段落核心明确,这和好代码的要点简直不要如出一辙!

回到正题,客户端是为了表现逻辑和进行交互而存在的,此外客户端还要与服务器进行同步,因而在客户端中可以剥离出三层代码出来:UI表现层,逻辑层,网络同步层。如下图所示:
技术分享图片

三层相互关系
UI表现层与逻辑层:UI层来表现逻辑层的数据,当用户进行UI操作后,改变逻辑层的数据。
逻辑层与网络层:通过通信协议来同步数据。
通常情况下,网络层和逻辑的交互比较容易,三层分离更多的是将UI表现层与逻辑层进行分离。
三层分离
  • 首先,三层分离的第一步是各个层的代码都应该在自己的层级中

UI表现的代码中只应该存在UI表现的代码及与逻辑层交互的代码,而不应该出现网络层的代码,因为UI层和网络层是不关联的,当UI产生交互需要与服务器同步时,UI先应该告诉逻辑层,然后由逻辑层处理,最后通过网络层的接口收发消息进行数据同步。

  • 其次,各个层应该尽可能地完成自己的任务

比如:一个简单加好友的流程,当UI层产生操作后,客户端需要服务器进行验证后才能进行下一步表现,客户端通过服务器的验证结果表现操作成功或操作失败。当然这个流程中还涉及到逻辑数据的变化,当服务器验证通过是,好友的逻辑中会新增一个好友数据,失败则不进行改变。一个不好的代码的流程是这样的:UI层产生操作后调用接口1获得服务器验证结果,通过验证进行下一步的UI表现,并且如果是服务器验证通过,则调用接口2在好友逻辑中新增一个数据。不好在哪里呢?不好在逻辑层没有完成自己本来的任务,而在UI层中节外生枝,逻辑接口2的任务本来是可以在逻辑层中完成,无需在UI层中调用此接口的,在接口1中当服务器返回验证结果后,就可以根据返回结果决定在是否调用接口2来增加好友数据,这个过程无需暴露给UI层,而上述不好的流程,不仅没有做好逻辑层与UI层代码分离,更是破坏了类的封装,无端地增加了耦合。

// 逻辑层接口1
public Result RequestAddFriend()
{
    // 向服务器发送请求并得到验证结果
     SendReq ... 
    
    // 返回验证结果 succ/fail
    return Restult;
}

// 逻辑层接口2
public void  AddFriend(Friend friend)
{
    // 好友模块多一个好友数据
    FriendData.AddFriend(friend)
}
  • 最后,打破各层之间不必要的关联

在有些情况下,UI上相同表现的东西在逻辑中处理起来可能是不同的,比如装备列表中穿戴在角色身上的装备和在背包里的装备,同样都是出售的操作,出售角色身上的装备时会多出处理玩家属性之类的逻辑,但是就表现来说,它们可能相同无异,都是UI的装备消失。因此一个好的代码分离是:UI表现和逻辑处理无关联,UI代码不在乎装备是否被穿戴,仅仅是进行UI表现,将要出售的装备UI进行隐藏,而在逻辑代码中关心装备是否被穿戴来进行其他的逻辑处理。而不好的代码则反之,UI中关心装备是否被穿戴,多了不必要的关联。

结语

马上要到年底,不出意外的话,这应该是我2018年的最后一篇博客了,所以写点额外的话吧。最近连续写了三篇博客,并不因为给自己加任务——为完成自己年初定下的多谢博客的目标,而是确实最近有动笔的欲望。写博客还是蛮花时间的,虽然我的博客毫无技术含量可言,但是哒哒哒的键盘敲着,不知不觉就一两个小时过去了。时间就像飞尘一般,不知不觉地又马上要翻过一年了,今年最大的感受是悲观——由心而生的悲观,对世界的悲观:2018可真不是太平的一年,2018要翻年前正好在读经济学入门的科普读物,看到经济危机差不多十年一个周期,还希望2018年可以平平安安,结果事与愿违,中国和美国开始了史无前例的贸易战,虽然知道近些年经济增长减缓,但是总觉得贸易战的开始加上房地产的泡沫不知道会给未来的经济带来可怕的影响,内心一直对未来很悲观,也许有的人觉得我是咸吃萝卜淡操心,但是不知怎地,我就是对此很悲观;对行业的悲观:2018年也是游戏行业的寒冬,资本市场的冷却、版号审查的暂停、手游模式无创新、玩家口味越来越挑剔、游戏大厂对手游市场的割据……这些所有的因素加起来,很容易让人感觉行业的未来没有希望;对项目的悲观:我们的项目是一个小游戏,但是却冗杂了一堆杂七杂八的东西,人力有限却花了很多时间在非核心功能开发上,核心功能不完善,核心流程不流畅,在公司我只是个Coder,策划说做啥功能,我也只在将策划案变成游戏里的功能,但是工作之余,难免会想自己做的项目到底算不算好游戏?我的答案是否定的。除此之外,因为游戏在Taptap测试评分还不错,总感觉公司的人被评分蒙蔽了,没有看到游戏深藏的问题所在,这也是我心生悲观的原因之一;对自己的悲观:感觉自己现在也很迷,不知道接下来怎么去寻找突破口,作为一个“社会主义三无人员”,现实的问题需要解决,但是一切都好难啊!总感觉自己做的都只是杯水车薪,对未来有压力,对时间很恐惧……
2017年给自己定的目标是——:到哪里去,想办法调到自己想做的工作上,好不容易迈过这一步,没想到现在却这么迷茫,希望来年能找到突破口吧!

以上是关于三层分离的编程思的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 FragmentPagerAdapter 分离片段?

三层架构MVC前后分离的一些知识

B站云E办Vue+SpringBoot前后端分离项目——MVC三层架构搭建后台项目

桥接模式

MVC 模式

三层架构的OPP实现的演示例子