APP开发的产品设计是一个主观性非常强的工作,对待同一个产品、同一个功能,不同的产品人会有不同的看法。无规矩不成方圆,在做很多事我们都会有一些标准,即使这种标准的评判角度不同。所以做产品这么长时间,我们也一直在寻找产品设计中的原则或者说标准。
刚开始做产品的时候,我们常常会忽略后台,一个网站相比较前台来说,不必太在乎后台管理系统的用户体验,因为后台的管理系统本身就是给运营人员使用的,而运营人员都是有一定互联网基础的,所以他们对于互联网产品的一些概念或功能都知晓。而且受开发成本所限,后台管理系统要更注重功能性,不必太在乎UI。所以我在设计后台管理系统的时候,在功能设计上也是以简单为好,不太注重用户体验和页面美观性。
但是如果公司规模大,运营人员更多,给运营人员使用的后台如果设计的很简单,可能就不太适用。原因就在于完全不注重用户体验,功能虽然都能实现,但是使用起来却不方便。对于同一种产品,两者的产品设计理念却产生了很大不同,之所以会造成这种差异在于两者所处的情境不同或者说面向的用户不同,两种做法都有各自的道理无法定义孰对孰错。前者之所以会那样设计在于运营人员自身能力的成熟,而后者运营人员太多,素质不一,所以要加大在用户体验方面的投入。用户群特性的不同决定了产品设计的理念不同。在这其中还有一个层面是由于开发成本所限,我在产品的个版本中会精简功能,只做核心的。但是在实际情况却发现虽然说核心功能有了,能够满足需求,但是却很难使用,因为运营人员在后台使用过程中是要注意一些效率的。我们在产品设计的时候总是会将需求分层次,将产品分版本,如果产品的版功能过于简单有时候也会将产品的意义大大折扣,致使我们的产品起不到预想的作用。
在产品的工作流程中,原型设计前我们都会整理好产品的架构,在原型设计时你会从时间和空间位置上安排产品中模块的层级,从理论上讲我们想当然的会把二级菜单设计在总体框架下面,UI体现上也是将同为二级模块的页面风格保持一致,但是无论是在淘宝网的页点击“天猫商城”的tab还是搜房网上点击“租房”的tab(类似的例子还有很多就不一一列举了)都会跳转到一个全新的页面。我们常说产品设计的出发点在于用户需求,但是我们却常常在设计中遵循一些自认为理所当然的规则,而这些规则通常来自于生活,其实也并不是说不能遵循生活中的规则,从另一方面讲按照生活规则办事毕竟利于用户对产品的理解。只是有时候我们会因为遵循一些规则,而忘记了用户体验。
总的来说,产品设计中的原则来源包括硬件设备的标准、开发成本,生活中的规则、产品人自己的价值观等,根本的当然是用户需求了。
软件设计没什么太神秘有东西,只要用心体会,其实一切都很自然。软件的设计之“道”,也不在于设计有多么的华丽、精巧,而在于其朴实、自然,最终达到“以无招胜有招”,进入一个全新的境界。
一、软件设计理论的层次
以我的拙见,软件设计领域中的各种概念,可以分为以下几个层次来进行理解:
1、软件设计的目的:重用性、扩展性。
这是 高的层次,是应对软件危机的需要。
2、设计原则:低耦合、高聚合。
各种软件设计的原则,如依赖倒置原则、单一职则原则、面向接口等,以及各种设计模式,其根本的目的其实只是为了降低耦合这么简单。因为只有低耦合才能更好的适应变化,更好的重用和扩展。
3、实现方法:运用设计模式封装变化、降低耦合。
设计模式只是用来“封装变化、降低耦合”的工具而已。它是面向对象设计时代的产物,其本质就是充分运用面向对象的三个特性,即:封装、继承和多态,进行灵活的组合运用。
二、关于耦合
1、耦合的粒度
耦合无论如何也是不可避免的。当我们实现接口、继承父类的时候,就会不可避免的产生耦合。耦合是有不同粒度的,我们解耦到什么粒度为止,我认为应以模块的重用粒度为准。尽量解除重用模块或对象之间的耦合。而重用模块之内的耦合,应属于聚合的范畴,所以不要盲目的去解耦,否则就陷入了误区。
2、解耦的原理
怎样才能解耦呢,或者说为什么各种设计模式能达到解耦的目的呢?我觉得有以下几个思路:
(1)将具体的东西抽象处理
(2)将分散的东西集中处理
而面向对象中的接口、继承正为我们提供了这样的一种机制。通过访问接口或基类或抽象类,而不是具体的实现类,从而与具体的实现类达到了解耦的目的。我们还可以设计一些控制类,像润滑剂一样,协调各实现类之间的访问,也可以达到耦的目的。
事实上,各种设计模式的基本思想也就是这样。创建型模式是为了解除创建对象时产生的耦合,实际上是解除对类称名的依赖,而结构型和行为型是为了解除对象属性或方法的直接调用。不管什么设计模式,都是将对具体实现类的访问提升为对接口、基类或用于协调的控制类的访问。
三、关于接口
这一节更具体,谈一谈接口,因为使用接口是软件设计的重要手段,但已经不属于“道”了~
1、接口与继承
接口描述的是对象某一个方面行为特征。使用接口与使用继承关系各有优缺点,使用子类继承可以继承父类的功能,体现了重用的精神。而接品更加灵活,因为它解除了子类与父类之间的高度耦合,它体现在灵活扩展的精神。
2、接口与纯虚类
理论上接口可以由纯虚基类实现类似的功能,那为什么还我们不去掉接口的概念,而直接使用虚类呢?
接口存在的理由就是它更加灵活,关系简单,易于理解。比如一个类可以实现十几个甚至几十个接口,但一般开发工具只支持单继承(由于多继承太容易导致混乱和冲突),如果要继承十几层,系统结构想必会无法理解了,我以为这是接口存在的重要的原因。
如果接口和虚类继承结合使用,可以产生强大的威力,这也是许多设计模式的“杀手锏”。