首页

商品展示列表——大图、多图、图文列表该如何选择?

资深UI设计者

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

Image title

Image title

Image title



蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务


UI新手的自我发展

蓝蓝设计的小编

本文重点梳理以下七大问题:一、令人眼花缭乱的专业术语;二、交互和视觉如何分工;三、工作的流程;四、视觉类UI的自学;五、交互设计需要掌握的知识;六、今天设计什么;七、设计师的薪资

经常有人问我新手如何自学交互设计,我之前也录过一个视频给大家,没想到放到网上后点击率很高,看来对新人是的确有帮助的。所以今天再次针对这个问题做阐述,修正了第一版的一些内容,也更具有针对性。

VUE 学习总结之简单的Rate评分组件

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

说明

本组件基于element-ui 的图标库(星星图标)

第一步:

vue + webpack + element-ui 框架

第二步:

创建Rate.vue文件,实现双向绑定分数

第三部:

使用组件

代码

在app.vue中引入组件


    
  1. <Rate v-model='value' size="32px">
  2. <span>{{value}} 分</span>
  3. </Rate>
import Rate from './components/Rate'

组件


    
  1. <template>
  2. <div class="Rating" :value='value'>
  3. <ul class="Rating-list">
  4. <li v-for="s in 5" @click="changeRate(s)">
  5. <i :class="s <= star ? 'el-icon-star-on':'el-icon-star-off'" :style='style'></i>
  6. </li>
  7. </ul>
  8. <slot></slot> <!--显示用户自定义内容-->
  9. </div>
  10. </template>


    
  1. props: {
  2. size: { //父组件传值设置字体大小
  3. type: String,
  4. default: '16px'
  5. },
  6. value: { //绑定value,与$emit实现双向绑定
  7. type:Number,
  8. default:0
  9. }
  10. },
  11. data() {
  12. return {
  13. star: this.value, // 初始化
  14. style: {
  15. fontSize: this.size //通过prop传值设置星星字体大小
  16. }
  17. }
  18. },
  19. methods: {
  20. changeRate(s) {
  21. this.star = s //更新当前星星数量
  22. this.$emit('input', s); //将当前星星数量s与v-model绑定
  23. }
  24. }

demo演示



移动端适配问题解决方案

周周

随着时间的发展,现在基本上人手一部手机的低头族。做为前端开发的程序猿,在开发移动端web应用的时候,对面一堆各色尺寸不一样的屏幕,就有点淡淡的忧伤。

QQ截图20180705114651.png

QQ截图20180705114755.png

以上是2018年二月份的友盟数据,可在这里查看详情
很明显我们所要实现的就是在上述如此之多的屏幕,都能实现UI大大出的视觉图上的效果。而要实现这样的效果主要有两个难点

  • 各屏幕适配
  • Retina屏下的细节处理(主要是1px的问题)

各屏幕适配各屏幕的适配,有两种方案,flexible + rem 与 vw。这三个单词是什么意思,看着很眼熟,但是这两个方案居然是什么呢,请允许我细细道来。

flexible + rem显而易见,该方案是由rem 以及 flexible组成的。rem (font size of the root element)相对于根元素(即html元素)font-size计算值的倍数,flexible 即 flexible.js, 手淘团队提供的一个为该方案屏幕适配而写的一个库,主要实现的功能就是,根据屏幕的宽度给 html 元素设置一个合适的 font-size 值。

怎么样看的不是很懂是吧。让我来用一个页面场景再复述一遍。

正常情况下,我们的UI大大会以iphone6的尺寸为标准,做一套视觉效果图,并在上面进行标注,给到我们的标注图,如下所示

QQ截图20180705115007.png

拿到这个图 我们该如何下手呢

  • 先设置 html 元素的 font-size, 这个值我们暂时设置为 font-size: 37.5px,即1rem = 37.5px;
  • 以iphone6为例子,其屏幕宽度为 750px, 整个屏幕的宽度即 20rem = 37.5 * 20px = 750px;
  • 此时手机号的输入框为 490px = 13.06777777rem
  • 依次将页面上的px转换为rem,这样我们就得到了全是rem为尺寸单位的页面

到这里为止是不是就结束了呢 ? 很遗憾的告诉你并不是。为什么 html 元素的 font-size 要设置为 37.5px呢?现在这个界面在iphone6上能完美显示了,在iphone5s,iphone6p能完美显示吗?(iphone6, iphone6s, iphone7. iphone8屏幕没有发生变化,本文直接用iphone6代替了。)上面的两个问题 我们还有没解决,这个时候就轮到flexible登场了。只需要像如下引入就可实现用js来自动根据屏幕宽度设置 html元素的font-size的值。

<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"&gt;&lt;/script&gt;引申一下在上述过程中,你会发现,UI给到我们的一般是px标注的图,我们将其转化为rem,这个过程其实会花费很大的计算时间。做为一个合格的程序员,我们应该把这种机械性无脑的操作交给计算机来实现。我使用的是PostCss的插件 postcss-px2rem,这个插件能让我们在写代码时候直接写px,在构建的时候自动将我们所写的px转换为rem,大大提升了我们的开发效率。

vw这个vw的方案,相当而言还比较新。vw 即(viewport width)可视窗口的宽度。之所以把这个方案放在后面来说,是因为viewport在去年(2017年)的时候存在不少的兼容性问题,各个浏览器的支持并不是很好。但是来到了2018年这个时间点,viewport单位意见得到了众多浏览器的支持(80.45%)。


QQ截图20180705115133.png

可以在这里查看。
接下来就让我们来正式了解下这个方案吧。vw既然是一个尺寸单位,那它的宽度等于多少呢?等于1%整个屏幕的宽度。举个例子,再次以iphone6手机为例,100vw = 750px => 1vw = 7.5px
再一次那上次的界面做示范

QQ截图20180705115007.png


  • 根据定义,我们了解了在iphone6手机上 1vw = 7.5px
  • 此时手机号的输入框为 490px = 65.333333vw
  • 依次将页面上的px转换为vw,这样我们就得到了全是vw为尺寸单位的页面

到这里为止是不是就结束了呢? 是的就是这么简单。

引申一下跟之前一样的痛点,我们仍然需要花费大量不必要的计算时间去把标注图中的px转换为vw,有没有类似于postcss-px2rem的工具呢?很荣幸能再次站在巨人的肩膀上,已经有大神写了了类似的PostCss插件 postcss-px-to-viewport

1px问题移动端的屏幕不仅仅分辨率有差异,其实还有Retina屏的问题。正常情况下,我们代码里的1px在屏幕上就应该显示一个像素点,但是在Retina屏下则不仅仅是一个像素点。再次拿iphone6为例,其dpr(device pixel ratio)设备像素比为2,css中一个1x1的点,其实在iphone6上是2x2的点,并且1px的边框在devicePixelRatio = 2的Retina屏下会显示成2px,在iPhone6 Plus下甚至会显示成3px。

