也谈谈扁平化设计

  扁平化设计这个概念通过苹果的推广大家应该已经不陌生了。

  关于界面的扁平化

  这里是扁平化设计的一个定义:扁平化设计一词所指的是抛弃那些已经流行多年的渐变、阴影、高光等拟真视觉效果,从而打造出一种看上去更“平”的界面。

  那么,为什么包括苹果,微软在内的各大厂商拼命的推广扁平化呢?或者说扁平化给大家带来什么好处?一方面,扁平化设计对用户而言更加简单直接,降低了歧义,减少了认知障碍;另一方面,扁平化设计可以更加轻易的放大缩小,应用在不同分辨率的设备上,对于今天各种不同尺寸的设备而言,恐怕只有开发人员和美工清楚其中的痛苦了(尤其是无法遏制的android)。但是扁平化的设计很容易缩放,因而可以很容易做到自适应,大大减轻了开发方的压力,从而提升开发的容易度,并加速应用开发。


  关于对象的扁平化

  《程序员》上的一篇文章《coco2d-x数据驱动的游戏开发实践》很有意思。讲到了ECS(Entity-component-system)。这里的ECS就是对象扁平化的一种方式。

   传统的面向对象设计中经典的特点之一继承有时又会成为他的缺点,因为继承有可能会导致整个继承链太长,如果需要改变上层的方法或属性,会发现牵涉太多,这种情况在游戏中比较常见,因为有的游戏同现实世界一样复杂。比如,下面这张图,围绕这张图,我们可以提出很多问题。你发现Player是有HP的,于是你在Player加入HP,后来发现Enemy也需要HP,为了复用,这时会把HP移到Sprite中去,但是,对于其他sprite(这里暂时用Element表示),比如游戏中的NPC,或者player御用的交通工具---一艘飞船来说,可能是不需要HP的,这种情况对面向对象本身来说是很奇怪的(当然,可以不实现这个方法),而且,如果下面有很深的类层次的话,就会出现许多类有许多无用方法。另外的问题,假如刚开始,我们只设计了Boss可以变身,后来需求变更了,发现Monster也可以变身,这时候怎么办呢,是将变身移到Enemy中继续污染其他非变身的Enemy类呢,还是只添加到Monster和Boss身上呢,如果你觉得选择后者试试,那么挑战又来了,如果变身这个过程同时都需要将HP,ACK,DEF等属性增加30%,并且发出一阵特殊的声音呢?你会发现需要同时修改这两个地方,但是如果是十个地方呢?

  实际上,面向对象的方法需要大量时间来将数据库这样的关系整理成复杂的对象之间的关系,并且需要最初整体的设计设想很多可变因素,因为每次变更都可能影响到系统的很多地方。而基于组件的架构正好擅长于这点。

  基于ECS的组件架构正是推广了一个面向对象的设计原则,组合优先于继承。这里借用文末参考中的两幅图。


  从图中可以看出来,ECS将独立的数据和行为抽取出来形成一个组件,比如HealthComponent。只要什么东西需要HP,就把它当做一个自身的组件组装起来,由此导致更灵活的和扁平化的层次结构。

  刚才只讲到ECS中的C,即component,它主要负责最小特征的数据和对这些数据的简单的操作。而Player,Enemy等就是ECS中的E,即Entity,它们表示游戏中的对象,简单的entity仅仅需要一个ID标识就行了。

  有了数据和对象,它们是如何动起来的呢?这就需要System,system表示entity的行为,动作,一般是根据一组数据来改变Entity的状态,比如被击中需要减少HP,这个动作就是HealthSystem负责的。

  可以看到,通过ECS的解耦,Entity将行为放到了一边的System中,将数据放到了另一边的Component中,最终非常简洁清晰的将整个系统组织起来。仔细观察一下,这两边都是扁平化的结构。

  更多ECS相关内容,请参见文末参考。

  关于业务的扁平化

  淘宝的子柳曾经讲过这样一个故事:最初淘宝的物品分类是类似文件夹一样的层级结构。比如衣服,下面分男装女装,下面又再分材料如T恤,针织衫,下面还可以再分花色如豹纹,碎花。本来看似一切都好,但是实际上这样设计是有很大问题的,一方面衣服既可以分男装女装,又可以分为各种风格比如萝莉,性感,雅酷,成熟,那么到底是哪个在最上层呢?另一方面如果男装女装在最上层,而男女装都有T恤,针织衫,相同的类目是不是需要男女都复制一遍呢?如果再深入一些,T恤,针织衫下面女装有豹纹,碎花等花色,但是男装没有,那处理起来又更加麻烦了。最后,如果新加一个属性在根上,那么整棵树都有可能要改。且先不说如何展示这个层级结构的优先顺序,从卖家上架的角度来看,要一个一个的展开一颗巨大的树,实在是令人提不起兴趣啊,由此可以看出来这种处理方式的弊端。

  那么,淘宝最后是如何解决这个问题的呢?实际上他们将所有的category变成了tag,通过打tag的方式将category直接放到某件物品上,而不是像刚刚一样的复杂层级。在我看来这非常巧妙,这是利用扁平化设计将业务和后台的复杂性都规避了!


  关于管理的扁平化

  有许多公司管理是走扁平化的方式,比如,所有经理都与员工坐在一间大的办公室里,这样,有问题可以及时跨级沟通从而更快的得到处理。

  对于上面这些扁平化的设计,其核心目的是什么?那就是简化,可以看到上面所有的这些例子,他们都有一个共同点,就是拉近了底层与上层的关系,从而省去了层层通信的繁琐,减少沟通的成本,从而体现出来的就是设计的简化以及使用的简化,在各种系统日益复杂的今天,这是一个非常好的思想,值得我们借鉴。

  参考文档:扁平化设计概念 http://www.geekpark.net/read/view/181540

                      coco2d-x数据驱动的游戏开发实践  http://elvisco.de/2013/09/entity-component-system/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值