<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          商品展示列表——大圖、多圖、圖文列表該如何選擇?

          資深UI設計者

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          Image title

          Image title

          Image title



          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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=";引申一下在上述過程中,你會發現,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='其他小程序中的屏幕適配最近在寫小程序,在小程序里,使用的是小程序的那套,跟平時用的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 推薦好用應用等不需要付費,但是能夠吸引用戶使用你的產品,這個可以稱為「回饋型觸發」;

          還有熟人之間的相互推薦,親朋好友的口碑相傳,這種方式十分常見,也是能夠讓產品大規模獲取用戶的一種方式,我們可以稱為「人際型觸發」。

          但是這種方式經常會被惡意利用,比如我們經??吹降模悍窒鞽X到幾個群即可領取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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。


          如何利用「行為模型」讓用戶行動起來?

          資深UI設計者

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里


          想一個問題吧,如果有人給你發了一條微信,你沒有回復 ta,原因是什么?

          • 可能是給你發消息的人對你來說不重要?或者消息內容不重要,不需要立刻回復?
          • 可能是你暫時特別忙,沒有時間回復?
          • 也可能是你的微信關閉了消息提醒,沒有聽到手機震動,不知道有人給你發了消息……

          原因會有很多種,但是幾乎每一種原因都可以對應到更深的層次。比如給你發消息的人對你而言不重要,是因為缺乏了回復的動機;沒時間回復是因為缺乏了回復的能力;關閉了提醒是缺乏了回復的觸發因素……

          動機,能力,觸發三大要素,是讓用戶產生行為必不可少的三大條件,在行為模型里也十分重要。

          一、什么是行為模型?

          最早在 Norman 的《設計心理學》了解到關于行動的幾個步驟,他將行動拆分為目標,執行,評估三大階段,每一階段又分為幾個步驟,簡單畫了邏輯圖 :

          但是很多時候會發現,用戶不一定會按我們所設想的方式去使用我們的產品,特別是注冊,購買等能提升轉化率的行為……我在查詢了一些關于心理學方面的內容后,發現了用戶不進行這些行為,其實都是有可以解釋的依據的,并且我們還可以利用這些依據來改善我們的產品。

          從前面微信的例子,我們可以得知,要想讓用戶產生行為(Behavior),必須具備三個要素:充分的動機(Motive),完成這一行為的能力(Ability),促使人們付諸行動的觸發(Trigger),這三者缺一不可。

          于是我們可以得出一個行為模型:B=MAT,我們可以從數學的角度類比出人們產生行為的「臨界點」,可以稱為「行動邊界線」(當然這是我自己瞎取的名字,方便理解),只有用戶跨越了「行動邊界線」,才能實施或者產生某種行為。

          二、關于Trigger——觸發

          所謂觸發,就是促使用戶做出某種舉動的誘因,引發用戶去使用你的產品。

          比如通過在其他平臺廣告推廣等付費方式吸引新用戶,這個可以稱為「付費型觸發」;

          還有一些公關、媒體新聞的正面報道 ,app store 里面排行榜,AppSo 推薦好用應用等不需要付費,但是能夠吸引用戶使用你的產品,這個可以稱為「回饋型觸發」;

          還有熟人之間的相互推薦,親朋好友的口碑相傳,這種方式十分常見,也是能夠讓產品大規模獲取用戶的一種方式,我們可以稱為「人際型觸發」。

          但是這種方式經常會被惡意利用,比如我們經??吹降模悍窒鞽X到幾個群即可領取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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計  ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。




          移動端搜索功能設計:3個階段解析搜索流程設計要點

          博博

          移動端搜索功能設計:3個階段解析搜索流程設計要點


          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          移動端搜索功能設計:3個階段解析搜索流程設計要點

          人人都是產品經理 2017-01-04 18:08:02


          這篇文章筆者想和大家聊一聊有關搜索功能的設計,搜索功能是每個內容型APP的核心,它的易用性決定了用戶是否能從APP里快速找到自己想找的內容,那么決定搜索體驗好壞的關鍵點又是什么呢?這里我總結了兩點,“操作的易用性”和“結果的準確性”??此坪唵蔚膬牲c卻有很多的學問,筆者把搜索的交互流程劃分成三個關鍵階段,“搜索前、搜索中及搜索后”,接下來將從這三個階段逐一分析整個搜索流程中的相關設計。

          移動端搜索功能設計: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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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的運行時刻庫支持??傊甅FC對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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合