这样的话,我们就会发现在有些手机上1px明显跟另外的一些手机的1px粗细不一样。其实大多数的小公司不会扣这样的一个细节,比如说我们公司不会。(^__^) 嘻嘻……

但是作为一个有追求的前端工程师,我们应该尽量的把事情做的完美一点,(ps.像大公司看齐,在大公司这个细节问题其实是不容忽视的,为了自己以后的发展前途,我们有必要把这个细节完善掉的。)

这个问题的解决方案有很多,个人觉得最简单方面的还是大漠大大的一种解决方案。使用postcss-write-svg插件,

@svg 1px-border {  height: 2px;  @rect {    fill: var(--color, black);    width: 100%; height: 50%;    }  }.example {  border: 1px solid transparent;  border-image: svg(1px-border param(--color #00b1ff)) 2 2 stretch;}编译出来就是

.example {  border: 1px solid transparent;  border-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='2px'%3E%3Crect fill='%2300b1ff' width='100%25' height='50%25'/%3E%3C/svg%3E") 2 2 stretch;}其他小程序中的屏幕适配最近在写小程序,在小程序里,使用的是小程序的那套,跟平时用的vue全家桶以及react全家桶不一样,并没有配置webpack,在这种情况下我们使用postcss其实很困难(反正我是搞不出来/(ㄒoㄒ)/~~)

那该怎么办呢,小程序提供了一个自己的单位, rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。



设备

rpx换算px (屏幕宽度/750)
px换算rpx (750/屏幕宽度)



iPhone5

1rpx = 0.42px
1px = 2.34rpx



iPhone6

1rpx = 0.5px
1px = 2rpx



iPhone6p

1rpx = 0.552px
1px = 1.81rpx

我们直接用拿到iphone6的标注图,直接写rpx就好。



如何利用「行为模型」让用户行动起来?

资深UI设计者

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里


想一个问题吧,如果有人给你发了一条微信,你没有回复 ta,原因是什么?

  • 可能是给你发消息的人对你来说不重要?或者消息内容不重要,不需要立刻回复?
  • 可能是你暂时特别忙,没有时间回复?
  • 也可能是你的微信关闭了消息提醒,没有听到手机震动,不知道有人给你发了消息……

原因会有很多种,但是几乎每一种原因都可以对应到更深的层次。比如给你发消息的人对你而言不重要,是因为缺乏了回复的动机;没时间回复是因为缺乏了回复的能力;关闭了提醒是缺乏了回复的触发因素……

动机,能力,触发三大要素,是让用户产生行为必不可少的三大条件,在行为模型里也十分重要。

一、什么是行为模型?

最早在 Norman 的《设计心理学》了解到关于行动的几个步骤,他将行动拆分为目标,执行,评估三大阶段,每一阶段又分为几个步骤,简单画了逻辑图 :

但是很多时候会发现,用户不一定会按我们所设想的方式去使用我们的产品,特别是注册,购买等能提升转化率的行为……我在查询了一些关于心理学方面的内容后,发现了用户不进行这些行为,其实都是有可以解释的依据的,并且我们还可以利用这些依据来改善我们的产品。

从前面微信的例子,我们可以得知,要想让用户产生行为(Behavior),必须具备三个要素:充分的动机(Motive),完成这一行为的能力(Ability),促使人们付诸行动的触发(Trigger),这三者缺一不可。

于是我们可以得出一个行为模型:B=MAT,我们可以从数学的角度类比出人们产生行为的「临界点」,可以称为「行动边界线」(当然这是我自己瞎取的名字,方便理解),只有用户跨越了「行动边界线」,才能实施或者产生某种行为。

二、关于Trigger——触发

所谓触发,就是促使用户做出某种举动的诱因,引发用户去使用你的产品。

比如通过在其他平台广告推广等付费方式吸引新用户,这个可以称为「付费型触发」;

还有一些公关、媒体新闻的正面报道 ,app store 里面排行榜,AppSo 推荐好用应用等不需要付费,但是能够吸引用户使用你的产品,这个可以称为「回馈型触发」;

还有熟人之间的相互推荐,亲朋好友的口碑相传,这种方式十分常见,也是能够让产品大规模获取用户的一种方式,我们可以称为「人际型触发」。

但是这种方式经常会被恶意利用,比如我们经常看到的:分享XX到几个群即可领取XXX优惠,最后却发现是骗人的方式,利用这种方式也许可以获取大批用户,但是一旦用户发现被欺骗后就会立即停止使用你的产品,你也会失去用户的信任。

还有一种是以驱动用户重复某种行为的方式,用户主动与产品保持联系,比如用户注册了某个平台的账户,订阅了它们的内容更新,开启了消息推送,那么每一次更新推送就很有可能触发用户使用你的产品,这种方式可以称为「自主型触发」。

以上四种触发方式,都是来源于外部环境,那么我们可以将其称为「外部触发」。

昨晚在 PM CIRCLE 里面看到大家在谈论关于痛点、痒点、爽点的问题,也出了系列文章,后来在知乎上也搜了相关大佬的回复。

小小的总结一下:

  • 「痛点」可以解释为痛苦的点,用户在不满,抱怨,生气,恐惧等负面情绪会产生痛点;
  • 「痒点」可以理解为虚拟自我的实现,比如 B612 的瘦脸大眼,现实生活中的很难实现的,在 B612 里面能够让用户得以释放和解脱,映射出虚拟自我;
  • 「爽点」就是老生常谈的即时满足了,压抑久了的需求突然被满足,那就是爽,有需求,还能即时满足,那么就是爽。

为什么我会提到「痛点」、「痒点」、「爽点」?是因为我觉得这三者是从内部来触发用户采取下一步行动。

Nir Eyal 将情绪触发分为两种,一种为负面情绪,一种为正面情绪,两种情绪皆可触发用户采取行动,但是我觉得如果利用「痛点」、「痒点」、「爽点」来分析内部触发的话会更好,这三点通过深入挖掘用户内在的情感体验,设计出满足用户需求的产品,利用这三点也可以触发用户使用你的产品。

可以思考一下,人们为什么要发朋友圈,发微博?为什么要拍照?为什么要刷抖音?为什么朋友圈更新出现小红点后我就要去点击看?用户借助这些产品实现了怎样的目的?消除了什么样的烦恼?使用完这些产品后用户感受如何?等等问题。

三、关于Ability——能力

可以把能力解释为完成该行为的难易程度

Hauptly,Denis J 有一个观点就是:当你使用某个产品时所需花费的步骤能被缩减或者是优化时,用户使用它的频率就会增加。他在《Something Really New》一书中,归纳了产品创新的三个步骤,简单画了下步骤图:

结合今天的科技变化,我们可以知道,将行为简单化可以推动产品创新,也只有将行为简单化,用户才会具备完成这一行为的能力。

福格总结了简洁性包含的6个元素,也就是影响任务难易程度的6个要素,简单总结下:

福格建议,为了增加用户实施某个行为的可能性,设计人员在设计产品时,应该关注用户最缺乏什么。

也就是说,要弄清楚是什么原因 阻碍了用户完成这一活动:是时间不够吗?还是缺乏资金?还是完成这一活动太耗体力了?或者是用户不想动脑筋?或者是这个产品与他们所处的社会环境格格不入?甚至是它太逾越常规,以至让人难以接受?

我记得我第一份实习,做的一款新闻app,那个时候还不懂交互也不懂产品,我记得在首页查看新的新闻内容的时候 ,因为数据加载量的原因,每次只能加载一定数量的新闻,所以当时设计的是一个「查看更多」的列表条,用户每次需要加载更多新闻内容的时候,都需要点击一次「查看更多」加载大约6条新的新闻,其实现在想想,为什么我们不设计一个自动加载呢?每次用户上拉的时候,自动加载一部分,这样能够让操作更加便捷,节约时间。

四、关于Motive——动机

触发是提醒用户采取行动,而动机决定用户是否愿意采取行动,也就是用户行动时拥有的热情。在心理学里面,福格博士归纳了驱使用户采取行动的三大类核心动机:

能够成为某些人行为动机的东西,未必适用于另外一些人,所以,我们需要知道自己的目标用户到底需要什么。

举个例子:比如抖音的一些视频封面,是一些漂亮的女生封面,而对于大都数男生来说,为了追求快乐,就有了点击进去看的动机,而这种动机对于另外一些女性用户就不一定适用。

前几天在听 UCDCHINA 上海 大众点评 DPUX 专场《战略导向下的设计价值拓展》线下分享会的时候,其中也讲到了关于用户的7大基本心理特征——七宗罪:愤怒,淫欲,贪婪,懒惰,嫉妒,暴食,骄傲。

我觉得这也是能够让用户产生动机的七大因素 ,比如经常被广告商拿来利用的俗称「性卖点」的广告设计元素 ,利用人性的窥探欲,吸引用户付诸行动……

当我们知道了用户采取行动的几类核心动机后,我们可以通过一些心理学的方法来刺激用户的这些动机。

我在 Nir Eyal 的书中了解到一些关于启发法等认知偏差对人类行为的影响,比如稀缺效应,首因效应,环境效应,投射效应,近因效应,锚定效应,赠券效应,目标渐进效应等 。

比如很多电商平台商家会故意将商品库存降低,当产品数量由多变少的时候,它在用户心中的价值就会提高,那么用户购买的动机就会增强,这就是利用了稀缺效应 ;

再比如目标渐进效应,大意是讲当用户认为自己距离目标越来越近时,完成任务的动机会更加强烈。

目标渐进效应让我突然想到长沙的网红奶茶——茶颜悦色的集点卡,大概就是积满6点可以送一杯奶茶,我在第一次买第一杯的时候,他们给了我一张集点卡,上面已集了1个点,意思就是说我再集5个点就可以兑换一杯奶茶了,但是如果换一种方式,它把规则改成集5点可以兑换一杯奶茶,但是我买第一杯的时候,他们给我的卡上是空白的,没有点,那么你们觉得这两种方式,哪种方式更能让用户产生集点的动机呢?

总结

  • 要促成某种行为,触发,动机,能力这三者缺一不可,B=MAT;
  • 触发要显而易见,行为要易于实施,动机要合乎常理;
  • 触发分外部触发和内部触发,外部触发包括付费型触发,回馈型触发,人际型触发,自主型触发;内部触发可以从痛点、痒点、爽点来分析;
  • 影响任务难易程度,也就是能力的6个要素包括:时间、金钱、体力、脑力、社会偏差、非常规性;
  • 动机是行动时拥有的热情,采取行动的核心动机有三大类;
  • 可以利用启发法来获取灵感,提高产品吸引力,刺激用户的动机;
  • 因为增强动机往往耗时费力,所以一般先解决能力问题,再解决动机问题

    蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务


如何利用「行为模型」让用户行动起来?

资深UI设计者

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里


想一个问题吧,如果有人给你发了一条微信,你没有回复 ta,原因是什么?

  • 可能是给你发消息的人对你来说不重要?或者消息内容不重要,不需要立刻回复?
  • 可能是你暂时特别忙,没有时间回复?
  • 也可能是你的微信关闭了消息提醒,没有听到手机震动,不知道有人给你发了消息……

原因会有很多种,但是几乎每一种原因都可以对应到更深的层次。比如给你发消息的人对你而言不重要,是因为缺乏了回复的动机;没时间回复是因为缺乏了回复的能力;关闭了提醒是缺乏了回复的触发因素……

动机,能力,触发三大要素,是让用户产生行为必不可少的三大条件,在行为模型里也十分重要。

一、什么是行为模型?

最早在 Norman 的《设计心理学》了解到关于行动的几个步骤,他将行动拆分为目标,执行,评估三大阶段,每一阶段又分为几个步骤,简单画了逻辑图 :

但是很多时候会发现,用户不一定会按我们所设想的方式去使用我们的产品,特别是注册,购买等能提升转化率的行为……我在查询了一些关于心理学方面的内容后,发现了用户不进行这些行为,其实都是有可以解释的依据的,并且我们还可以利用这些依据来改善我们的产品。

从前面微信的例子,我们可以得知,要想让用户产生行为(Behavior),必须具备三个要素:充分的动机(Motive),完成这一行为的能力(Ability),促使人们付诸行动的触发(Trigger),这三者缺一不可。

于是我们可以得出一个行为模型:B=MAT,我们可以从数学的角度类比出人们产生行为的「临界点」,可以称为「行动边界线」(当然这是我自己瞎取的名字,方便理解),只有用户跨越了「行动边界线」,才能实施或者产生某种行为。

二、关于Trigger——触发

所谓触发,就是促使用户做出某种举动的诱因,引发用户去使用你的产品。

比如通过在其他平台广告推广等付费方式吸引新用户,这个可以称为「付费型触发」;

还有一些公关、媒体新闻的正面报道 ,app store 里面排行榜,AppSo 推荐好用应用等不需要付费,但是能够吸引用户使用你的产品,这个可以称为「回馈型触发」;

还有熟人之间的相互推荐,亲朋好友的口碑相传,这种方式十分常见,也是能够让产品大规模获取用户的一种方式,我们可以称为「人际型触发」。

但是这种方式经常会被恶意利用,比如我们经常看到的:分享XX到几个群即可领取XXX优惠,最后却发现是骗人的方式,利用这种方式也许可以获取大批用户,但是一旦用户发现被欺骗后就会立即停止使用你的产品,你也会失去用户的信任。

还有一种是以驱动用户重复某种行为的方式,用户主动与产品保持联系,比如用户注册了某个平台的账户,订阅了它们的内容更新,开启了消息推送,那么每一次更新推送就很有可能触发用户使用你的产品,这种方式可以称为「自主型触发」。

以上四种触发方式,都是来源于外部环境,那么我们可以将其称为「外部触发」。

昨晚在 PM CIRCLE 里面看到大家在谈论关于痛点、痒点、爽点的问题,也出了系列文章,后来在知乎上也搜了相关大佬的回复。

小小的总结一下:

  • 「痛点」可以解释为痛苦的点,用户在不满,抱怨,生气,恐惧等负面情绪会产生痛点;
  • 「痒点」可以理解为虚拟自我的实现,比如 B612 的瘦脸大眼,现实生活中的很难实现的,在 B612 里面能够让用户得以释放和解脱,映射出虚拟自我;
  • 「爽点」就是老生常谈的即时满足了,压抑久了的需求突然被满足,那就是爽,有需求,还能即时满足,那么就是爽。

为什么我会提到「痛点」、「痒点」、「爽点」?是因为我觉得这三者是从内部来触发用户采取下一步行动。

Nir Eyal 将情绪触发分为两种,一种为负面情绪,一种为正面情绪,两种情绪皆可触发用户采取行动,但是我觉得如果利用「痛点」、「痒点」、「爽点」来分析内部触发的话会更好,这三点通过深入挖掘用户内在的情感体验,设计出满足用户需求的产品,利用这三点也可以触发用户使用你的产品。

可以思考一下,人们为什么要发朋友圈,发微博?为什么要拍照?为什么要刷抖音?为什么朋友圈更新出现小红点后我就要去点击看?用户借助这些产品实现了怎样的目的?消除了什么样的烦恼?使用完这些产品后用户感受如何?等等问题。

三、关于Ability——能力

可以把能力解释为完成该行为的难易程度

Hauptly,Denis J 有一个观点就是:当你使用某个产品时所需花费的步骤能被缩减或者是优化时,用户使用它的频率就会增加。他在《Something Really New》一书中,归纳了产品创新的三个步骤,简单画了下步骤图:

结合今天的科技变化,我们可以知道,将行为简单化可以推动产品创新,也只有将行为简单化,用户才会具备完成这一行为的能力。

福格总结了简洁性包含的6个元素,也就是影响任务难易程度的6个要素,简单总结下:

福格建议,为了增加用户实施某个行为的可能性,设计人员在设计产品时,应该关注用户最缺乏什么。

也就是说,要弄清楚是什么原因 阻碍了用户完成这一活动:是时间不够吗?还是缺乏资金?还是完成这一活动太耗体力了?或者是用户不想动脑筋?或者是这个产品与他们所处的社会环境格格不入?甚至是它太逾越常规,以至让人难以接受?

我记得我第一份实习,做的一款新闻app,那个时候还不懂交互也不懂产品,我记得在首页查看新的新闻内容的时候 ,因为数据加载量的原因,每次只能加载一定数量的新闻,所以当时设计的是一个「查看更多」的列表条,用户每次需要加载更多新闻内容的时候,都需要点击一次「查看更多」加载大约6条新的新闻,其实现在想想,为什么我们不设计一个自动加载呢?每次用户上拉的时候,自动加载一部分,这样能够让操作更加便捷,节约时间。

四、关于Motive——动机

触发是提醒用户采取行动,而动机决定用户是否愿意采取行动,也就是用户行动时拥有的热情。在心理学里面,福格博士归纳了驱使用户采取行动的三大类核心动机:

能够成为某些人行为动机的东西,未必适用于另外一些人,所以,我们需要知道自己的目标用户到底需要什么。

举个例子:比如抖音的一些视频封面,是一些漂亮的女生封面,而对于大都数男生来说,为了追求快乐,就有了点击进去看的动机,而这种动机对于另外一些女性用户就不一定适用。

前几天在听 UCDCHINA 上海 大众点评 DPUX 专场《战略导向下的设计价值拓展》线下分享会的时候,其中也讲到了关于用户的7大基本心理特征——七宗罪:愤怒,淫欲,贪婪,懒惰,嫉妒,暴食,骄傲。

我觉得这也是能够让用户产生动机的七大因素 ,比如经常被广告商拿来利用的俗称「性卖点」的广告设计元素 ,利用人性的窥探欲,吸引用户付诸行动……

当我们知道了用户采取行动的几类核心动机后,我们可以通过一些心理学的方法来刺激用户的这些动机。

我在 Nir Eyal 的书中了解到一些关于启发法等认知偏差对人类行为的影响,比如稀缺效应,首因效应,环境效应,投射效应,近因效应,锚定效应,赠券效应,目标渐进效应等 。

比如很多电商平台商家会故意将商品库存降低,当产品数量由多变少的时候,它在用户心中的价值就会提高,那么用户购买的动机就会增强,这就是利用了稀缺效应 ;

再比如目标渐进效应,大意是讲当用户认为自己距离目标越来越近时,完成任务的动机会更加强烈。

目标渐进效应让我突然想到长沙的网红奶茶——茶颜悦色的集点卡,大概就是积满6点可以送一杯奶茶,我在第一次买第一杯的时候,他们给了我一张集点卡,上面已集了1个点,意思就是说我再集5个点就可以兑换一杯奶茶了,但是如果换一种方式,它把规则改成集5点可以兑换一杯奶茶,但是我买第一杯的时候,他们给我的卡上是空白的,没有点,那么你们觉得这两种方式,哪种方式更能让用户产生集点的动机呢?

总结

  • 要促成某种行为,触发,动机,能力这三者缺一不可,B=MAT;
  • 触发要显而易见,行为要易于实施,动机要合乎常理;
  • 触发分外部触发和内部触发,外部触发包括付费型触发,回馈型触发,人际型触发,自主型触发;内部触发可以从痛点、痒点、爽点来分析;
  • 影响任务难易程度,也就是能力的6个要素包括:时间、金钱、体力、脑力、社会偏差、非常规性;
  • 动机是行动时拥有的热情,采取行动的核心动机有三大类;
  • 可以利用启发法来获取灵感,提高产品吸引力,刺激用户的动机;
  • 因为增强动机往往耗时费力,所以一般先解决能力问题,再解决动机问题

    蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务




移动端搜索功能设计:3个阶段解析搜索流程设计要点

博博

移动端搜索功能设计:3个阶段解析搜索流程设计要点


如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

移动端搜索功能设计:3个阶段解析搜索流程设计要点

人人都是产品经理 2017-01-04 18:08:02


这篇文章笔者想和大家聊一聊有关搜索功能的设计,搜索功能是每个内容型APP的核心,它的易用性决定了用户是否能从APP里快速找到自己想找的内容,那么决定搜索体验好坏的关键点又是什么呢?这里我总结了两点,“操作的易用性”和“结果的准确性”。看似简单的两点却有很多的学问,笔者把搜索的交互流程划分成三个关键阶段,“搜索前、搜索中及搜索后”,接下来将从这三个阶段逐一分析整个搜索流程中的相关设计。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

搜索入口——依据功能权重来判断入口的表现形式

在不同的APP或者不同的场景下搜索入口有着不同的表现形式,具体的表现形式取决于产品对搜索功能权重的定义,如果说在某一场景下搜索功能是用户常用的核心功能那么他在界面上所表现出来的权重就要高些,反之则低些。下图是常见的搜索功能的入口形式,他们的权重从左到右依次降低,笔者将对他们一一进行分析

移动端搜索功能设计:3个阶段解析搜索流程设计要点

方式一:如下图APP Store的搜索入口

如下图APP Store的搜索形式,搜索放在标签栏上作为一个独立的功能模块,它的功能层级是最高的。不管用户操作到哪里都可以随时进入搜索页面,这样的搜索入口通常用在搜索场景非常多的内容型APP上,方便用户在任何时候快速进入搜索页面。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

方式二:搜索框外漏在nav bar

如下图是京东app的搜索入口,它将搜索框外漏在nav bar上,这样的形式有着两个设计的关键点:

移动端搜索功能设计:3个阶段解析搜索流程设计要点

关键点一:搜索框外漏在顶部导航条上

搜索框直接外漏在导航条上是为了突显该功能,这一功能往往是用户在该页面非常核心的操作任务,类似天猫京东这类电商型app,通常情况下用户都是带着明确目的来购买东西的,那么他们采取的最快最直接的方式就是搜索。

关键点二:在向上滚动界面时,搜索框一直悬停在顶部

这样做的场景是这样的,在用户滚动页面寻找内容时,可能并不能找到自己想要的内容,搜索框一直悬停一是为了暗示用户可以进行搜索,二是为了让用户在想搜索时快速触发搜索

方式三:出现在NAV BAR下面,默认隐藏或显示

如下图是微信在聊天页面和通讯录页面的搜索入口,初始化状态时聊天页面的搜索框是不出现在用户的可视范围内的,当页面下滑时搜索框才出现,而在通讯录页面里搜索框是默认出现在用户的可视范围内的。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

分析:微信在最近联系人和通讯录上搜索框的默认状态不同,这很好地诠释了这两种场景下的搜索功能的权重。最近联系人页面上的搜索入口显得更加隐蔽,因为在这个页面下用户产生搜索的场景很少,把其隐藏简化了界面的元素,提升了界面的美观性。

方式四:通过点击icon触发搜索

如下图是淘票票的搜索的入口,通过点击右上角的搜索icon进入搜索页面:

移动端搜索功能设计:3个阶段解析搜索流程设计要点

分析:在界面权重上,这样的方式相对于以上三种方式来说显得较弱一点,因为在这样的场景下用户使用搜索的概率并不是很高,如果把搜索外漏就会占据更多的屏幕空间,破坏界面的权重等级和美观性。

总结:依据用户的需求场景,搜索入口放在不同的位置,如果说在该页面搜索是一个主要的功能,我们就应该去突显它,提升它在界面上的权重,反之则减轻它的权重。

搜索中间页——运营的重灾区,用户搜索行为的关键点

搜索中间页本来应该是一个轻量化的页面,用户在这里输入内容进行搜索即可。但随着运营需求的扩张,这个页面逐渐成为了一个运营重灾区,多了很多推荐的内容。笔者将从“输入框提示信息、搜索分类、搜索历史、搜索推荐、搜索输入、搜索建议”等方面分析一下这个页面的设计。

1. 输入框提示信息

搜索框内的提示信息通常是提示用户当下可以搜索什么样的内容,如下图bilibi的搜索提示,告诉用户可以进行“视频、番剧、UP主或者AV号”的搜索,这样的提示信息对用户也是一种良性的引导,给用户提供了一个心理预期,同时也对用户随意输入关键词造成无结果的伤害体验的可能进行了限制。例如一个房产APP,搜索框内提示输入楼盘或小区名,如果没有这样的提示有的用户可能就会去输入价格去筛选房源,这句提示语很好地降低了这样的风险。

但随着人们对APP使用的熟悉,用户在这里的认知负担基本消除,运营人员逐渐抢占了这块地方,这句话变成了内容的推荐或者产品的Slogan,这些推荐的内容可以是运营人员手动维护的也可以是依据用户的购买和行为习惯进行推荐的。如下图右边是淘宝的搜索提示,搜索框的文案变成了“红人最爱潮牌名服”,这就是运营人员在为特定内容进行导流。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

2. 搜索分类

在内容型APP中搜索时通常会对内容进行分类搜索,这是为了帮助用户更地找到相关内容,分类的操作可以发生在搜索前也可以发生在搜索后,如下图是“淘宝、微信、网易云音乐”搜索分类的方式,笔者将分别对他们进行分析。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

淘宝是将搜索分类前置,默认搜索宝贝,点击后弹出浮层进行切换。这样的方式存在一个明显的缺点就是由于该入口所占空间位置不显著,会导致用户感知太弱。 这样的方式通常用在用户大多数情况下只搜索某一分类的内容,如淘宝这样,用户大部分的搜索场景都是在寻找宝贝。

微信默认搜索所有内容,将分类通过通过三个很显著的入口放在搜索框下方,当点击某一分类时跳转到该分类的搜索界面,同时搜索框的文案以及搜索界面的内容发生相应变化,提示用户搜索范围被改变。这种方式通常用在这些分类搜索的场景都很常见时,它的缺点在于,从界面表现形式来看,这三个分类更像是三个功能的入口,他们与搜索框联系得不是很紧密,很多用户最开始使用时并不知道点击这些分类是进行搜索范围的限制。经测试3个从未使用过该功能的用户,他们都认为点击朋友圈后就是进入朋友圈,点击文章后就是显示所有文章。

网易云音乐是将搜索分类进行后置了,在下文关于搜索结果的展示我会分析它的优劣势。

3.搜索历史

搜索历史记住用户的足迹,方便用户快速向以前搜索过的内容进行转换。设计上我们需要注意的一点就是需要把搜索历史和搜索推荐区分开来,在位置上,尽量让搜索历史靠近搜索框(如下图),因为从认知心理学上来讲,越靠近搜索框的内容越能表示它是搜索历史。在表现形式上,搜索历史和搜索推荐尽量采用不同的表现形式。搜索历史伴随的交互操作有删除单条或者清空搜索历史

移动端搜索功能设计:3个阶段解析搜索流程设计要点

4. 搜索推荐

这里的搜索推荐通常有三种来源:

  1. 按照用户的搜索热度进行推荐;
  2. 运营手动配置;
  3. 按照搜索行为进行计算和推荐;

它存在的目的主要有两个:

  • 一是挖掘用户的潜在需求,让用户更快地找到想找的内容;
  • 二是作为运营位为特定的内容导流。

建议:

  • 不要漏出太多的推荐内容,毕竟它带有一些运营和广告性质,用户的接受度并不会很高
  • 在界面上让推荐内容和搜索历史有明显的区分,方便用户在形式上一眼就能区分出搜索历史和推荐内容
  • 尽量推荐一些对用户有真正价值的内容

5. 搜索输入

受移动端操控方式的限制,在输入内容时存在两个明显的痛点:“修改内容”和“输入速度”。

关于修改内容:当用户想更改语句中一部分文字时,将光标移动到想要更改的地方是一件很难的事,点击操作真的很令人发狂,通常情况下我宁愿重新输入。但是针对这一点搜狗输入法做了一个很人性的交互,当用户按住键盘左右滑动时就能移动光标(如下图)。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

关于输入速度:很早之前偶然间发现了UC浏览器在输入文字时的一个交互功能,如下图所示,当输入文字后,用户可以将搜索建议的词语直接加入到搜索框中然后继续输入文字。这样的需求场景在很常见,比如我想搜索“交互设计师的前景”,当我输入交互二字后就会有“交互设计”的搜索建议,点击搜索建议后面的箭头将这个词直接加入搜索框,然后就出现了“交互设计师的前景”的搜索建议,点击搜索建议后进入搜索结果的页面,这个过程中我少打了很多字,对我的搜索速度有很大的提升。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

6.搜索建议

当用户输入内容后,搜索框下面出现了众多的搜索建议,这些搜索建议是为了帮助用户快速向目标进行转化,如下图是京东的搜索建议,当我输入画框后,一系列画框的搜索建议就出来了,它还有一个亮点就是在此提供了细化筛选条件,画框后面紧跟了“长方形、实木、正方形”等关键的筛选条件,为用户省去了到结果页进行筛选的步骤。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

搜索结果——背后的逻辑决定了用户是否能找到准确的内容

搜索结果是搜索过程中最关键的点,结果的准确性确定了用户体验的好坏,笔者将从“搜索结果的形式、搜索结果的操作、搜索结果的分类、搜索结果的排序”等方面来对搜索结果进行分析。

1. 搜索结果的形式

搜索结果一般分为两种,一种是所见即所得,用户输入内容后出现在搜索框下面的搜索建议就是搜索结果,这种搜索通常出现在一些轻量化的APP中,因为搜索建议对应的就是唯一的搜索结果,如下图微信的搜索一样。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

第二种形式就是一个关键词对应了多个搜索建议,每个搜索建议又对应了多个搜索结果,当用户点击搜索后进入了一个专门的搜索结果页,如下图京东的搜索一样。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

2. 搜索结果的操作

依据用户的需求目的,在搜索结果的列表上我们可以外漏用户大部分情况下会采取的操作,比如说视频类网站,用户搜索到某一内容后,最常采取的操作就是播放,我们就可以把播放按钮外漏,缩短用户的操作路径(如下图爱奇艺的搜索结果页)

移动端搜索功能设计:3个阶段解析搜索流程设计要点

3. 搜索结果的分类

通常的分类方式是TAB切和卡片,以下是微信和网易云音乐的分类。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

这两种方式有各自的应用场景,TAB切主要应用在搜索结果有固定的几种分类,并且通常的情况下搜索结果都有很多的内容,如上图的网易云音乐,每一个分类都有很多的搜索结果,如果它采用卡片式的瀑布流布局,用户需要不停往下翻才能看到第二种分类的内容。卡片式主要运用在搜索结果的内容不多,如微信这样的情况,每一类结果并不是很多,卡片式的瀑布流布局能让用户快速定位到自己想要的内容,如果这里用TAB切就很尴尬了,因为每一类的内容都很少或者很多类里根本没有内容,这样的用户感受就不好了。

4. 搜索结果的排序

搜索结果的排序是一个比较复杂的工作,里面涉及了很多的算法逻辑,笔者对这块也不是很清楚,但是一般的垂直内容型APP并没有这么复杂的算法在里面,就是按照搜索的关键字去一一匹配。

如下图是说我在QQ阅读输入一个“男”字,然后就给我建议第一个字是“男”的所有可能的结果,当第一个字匹配完后就匹配第二个字,这样以此类推。他们的整体顺序就是按照匹配关键字的先后进行排列的,其实在排序中还牵涉了很多的算法,比如说它可能会掺杂一些“热度、人气、人为意图、语义”等因素的权重,这里不展开赘述了。

移动端搜索功能设计:3个阶段解析搜索流程设计要点

以上就是笔者对搜索功能的介绍和思考,希望能对大家有所帮助。

本文由 @不知名设计师 原创发布于人人都是产品经理。未经许可,禁止转载。



蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


木有 UI ,就是新的 UI!

蓝蓝设计的小编

几个月之前,我曾经在一篇文章中说过 Magic 和 Operator 这样的应用将会成为下一个重大突破。

它们的独特之处在于,它们没有采用传统的 UI(用户界面)作为交互方式。


什么是ATL? (与COM的关系,及MFC与COM的关系)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

摘要: 什么是ATL(与COM的关系,及MFC与COM的关系)自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时,对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术,令人望而却步

什么是ATL (与COM的关系,及MFC与COM的关系)
自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时,对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术,令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具,提高开发效率,更好地利用这项技术。
针对这种情况,Microsoft公司在推出COMSDK以后,为简化COM编程,提高开发效率,采取了许多方案,特别是在MFC(MicrosoftFoundationClass)中加入了对COM和OLE的支持。但是随着Internet的发展,分布式的组件技术要求COM组件能够在网络上传输,而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求,因此Microsoft在1995年又推出了一种全新的COM开发工具ATL。
ATL是ActiveX Template Library的缩写,它是一套C++模板库。使用ATL能够快速地开发出、简洁的代码(Effectiveand Slimcode),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从MicrosoftVisual C++ 5.0版本开始,Microsoft把ATL集成到VisualC++开发环境中。1998年9月推出的Visual Studio 6.0 集成了ATL3.0版本。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。
ATL究竟给开发人员带来了什么样的益处呢?这还要先从ATL产生以前的COM开发方式说起。
在ATL产生以前,开发COM组件的方法主要有两种:一是使用COMSDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。
直接使用COMSDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包,我们可以直接编写COM程序。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解(虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的,但对于COM这样一整套复杂的技术而言,在短时间内完全掌握是很难的),另一方面,直接使用COMSDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COMSDK不是一种理想的开发方式。
使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。
另外,在MFC中还提供对Automation 和 ActiveXControl的支持,对于这两个方面,VisualC++也提供了相应的AppWizard和ClassWizard支持,这种可视化的工具更加方便了COM应用的开发。
MFC对COM和OLE的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持是不够完善和彻底的,例如对COM接口定义的IDL语言,MFC并没有任何支持,此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装,自然要涉及Windows编程的方方面面,COM作为Windows平台编程开发的一个部分也得到MFC的支持,但是MFC对COM的支持是以其全局目标为出发点的,因此对COM的支持必然要服从其全局目标。从这个方面而言,MFC对COM的支持不能很好的满足开发者的要求。
随着Internet技术的发展,Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广,然而使用MFC开发的ActiveXControl,代码冗余量大(所谓的“肥代码 FatCode”),而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关,但是由于MFC的继承实现的本质,ActiveXControl必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式,这将使ActiveXControl代码过于庞大,在网络上传输时将占据宝贵的网络带宽资源;如果采用动态连接MFC运行时刻库的方式,这将要求浏览器一方必须具备MFC的运行时刻库支持。总之MFC对COM技术的支持在网络应用的环境下也显得很不灵活。
解决上述COM开发方法中的问题正是ATL的基本目标。
首先ATL的基本目标就是使COM应用开发尽可能地自动化,这个基本目标就决定了ATL只面向COM开发提供支持。目标的明确使ATL对COM技术的支持达到淋漓尽致的地步。对COM开发的任何一个环节和过程,ATL都提供支持,并将与COM开发相关的众多工具集成到一个统一的编程环境中。对于COM/ActiveX的各种应用,ATL也都提供了完善的Wizard支持。所有这些都极大地方便了开发者的使用,使开发者能够把注意力集中在与应用本身相关的逻辑上。
其次,ATL因其采用了特定的基本实现技术,摆脱了大量冗余代码,使用ATL开发出来的COM应用的代码简练,即所谓的“SlimCode”。ATL在实现上尽可能采用优化技术,甚至在其内部提供了所有C/C++开发的程序所必须具有的C启动代码的替代部分。同时ATL产生的代码在运行时不需要依赖于类似MFC程序所需要的庞大的代码模块,包含在最终模块中的功能是用户认为最基本和最必须的。这些措施使采用ATL开发的COM组件(包括ActiveXControl)可以在网络环境下实现应用的分布式组件结构。
第三,ATL的各个版本对Microsoft的基于COM的各种新的组件技术如MTS、ASP等都有很好的支持,ATL对新技术的反应速度大大快于MFC。ATL已经成为Microsoft支持COM应用开发的主要开发工具,因此COM技术方面的新进展在很短的时间内都会在ATL中得到反映。这使开发者使用ATL进行COM编程可以得到直接使用COMSDK编程同样的灵活性和强大的功能。
本文的目的就是希望在有限的篇幅中能够使读者对ATL的使用和基本原理有一个初步的了解,为广大的COM开发人员更好地使用ATL开发起到抛砖引玉的作用。


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


开发中我们需要遵循的几个设计原则!

周周

出处:https://www.cnblogs.com/pengdai


一、开发原则
S:单一职责SRP
O:开放封闭原则OCP
L:里氏替换原则LSP
I:接口隔离法则
D:依赖倒置原则DIP
合成/聚合复用原则
迪米特法则
在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则和具体阐述意义。
面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有迪米特法则和合成复用原则等,所以在常见的文章中有表示写六大或七大原则的; 除此之外我还将给出一些其它相关书籍和互联网上出现的原则;

二、S单一职责SRP

Single-Responsibility Principle,一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则的引申,将职责定义为引起变化的原因,以提高内聚性减少引起变化的原因。

1、定义

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。(Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.),即又定义有且仅有一个原因使类变更。

2、原则分析

一个类或者大到模块,小到方法,承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作。
类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。
单一职责原则是实现高内聚、低耦合的指导方针,在很多代码重构手法中都能找到它的存在,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。

3、优点

降低类的复杂性,类的职责清晰明确。比如数据职责和行为职责清晰明确;
提高类的可读性和维护性;
变更引起的风险减低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的类有影响,对其他接口无影响,这对系统的扩展性、维护性都有非常大的帮助。
注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否合理,但是“职责”和“变化原因”都是没有具体标准的,一个类到底要负责那些职责?这些职责怎么细化?细化后是否都要有一个接口或类?这些都需从实际的情况考虑。因项目而异,因环境而异。

4、例子

SpringMVC中Entity、DAO、Service、Controller、Util等的分离。

三、O开放封闭原则OCP

Open - ClosedPrinciple,OCP对扩展开放,对修改关闭(设计模式的核心原则)

1、定义

一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。意思是在一个系统或者模块中,对于扩展是开放的,对于修改是关闭的。一个 好的系统是在不修改源代码的情况下,可以扩展你的功能。而实现开闭原则的关键就是抽象化。

2、原则分析

当软件实体因需求要变化时, 尽量通过扩展已有软件实体,可以提供新的行为,以满足对软件的新的需求,而不是修改已有的代码,使变化中的软件有一定的适应性和灵活性 。已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
实现开闭原则的关键就是抽象化 :在"开-闭"原则中,不允许修改的是抽象的类或者接口,允许扩展的是具体的实现类,抽象类和接口在"开-闭"原则中扮演着极其重要的角色..即要预知可能变化的需求.又预见所有可能已知的扩展..所以在这里"抽象化"是关键!
可变性的封闭原则:找到系统的可变因素,将它封装起来。这是对"开-闭"原则最好的实现。不要把你的可变因素放在多个类中,或者散落在程序的各个角落。你应该将可变的因素,封套起来..并且切忌不要把所用的可变因素封套在一起。最好的解决办法是,分块封套你的可变因素!避免超大类、超长类、超长方法的出现!!给你的程序增加艺术气息,将程序艺术化是我们的目标!

3、例子

设计模式中模板方法模式和观察者模式都是开闭原则的极好体现。

四、L里氏替换原则LSP

Liskov Substitution Principle,LSP:任何基类可以出现的地方,子类也可以出现;这一思想表现为对继承机制的约束规范,只有子类能够替换其基类时,才能够保证系统在运行期内识别子类,这是保证继承复用的基础。

1、定义

第一种定义方式相对严格:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
第二种更容易理解的定义方式:所有引用基类(父类)的地方必须能透明地使用其子类的对象。即子类能够必须能够替换基类能够从出现的地方。子类也能在基类 的基础上新增行为。
里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士、麻省理工学院教授BarbaraLiskov和卡内基.梅隆大学Jeannette Wing教授于1994年提出。其原文如下:Let q(x) be a property provableabout objects x of type T. Then q(y) should be true for objects y of type Swhere S is a subtype of T.

2、原则分析

讲的是基类和子类的关系,只有这种关系存在时,里氏代换原则才存在。正方形是长方形是理解里氏代换原则的经典例子。
里氏代换原则可以通俗表述为:在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类的话,那么它不一定能够使用基类。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

五、I接口隔离法则

(Interface Segregation Principle,ISL):客户端不应该依赖那些它不需要的接口。(这个法则与迪米特法则是相通的)

1、定义

客户端不应该依赖那些它不需要的接口。
另一种定义方法:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
注意,在该定义中的接口指的是所定义的方法。例如外面调用某个类的public方法。这个方法对外就是接口。

2、原则分析:

(1)接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。
• 一个接口就只代表一个角色,每个角色都有它特定的一个接口,此时这个原则可以叫做“角色隔离原则”。
• 接口仅仅提供客户端需要的行为,即所需的方法,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。
(2)使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。
(3)可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为。

六、D依赖倒置原则DIP

Dependency-Inversion Principle 要依赖抽象,而不要依赖具体的实现, 具体而言就是高层模块不依赖于底层模块,二者共同依赖于抽象。抽象不依赖于具体,具体依赖于抽象。

1、定义

高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:
(1)抽象不应当依赖于细节;细节应当依赖于抽象;
(2)要针对接口编程,不针对实现编程。

2、原则分析

(1)如果说开闭原则是面向对象设计的目标,依赖倒转原则是到达面向设计"开闭"原则的手段..如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则. 可以说依赖倒转原则是对"抽象化"的最好规范! 我个人感觉,依赖倒转原则也是里氏代换原则的补充..你理解了里氏代换原则,再来理解依赖倒转原则应该是很容易的。
(2)依赖倒转原则的常用实现方式之一是在代码中使用抽象类,而将具体类放在配置文件中。
(3)类之间的耦合:零耦合关系,具体耦合关系,抽象耦合关系。依赖倒转原则要求客户端依赖于抽象耦合,以抽象方式耦合是依赖倒转原则的关键。

3、例子1

理解这个依赖倒置,首先我们需要明白依赖在面向对象设计的概念:
依赖关系(Dependency):是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。(假设A类的变化引起了B类的变化,则说名B类依赖于A类。)大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
4、例子2
某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据(DatabaseSource)、也可以转换来自文本文件的数据(TextSource),转换后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer)等。
由于需求的变化,该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。现使用依赖倒转原则对其进行重构。
当然根据具体的情况,也可以将AbstractSource注入到AbstractStransformer,依赖注入的方式有以下三种:

[img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ ... rFZQ/640?wx_fmt=png[/img]

七、合成/聚合复用原则

(Composite/Aggregate ReusePrinciple ,CARP):要尽量使用对象组合,而不是继承关系达到软件复用的目的。

1、定义

经常又叫做合成复用原则(Composite ReusePrinciple或CRP),尽量使用对象组合,而不是继承来达到复用的目的。
就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。

2、原则分析

(1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。
继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用)
组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用)
(2)组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。
(3)此原则和里氏代换原则氏相辅相成的,两者都是具体实现"开-闭"原则的规范。违反这一原则,就无法实现"开-闭"原则,首先我们要明白合成和聚合的概念:
注意:聚合和组合的区别是什么?
合成(组合):表示一个整体与部分的关系,指一个依托整体而存在的关系(整体与部分不可以分开);比如眼睛和嘴对于头来说就是组合关系,没有了头就没有眼睛和嘴,它们是不可分割的。在UML中,组合关系用带实心菱形的直线表示。
聚合:聚合是比合成关系的一种更强的依赖关系,也表示整体与部分的关系(整体与部分可以分开);比如螺丝和汽车玩具的关系,螺丝脱离玩具依然可以用在其它设备之上。在UML中,聚合关系用带空心菱形的直线表示。

八、迪米特法则

(Law of Demeter,LoD:系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度。

1、定义

又叫最少知识原则(Least Knowledge Principle或简写为LKP)几种形式定义:
不要和“陌生人”说话。英文定义为:Don't talk to strangers.
只与你的直接朋友通信。英文定义为:Talk only to your immediate friends.
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
简单地说,也就是,一个对象应当对其它对象有尽可能少的了解。一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的public方法,我就调用这么多,其他的一概不关心。

2、法则分析

朋友类:在迪米特法则中,对于一个对象,其朋友包括以下几类:
(1) 当前对象本身(this);
(2) 以参数形式传入到当前对象方法中的对象;
(3) 当前对象的成员对象;
(4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
(5) 当前对象所创建的对象。
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。
3、狭义法则和广义法则:
在狭义的迪米特法则中,如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
狭义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。
广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明显。
4、迪米特法则的主要用途:在于控制信息的过载。
在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;
在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;
在类的设计上,只要有可能,一个类型应当设计成不变类;
在对其他类的引用上,一个对象对其他对象的引用应当降到。

5、例子

外观模式Facade(结构型)
迪米特法则与设计模式Facade模式、Mediator模式
系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类,而类与类之间的关系,决定了修改的复杂度,相互作用越多,则修改难度就越大,反之,如果相互作用的越小,则修改起来的难度就越小..例如A类依赖B类,则B类依赖C类,当你在修改A类的时候,你要考虑B类是否会受到影响,而B类的影响是否又会影响到C类. 如果此时C类再依赖D类的话,呵呵,我想这样的修改有的受了。

九、Q&A1、面向对象设计其他原则?

封装变化;
少用继承多用组合;
针对接口编程、不针对实现编程;
为交互对象之间的松耦合设计而努力;
类应该对扩展开发、对修改封闭(开闭OCP原则);
依赖抽象,不要依赖于具体类(依赖倒置DIP原则);
密友原则:只和朋友交谈(最少知识原则,迪米特法则);
说明:一个对象应当对其他对象有尽可能少的了解,将方法调用保持在界限内,只调用属于以下范围的方法: 该对象本身(本地方法)对象的组件 被当作方法参数传进来的对象 此方法创建或实例化的任何对象;
别找我(调用我) 我会找你(调用你)(好莱坞原则);
一个类只有一个引起它变化的原因(单一职责SRP原则);

2、你能解释一下里氏替换原则吗?

严格定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象用o1替换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
通俗表述:所有引用基类(父类)的地方必须能透明地使用其子类的对象。也就是说子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:
  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  • 子类中可以增加自己特有的方法。
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

3、什么情况下会违反迪米特法则?为什么会有这个问题?

迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。

4、给我一个符合开闭原则的设计模式的例子?

开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,如果你想增加一个新的功能,你可以很容易的在不改变已测试过的代码的前提下增加新的代码。有好几个设计模式是基于开闭原则的,如策略模式,如果你需要一个新的策略,只需要实现接口,增加配置,不需要改变核心逻辑。一个正在工作的例子是 Collections.sort() 方法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort() 方法,你需要做的仅仅是实现你自己的 Comparator 接口。

5、什么时候使用享元模式(蝇量模式)?

享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。




日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档