隨筆 - 21  文章 - 12  trackbacks - 0
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          常用鏈接

          留言簿(4)

          隨筆檔案

          文章檔案

          新聞檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

            前面兩錘后,得到很多朋友的鼓勵(lì),并希望繼續(xù)深入探討2BizBox這款免費(fèi)ERP的開(kāi)發(fā)方面的經(jīng)驗(yàn)。這兩天有空,就又寫(xiě)了一錘,歡迎大家拍磚。首先回顧前兩錘大家關(guān)注的一些問(wèn)題:

          ServletFacade總控制器每次收到請(qǐng)求通過(guò)反射區(qū)分發(fā)業(yè)務(wù)處理嗎?是否性能問(wèn)題?

          沒(méi)錯(cuò),每次都反射,性能方面沒(méi)啥問(wèn)題。首先,這里的分發(fā)有兩層,首先是對(duì)模塊EJB的分發(fā),這里會(huì)對(duì)EJB訪(fǎng)問(wèn)實(shí)例進(jìn)行緩存,下次有invoke就直接拿出來(lái)用就行了;接下來(lái)會(huì)對(duì)業(yè)務(wù)層以及進(jìn)一步對(duì)DAO一層的類(lèi)進(jìn)行反射創(chuàng)建實(shí)例并調(diào)用。因?yàn)镈AO類(lèi)非常簡(jiǎn)單專(zhuān)一,就是HQL的處理組織,創(chuàng)建時(shí)基本沒(méi)有任何復(fù)雜業(yè)務(wù),速度會(huì)很快。而且隨著現(xiàn)代虛擬機(jī)和硬件配置的大幅提高,反射的效率影響很小,甚至可以忽略。用Sun官方的話(huà)說(shuō):There is some overhead with reflection, but it's a lot smaller on modern VMs than it used to be。而且,如果以后這個(gè)環(huán)節(jié)真的產(chǎn)生性能問(wèn)題,可以再處理成緩存機(jī)制即可。當(dāng)然緩存也會(huì)帶來(lái)清理維護(hù)的麻煩以及內(nèi)存消耗的成本。這塊的設(shè)計(jì)必須要左右權(quán)衡,均衡就好。至今來(lái)說(shuō),2BizBox的ERP后臺(tái)運(yùn)行還是比較輕量高效的,大家可以試試看。當(dāng)然如果規(guī)模大的商用,服務(wù)器還是要配置好一點(diǎn),內(nèi)存大一點(diǎn)更佳(現(xiàn)在內(nèi)存老便宜了)。

          這個(gè)構(gòu)架中,最后用hibernate 與數(shù)據(jù)庫(kù)連,遇到數(shù)據(jù)量大的時(shí)候能支持嗎?

          沒(méi)問(wèn)題,要相信Hibernate和JBoss的水平,呵呵。Hibernate是非常、非常、非常好而成熟的框架,相信大多數(shù)人都在用了很多年了。效率方面,用JavaEye老大Robbin的話(huà)說(shuō),它產(chǎn)生的SQL可能比在座大多數(shù)人寫(xiě)的SQL水平很可能會(huì)高好一點(diǎn),效率不差。對(duì)于一些復(fù)雜的查詢(xún)和SQL操作,可以穿插直接使用SQL和JDBC的方式來(lái)解決。我們這里也經(jīng)常有創(chuàng)建臨時(shí)表等復(fù)雜的操作,都很正常,Hibernate本身也鼓勵(lì)如此。

          ERP主要是業(yè)務(wù)上的東西,你這個(gè)架構(gòu)是在浪費(fèi)時(shí)間。

          沒(méi)錯(cuò),ERP其實(shí)最主要內(nèi)容還是業(yè)務(wù),鋪天蓋地的功能界面、模塊、報(bào)表、無(wú)數(shù)的字段和數(shù)據(jù)…。但是任何軟件系統(tǒng)的業(yè)務(wù)都是靠軟件本身支撐起來(lái)的。如果造一座大樓,就必須打好地基;如果造或者,就必須先建好鐵軌;如果建大橋,就必須先打好橋墩。否則只強(qiáng)調(diào)“航母主要是飛行甲板,你這個(gè)龍骨設(shè)計(jì)是浪費(fèi)時(shí)間”,也是有失偏頗的。目前2BizBox ERP我們接觸到的代碼就已經(jīng)將近200萬(wàn)行,如果沒(méi)有一個(gè)好一點(diǎn)的架構(gòu)和基礎(chǔ),肯定就亂套了。搞建筑咱不都想造一個(gè)埃菲爾鐵塔百年經(jīng)典作品么,咱做軟件的也不能示弱啊。

          這樣的話(huà)還不如直接用RMI通訊。

          RMI確實(shí)是一個(gè)可行方案,其實(shí)我們的ERP以前采用過(guò),不過(guò)后來(lái)?yè)Q掉了,不是很推薦。RMI+IIOP曾經(jīng)一度被Sun委以重任,卻最終沒(méi)流行起來(lái),尤其在Web為王的今天。主要原因還是太復(fù)雜笨重。我們也曾經(jīng)使用RMI+IIOP+EJB的方式來(lái)做前后臺(tái)通訊,但是效率、穩(wěn)定性、復(fù)雜度都很高,開(kāi)發(fā)和部署都很麻煩,就一個(gè)異常傳遞處理就夠弄一壺的。如果再要實(shí)現(xiàn)回調(diào),還要在本地起一個(gè)服務(wù)server,部署麻煩。另外一個(gè)大問(wèn)題是端口,它需要獨(dú)立的端口(例如通常是1099),如果前臺(tái)回調(diào),還要客戶(hù)端Socket服務(wù)端口。如果考慮到后臺(tái)的Web本身還要80端口,這勢(shì)必要求防火墻開(kāi)放更多端口,很多服務(wù)器和管理員都不愿如此,他們基本上只相信80,其他一概關(guān)閉。基于“效率低”、“使用部署麻煩”、“防火墻端口”等幾個(gè)方面問(wèn)題,2BizBox ERP還是使用了Java Serialization over HTTP的思路處理前后臺(tái)通訊。這樣,后臺(tái)只需要開(kāi)一個(gè)80端口就行了,和Web服務(wù)器一樣,前臺(tái)則和一個(gè)瀏覽器一樣。當(dāng)然,這樣也沒(méi)法實(shí)現(xiàn)Callback了,不過(guò)基本上無(wú)所謂,所有的Web應(yīng)用不都是如此么。

          對(duì)于把ejb換成 80 直接訪(fǎng)問(wèn),速度是快了,ejb容器很多用途現(xiàn)在都怎么完成的?比如事務(wù)完整性的控制?

          首先,這個(gè)設(shè)計(jì)并非直接把ejb弄到80上去。2BizBox ERP是把EJB用在后臺(tái)容器內(nèi)部,而外部用Servlet+80的方式。其實(shí)JBoss真有類(lèi)似“EJB over HTTP/HTTPS”的類(lèi)似技術(shù),感興趣的朋友可以看看這里:http://docs.jboss.org/ejb3/docs/tutorial/http_https/http_https.html 不過(guò)沒(méi)試驗(yàn)過(guò),對(duì)其效率、復(fù)雜度、等安全性等方面不敢下結(jié)論。其次,ejb的所有特性(例如最重要的事務(wù)控制)都沒(méi)有變化,該怎么用還是怎么用就行了。(這里插入2BizBox事務(wù)的啟動(dòng)和回滾代碼)
          UserTransaction tx = null;
          try {
          tx 
          = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
          tx.begin();
          //這里創(chuàng)建DAO,做各種事情
          BaseDao dao =..
          //提交事務(wù)
          tx.commit();
          }
           catch (Exception e) {
          e.printStackTrace();
          if (tx != null{
          try {
          tx.rollback();
          //回滾事務(wù)
          }
           catch (Exception ex) {
          ex.printStackTrace();
          }

          throw new RuntimeException(e);
          }

          }
           

          問(wèn)個(gè)題外話(huà),這個(gè)打包的安裝文件是用什么工具生成,能否說(shuō)說(shuō)使用方法?

          安裝文件是用Inno Setup這個(gè)開(kāi)源工具做的,它支持多component、多語(yǔ)言,很簡(jiǎn)單方便,很推薦。Inno Setup發(fā)展十多年了,很穩(wěn)定成熟,使用人很多,資料也不少,詳細(xì)可以看這里:http://www.jrsoftware.org/isinfo.php

          我們現(xiàn)在也在用swing做開(kāi)發(fā),不過(guò)客戶(hù)端部署方式上我們直接采用web start方式。

          關(guān)于Java Web Start使用,忍不住想多說(shuō)一些。我們以前也是使用Java Web Start來(lái)對(duì)客戶(hù)端進(jìn)行部署的。最主要覺(jué)得這個(gè)東西可以讓客戶(hù)端自動(dòng)更新,比較省事。但是隨著客戶(hù)量增大、客戶(hù)端復(fù)雜度越來(lái)越高、發(fā)現(xiàn)的Java Web Start的bug越來(lái)越多,我們最終放棄了Java Web Start,轉(zhuǎn)而使用傳統(tǒng)的安裝文件的方式。對(duì)JWS技術(shù),我的意見(jiàn)是:一定要慎用。JWS的思路很好,Sun也一直想把它做好,可惜人手不夠,Swing都顧不上了,哪里有心思JWS,結(jié)果導(dǎo)致bug暴多。大家如果不信,可以看看JDK6的每個(gè)update有多少bug fixing是關(guān)于JWS的,簡(jiǎn)直不計(jì)其數(shù)。我們客戶(hù)碰到的問(wèn)題也是千奇百怪:下載速度特別慢的問(wèn)題、update進(jìn)度條不準(zhǔn)(JWS的下載進(jìn)度條就從來(lái)沒(méi)準(zhǔn)過(guò))、快捷創(chuàng)建的問(wèn)題、有時(shí)候死活不update的問(wèn)題、不同語(yǔ)言的問(wèn)題、需要同時(shí)存在不同版本客戶(hù)端連接不同版本后臺(tái)的問(wèn)題、快捷鍵無(wú)法刪除問(wèn)題、不同瀏覽器問(wèn)題、JNLP文件內(nèi)容修改維護(hù)問(wèn)題…等等等等,想起來(lái)簡(jiǎn)直是罄竹難書(shū),經(jīng)常被客戶(hù)逼的要跳樓,你卻毫無(wú)辦法:因?yàn)槟銦o(wú)法控制這些東西。最終我們選擇徹底放棄JWS,用傳統(tǒng)的setup方式反而更加方便直觀。這里有我們同事整理的一些文章,感興趣的朋友可以看

          看:http://sailing8036.spaces.live.com/blog/cns!69D05DFD4294F487!479.entry?wa=wsignin1.0&sa=728927372

          現(xiàn)實(shí)告訴我們,即使做java的,還得分windows版和linux版。請(qǐng)教樓主一個(gè)問(wèn)題,你們用ejb是什么道理?是做事務(wù)管理嗎?

          其實(shí)2BizBox前后臺(tái)都可以在linux下面運(yùn)行,不過(guò)要做到自動(dòng)安裝等比較麻煩,現(xiàn)在為了讓大家都能免費(fèi)方便的使用這款ERP,所以?xún)H僅制作了windows的安裝程序,方便下載、安裝。2BizBox ERP的前后臺(tái)都具有非常好的跨平臺(tái)特性,后續(xù)發(fā)布版本可能會(huì)做到zip方式合二為一。用EJB,確實(shí)一個(gè)重要原因是事務(wù)控制。作為大型的ERP系統(tǒng),數(shù)據(jù)的一致性和完整性是必須要嚴(yán)格控制的,事務(wù)控制也必不可少。由于EJB下層使用了大量的業(yè)務(wù)層并進(jìn)一步調(diào)用DAO層進(jìn)而操作數(shù)據(jù)庫(kù),這些方法必須在EJB層進(jìn)行統(tǒng)一的事務(wù)管理。通過(guò)JTA的統(tǒng)一封裝,可以做到原子化的成功和失敗回滾,保證數(shù)據(jù)安全和完整性。大家都抨擊EJB很爛,不過(guò)使用Local的無(wú)狀態(tài)Bean+事務(wù)控制,還是很好的一個(gè)東西。

          當(dāng)時(shí)沒(méi)考慮國(guó)際化?這個(gè)東西免費(fèi)太匪夷所思了。

          國(guó)際化是必須的,Java有I18N這么好的框架,2BizBox怎能不用吶?我們是直接使用Java的PropertyResourceBundle,把所有的字符串都拉入properties文件,對(duì)不同語(yǔ)言文件進(jìn)行維護(hù)。我們甚至內(nèi)部開(kāi)發(fā)了專(zhuān)用的多語(yǔ)言字符串翻譯維護(hù)工具,減少工作量。目前v3新版本的漢化工作正在緊張有序進(jìn)行,接近尾聲,還需要測(cè)試和檢驗(yàn),請(qǐng)大家再耐心等待!關(guān)于這類(lèi)大型管理軟件的翻譯、漢化和多語(yǔ)言支持還有很多話(huà)題和細(xì)節(jié),如果大家感興趣,我會(huì)專(zhuān)門(mén)寫(xiě)一篇介紹。另外這個(gè)ERP免費(fèi),確實(shí)很難以置信!讓人雞動(dòng)!!不過(guò)免費(fèi)是一種潮流和發(fā)展方向,不管認(rèn)同不認(rèn)同,掌聲鮮花或口水謾罵,咱們其實(shí)都是受益者。QQ和360打架討厭,但它們都是優(yōu)秀的免費(fèi)軟件,給整個(gè)行業(yè)和國(guó)家做出了巨大的貢獻(xiàn),這一點(diǎn)是不能否認(rèn)的。希望大家能支持和宣傳2BizBox ERP軟件,讓全中國(guó)更多的企業(yè)可以從高質(zhì)量的免費(fèi)ERP軟件中收益!

          好了,總算可以進(jìn)入正題了。今天的話(huà)題是軟件界面要“好看”,更要“好用”,這兩點(diǎn)很重要,缺一不可。好看不好看,或者好用不好用,都是比較抽象的概念,仁者見(jiàn)仁智者見(jiàn)智。但是,軟件“以用為本”這一點(diǎn)我們都不否認(rèn)。2BizBox項(xiàng)目在國(guó)內(nèi)外很多人參與,語(yǔ)言不同、文化不同、習(xí)慣不同,連IDE工具都不同;要做到成千上萬(wàn)界面的美觀一致和專(zhuān)業(yè),需要做很多細(xì)致工作,開(kāi)會(huì)、討論、電話(huà)、郵件、skype…煩不勝煩。不過(guò),說(shuō)到底都是細(xì)活兒。其實(shí)做高質(zhì)量軟件的唯一秘密也就是 “細(xì)節(jié)”這僅此一點(diǎn)而已。

           

          風(fēng)格一致Same Style

          2BizBox ERP中的界面成千上萬(wàn)不計(jì)其數(shù),開(kāi)發(fā)者眾多,如何保證圖形界面的布局風(fēng)格一致?這需要有文檔規(guī)定,還要開(kāi)會(huì)、培訓(xùn)、測(cè)試、檢查、評(píng)審等等。Windows是圖形界面的鼻祖和大家,如下圖,隨便找一個(gè)Windows界面,仔細(xì)觀察,你會(huì)有所收獲:



           

          • 界面邊緣以及內(nèi)部邊距都很一致(一般都為5或10)。要體現(xiàn)在軟件開(kāi)發(fā)中也很簡(jiǎn)單。例如在使用Swing的FlowLayout進(jìn)行布局,直接可以指定默認(rèn)間距,避免不同開(kāi)發(fā)者的設(shè)計(jì)風(fēng)格出現(xiàn)差異:

          1public FlowLayout() {
          2this(CENTER, 55);
          3}

          4public FlowLayout(int align) {
          5this(align, 55);
          6}

          7
           

          •對(duì)齊方式都很統(tǒng)一(左對(duì)齊)

          •通過(guò)帶標(biāo)題的Group對(duì)界面元素進(jìn)行適當(dāng)分組

          此外,在2BizBox客戶(hù)端開(kāi)發(fā)中,對(duì)于所所有界面,都要遵循一些要求和慣例,這些要求有時(shí)候都很難用語(yǔ)言描述清楚,更多的是要靠開(kāi)發(fā)者多思考和體會(huì):

          • 每個(gè)界面都有比較清晰的標(biāo)題,盡量做到能夠“見(jiàn)文生意”。

          • 使用統(tǒng)一風(fēng)格和尺寸的圖標(biāo);所有界面有一致的顏色和尺寸風(fēng)格;2BizBox ERP中的所有圖標(biāo)、顏色、字體等甚至都被統(tǒng)一封裝到特別的類(lèi)中,自己是不能隨意使用各種顏色、字體、圖標(biāo)的,這樣才能做到“風(fēng)格一致”。
           1public class IconStore {
           2public static final Image BB2_FRAME_ICON = ClientUtil.getImage("logoicon.gif");
           3public static final Image COMPANY_NODE_ICON = ClientUtil.getImage("company.png");
           4public static final Icon CLOSED_STATUS_ICON = ClientUtil.getIcon("closed_status.gif");
           5public static final Icon RUN_ICON = ClientUtil.getIcon("run.gif");
           6public static final Icon STOP_ICON = ClientUtil.getIcon("stop.png");
           7public static final Icon ROOT_ICON = ClientUtil.getIcon("root.png");
           8public static final Icon CHART_ICON = ClientUtil.getIcon("chart.png");
           9public static final Icon REPLY_NOTICE_ICON = ClientUtil.getIcon("notice_re.png");
          10public static final Icon FORWARD_NOTICE_ICON = ClientUtil.getIcon("notice_fw.png");
          11public static final Icon PICTURE_ICON = ClientUtil.getIcon("picture.png");
          12public static final Icon CAPTURE_F4_ICON = ClientUtil.getIcon("capturef4.png");
          13
          14public class FontStyle
          15{
          16
          17public static final String KEY_EN_FONT_NAME = "PREFERENCES_EN_FONT_NAME";
          18public static final String KEY_EN_FONT_SIZE = "PREFERENCES_EN_FONT_SIZE";
          19public static final String KEY_NATIVE_FONT_NAME = "PREFERENCES_NATIVE_FONT_NAME";
          20public static final String KEY_NATIVE_FONT_SIZE = "PREFERENCES_NATIVE_FONT_SIZE";
          21public static final String DEFAULT_EN_FONT_NAME = "Dialog";
          22public static final String DEFAULT_NATIVE_FONT_NAME = "Dialog";
          23public static final int DEFAULT_EN_FONT_SIZE = 11;
          24public static final int DEFAULT_NATIVE_FONT_SIZE = 12;
          25public static final int DEFAULT_LARGE_FONT_SIZE = 30;
          26
          27public class ColorStore
          28{
          29
          30public static final String BACKGROUND_COLOR = "Color";
          31public static final Color BACKGROUND_ALL_UI = Color.white;
          32public static final Color BACKGROUND_UPDATE_UI = Color.red;
          33public static final Color BACKGROUND_HOMEPAGE = BACKGROUND_ALL_UI.darker();
          34public static final Color FOREGROUND_HIGHLIGHT_FIELD = Color.black;
          35public static final Color BACKGROUND_ADD_PANE = new Color(0xCC0xCC0xCC);
          36

           

          • 有操作的界面要有“取消”或“關(guān)閉”按鈕。

          • 除主窗體外,基本不使用工具條和狀態(tài)條。

          • 慎用顏色和各種字體(包括字體大小和類(lèi)型)。過(guò)多的顏色和字體會(huì)顯得混亂,也會(huì)給用戶(hù)一種不安的情緒。不過(guò),對(duì)于一些需要提示用戶(hù)注意的元素,又要堅(jiān)定不移的用鮮明甚至刺激的顏色進(jìn)行標(biāo)示。這其中的平衡比較不好把握,不過(guò)“避免出錯(cuò)”比“好看”總是更重要的。2BizBox的早期版本風(fēng)格非常樸素,甚至有點(diǎn)“灰頭土臉”的。但誰(shuí)說(shuō)ERP或管理軟件就應(yīng)當(dāng)“一臉古板”呢?經(jīng)過(guò)反復(fù)嘗試,2BizBox還是選擇了能讓人心情更加舒適愉悅情緒穩(wěn)定的綠色和灰色作為主顏色,配合橙色、黃色、暗

          紅色來(lái)突出一些界面元素,做到搭配合理。總之,界面風(fēng)格就和穿衣服一樣,不在乎花里胡哨,而在乎搭配和協(xié)調(diào)。


           

          • 彈出消息要友好、清晰。2BizBox中的彈出消息分4個(gè)級(jí)別,包括詢(xún)問(wèn)、信息、警告、錯(cuò)誤


           

          其中,嚴(yán)格慎用error錯(cuò)誤級(jí)別的消息,除非碰到非常非常嚴(yán)重的情況,例如底層故障、無(wú)法繼續(xù)操作等。過(guò)多的error錯(cuò)誤信息,會(huì)給用戶(hù)“系統(tǒng)容易崩潰”的感覺(jué),讓用戶(hù)覺(jué)得恐慌,不踏實(shí)。軟件雖然有會(huì)有各種異常,但是跟用戶(hù)解釋的時(shí)候卻要顯得“蛋定”,不要總拿“大紅叉叉”的message嚇唬用戶(hù)。此外,彈出消息不光要提示發(fā)生了什么,還要盡量給出解決辦法和后續(xù)推薦操作,甚至直接引導(dǎo)用戶(hù)進(jìn)行后續(xù)操作(如下圖,提示設(shè)置零件圖片F(xiàn)TP設(shè)置的提示消息)。


           

          • 按鈕要有文字。如果只有icon無(wú)文字,必須設(shè)置清晰可讀的tooltip;

          • 減少界面中的邊框。有的軟件喜歡用邊框,大框套小框,最后框框一大堆,內(nèi)容反而被弱化。邊框本意僅僅是做好“組織分類(lèi)”的作用,過(guò)多濫用反而喧賓奪主,造成用戶(hù)眼花:


           

          • 常用按鈕的排列順序要一致。2BizBox ERP中是大概按照“打印-刷新-編輯-添加-復(fù)制-快速查看-關(guān)閉”等順序安排的。關(guān)閉按鈕統(tǒng)一放在右下方,其他按鈕放在左下方,依次橫向排列。

           

          • 有遠(yuǎn)程操作的界面,要有等待或進(jìn)度條,并可以取消,因?yàn)檎l(shuí)也無(wú)法說(shuō)清遠(yuǎn)程調(diào)用會(huì)消耗多少時(shí)間。執(zhí)行結(jié)果要有明確提示:如失敗提示,或成功后界面直接跳轉(zhuǎn)。


           

          • 盡量用內(nèi)嵌的Tab窗口顯示數(shù)據(jù),而非獨(dú)立的JFrameJDialog,避免界面雜亂并占用資源。我們的經(jīng)驗(yàn)發(fā)現(xiàn),大量不關(guān)閉的JFrameJDialog將占用大量操作系統(tǒng)資源,導(dǎo)致內(nèi)存占用嚴(yán)重,系統(tǒng)變慢。而使用Swing輕量的組件如用內(nèi)嵌Tab界面,則占用資源極少,基本上可以使勁new,畢竟他是輕量的(也就是SwingPaint出來(lái)的),而不是重量的(操作系統(tǒng)的本地對(duì)等窗口對(duì)象)。除非有必要,才使用彈出對(duì)話(huà)框,因?yàn)槟J降膹棾鰧?duì)話(huà)框會(huì)阻斷用戶(hù)的其他交互。例如在模式對(duì)話(huà)框上填寫(xiě)了一堆數(shù)據(jù),突然發(fā)現(xiàn)一個(gè)數(shù)據(jù)需要到其他模塊差一下,此時(shí)會(huì)陷入嚴(yán)重的困境。使用對(duì)話(huà)框彈出必須屏幕居中,且要保持模式狀態(tài)。個(gè)人始終認(rèn)為,非模式的彈出對(duì)話(huà)框,是軟件中最怪異的做法之一。


           

          • 不要濫用圖標(biāo)。很多人喜歡用圖標(biāo),感覺(jué)用了圖標(biāo)軟件會(huì)更好看。按鈕、菜單、tab、列表、樹(shù)、下拉框甚至Label等等都大量使用圖標(biāo)。而且大多程序員自己不會(huì)設(shè)計(jì)圖標(biāo),只是到處google或扣別人的圖標(biāo),弄的軟件界面七拼八湊,風(fēng)格雜亂、花里胡哨、嘩眾取寵,界面反而失去了重點(diǎn)。就像女孩子穿衣服不是說(shuō)把最好看的毛衣、外套、帽子、鞋子一股腦穿上就肯定好看。穿衣戴帽講究的是“搭配”,Icon也是同樣。Icon的作用是起到標(biāo)示和圖示的作用,增加軟件的美觀性和可理解性,但是不可過(guò)多濫

          用。

          • 窗體比例協(xié)調(diào)。無(wú)論是Frame還是Dialog,長(zhǎng)寬比例要協(xié)調(diào),一般控制在5:3到3:5之內(nèi),超過(guò)2倍的比例一般都不太推薦。人的上半身和下半身的最佳比例也有一個(gè)范圍,光靠上半身很長(zhǎng),估計(jì)也找不到女朋友不是?


           

          • 界面布局要考慮易維護(hù)性、易理解性,而不是只考慮個(gè)人喜好甚至炫弄技巧。例如下圖例子:用過(guò)多的按鈕設(shè)計(jì)省份非常失敗,加入增加一個(gè)省份則需要修改代碼。“黑龍江”由于三個(gè)字被迫移動(dòng)到下方,和“港澳臺(tái)”一起,引起用戶(hù)困惑。


           

          減少點(diǎn)擊Less Click

          軟件的一個(gè)重要任務(wù)就是方便操作,省時(shí)省力。所謂“簡(jiǎn)單、方便、快捷”,可不僅僅是口號(hào)。要做這一點(diǎn),首先要從“減少鼠標(biāo)點(diǎn)擊”開(kāi)始。鼠標(biāo)點(diǎn)擊動(dòng)作能省一定要省,能少一定要少。能一目了然的信息,就不要拆的哲理那里、繞來(lái)繞去。軟件業(yè)里面一個(gè)極端說(shuō)法是“3次點(diǎn)擊即可調(diào)出任意功能”,雖然比較難,但是足以說(shuō)明“軟件以用為本”的思想。以下舉一些例子,可能會(huì)引來(lái)大家的共鳴或爭(zhēng)議,不過(guò)歡迎大家積極探討,畢竟軟件界面設(shè)計(jì)沒(méi)有完全的一定之規(guī),而且也隨著時(shí)代的變化而發(fā)展,有點(diǎn)類(lèi)似服裝設(shè)計(jì)。要不說(shuō)我們程序員和服裝設(shè)計(jì)師、建筑師是一類(lèi)人呢!蓋樓造衣服都有各自品牌或設(shè)計(jì)師特色,但都會(huì)遵守一定的基本規(guī)則,不會(huì)亂來(lái)。

          • 一個(gè)界面上,除非特別必要才使用tab。為什么?減少點(diǎn)擊。因?yàn)榍袚Qtab需要多一次鼠標(biāo)點(diǎn)擊。不過(guò)我們可以看到很多軟件界面都特喜歡tab:沒(méi)多少信息,還弄了一個(gè)大大的tab;tab上標(biāo)簽頁(yè)很多,可點(diǎn)來(lái)點(diǎn)去,每個(gè)tab上東西卻寥寥無(wú)幾,讓人惱火。程序員往往喜歡從自己的喜好,想當(dāng)然的設(shè)計(jì)這樣的界面,完全沒(méi)有考慮使用者的感受,既不直觀,也費(fèi)時(shí)費(fèi)力,沒(méi)有體現(xiàn)“軟件以用為本”的思想。

          • 能一個(gè)界面顯示完整的信息,就不要拆成多個(gè)界面。ERP里面很多單據(jù)信息復(fù)雜,關(guān)聯(lián)信息眾多,如何讓用戶(hù)清晰、一目了然所有的數(shù)據(jù),是一個(gè)難題。不過(guò),我們的原則是,寧可多現(xiàn)實(shí)一些數(shù)據(jù),也不拆分成多個(gè)需要點(diǎn)擊按鈕分別呈現(xiàn)的界面。數(shù)據(jù)多,界面會(huì)顯得繁雜一點(diǎn),但是眼睛的移動(dòng)速度總比鼠標(biāo)再點(diǎn)擊按鈕查看新界面的速度更快。況且,通過(guò)不斷的布局優(yōu)化和組織重構(gòu),總是有辦法讓信息更加清晰。

          • 界面信息飽滿(mǎn),重心穩(wěn)定,頭重腳輕、大面積空白。一個(gè)好的例子是2BizBox的“快速訪(fǎng)問(wèn)視圖”。大家初次看到這個(gè)界面,一定有“密密麻麻”的感覺(jué),其實(shí)這是經(jīng)過(guò)精挑細(xì)選,把最常用的功能入口都統(tǒng)一組織放在了這個(gè)最方便醒目的位置,讓用戶(hù)可以快速進(jìn)入一個(gè)常用的功能,減少點(diǎn)擊次數(shù),增加易用性。這就是為什么很多用戶(hù)習(xí)慣了2BizBox后就會(huì)愛(ài)不釋手。“漂亮”和“易用”那個(gè)更重要?這就像問(wèn)找老婆“漂亮”和“善良”哪個(gè)更重要一樣:如果無(wú)法兼得,咱寧可都選擇后者。


           

          • 能用復(fù)選框,就不用下拉框。為什么?因?yàn)槎嗔艘淮吸c(diǎn)擊。請(qǐng)問(wèn),選擇一個(gè)“YES”、“NO”的選項(xiàng),用checkbox點(diǎn)擊幾次,而用ComboBox又是點(diǎn)擊幾次?

          • 能用列表,就不用下拉框。為什么?因?yàn)槎嗔艘淮吸c(diǎn)擊。List可以直接點(diǎn)擊選擇,而且所有選項(xiàng)可以一目了然,還可以做到多項(xiàng)選擇。而下拉框只能單選,還要先點(diǎn)擊一次下拉。當(dāng)然,ComboBox比List有占空間小的優(yōu)勢(shì)。所以很多時(shí)候,界面設(shè)計(jì)是一種美觀、易用的妥協(xié)結(jié)果。也許沒(méi)有多少高深技術(shù)問(wèn)題,但細(xì)節(jié)對(duì)于易用性和軟件的品質(zhì)卻很重要。

          • 菜單不能深,最多2層。為什么?減少點(diǎn)擊次數(shù)。超過(guò)2層的菜單,功能被隱藏太深,組織結(jié)構(gòu)太復(fù)雜,太難用,同時(shí)也增加了點(diǎn)擊次數(shù)。舉一個(gè)例子:一個(gè)大樓,進(jìn)去一個(gè)主走廊,兩側(cè)是辦公室,或可以再有分支走廊;如果分支走廊兩側(cè)還有進(jìn)一步的“毛細(xì)走廊”,你可能直接就暈菜了,這樣的迷宮大樓,你敢進(jìn)么?2BizBox所有功能都集中在主界面的主菜單上,雖然功能眾多,卻保持兩層的設(shè)計(jì),簡(jiǎn)單方便。

          • 統(tǒng)一的快捷鍵操作方式,減少鼠標(biāo)操作。例如,所有tab內(nèi)嵌窗體都可以通過(guò)ESC關(guān)閉,按F5刷新,等等。如果你鍵盤(pán)熟練,則會(huì)感覺(jué)很快很方便。

          • 盡量不用右鍵菜單。為什么?減少點(diǎn)擊。當(dāng)年一個(gè)美國(guó)同事這樣培訓(xùn)我們:右鍵菜單被稱(chēng)為“hiddenfunctions”,是比較tricky的stuff,能不用盡量不用,我們印象很深刻。沒(méi)錯(cuò),這幾年經(jīng)常看到幾近花甲的工廠老人在用2BizBox,他們一生搬零件或畫(huà)圖紙的手拿起鼠標(biāo)來(lái)卻可能顯得笨拙顫抖,不要說(shuō)右擊菜單,就是單擊和雙擊對(duì)他們都很難。對(duì)于他們來(lái)說(shuō),右鍵菜單這個(gè)東西絕對(duì)是夠tricky的。可千萬(wàn)別說(shuō)這些人蠢,ERP的用戶(hù)就是這些制造業(yè)的勞苦大眾,不都是程序員和游戲狂人,他們甚至整年少碰電腦。我們程序員的任務(wù)是讓軟件適應(yīng)人,而不是讓人適應(yīng)軟件。我們永遠(yuǎn)都不要嘲笑自己的用戶(hù)。另外,右鍵菜單是把固有的功能“藏起來(lái)”,如果不動(dòng)手,光靠眼睛看,是無(wú)法觀察到這些功能的,違反了“一目了然”的原則。一個(gè)界面如果不能通過(guò)觀察就可以大概猜測(cè)出其功能和用法,則是比較失敗的。所以右鍵菜單應(yīng)當(dāng)慎用。

          為了減少點(diǎn)擊,2BizBox對(duì)功能的組織可謂費(fèi)盡心機(jī)。在主界面上就有如下體現(xiàn):

          • 主菜單:羅列了所有模塊、子模塊的所有功能點(diǎn),并保持了2層菜單結(jié)構(gòu)。這里像一個(gè)功能字典,讓初次接觸2BizBox的用戶(hù)可以滑動(dòng)鼠標(biāo),快速了解2BizBox的模塊和功能。隱藏較深的功能,也可以通過(guò)主菜單,快速進(jìn)入任何功能入口。有人說(shuō)菜單這個(gè)東西很土,有點(diǎn)過(guò)時(shí)了。不過(guò)無(wú)論采用什么技術(shù),“易用性”永遠(yuǎn)不會(huì)過(guò)時(shí)。

           

          • 模塊欄:模塊欄把2BizBox中所有的模塊、子模塊經(jīng)過(guò)篩選和組織,直觀的放在一起。同時(shí),配合屏幕中間的模塊關(guān)系流程圖,能夠更清晰的了解模塊的組織結(jié)構(gòu)和關(guān)系。

          • 快速任務(wù)列表:當(dāng)選中任意模塊或子模塊,右側(cè)的“快速列表”都會(huì)直接過(guò)濾并顯示當(dāng)前選中模塊的常用功能。“快速列表中”顯示的都是經(jīng)過(guò)精挑細(xì)選、用戶(hù)最常用的功能,并通過(guò)幾個(gè)經(jīng)典易懂的圖標(biāo)來(lái)快速標(biāo)示其“添加”、“修改”、“查詢(xún)”的功能類(lèi)別。直接點(diǎn)擊,即可進(jìn)入該功能界面。


           

          • 快速訪(fǎng)問(wèn)視圖:如果說(shuō)“快速任務(wù)列表”無(wú)法直觀的給出每個(gè)功能的查詢(xún)操作參數(shù),那么“快速訪(fǎng)問(wèn)視圖”則可以解決這一問(wèn)題。在這里,羅列了本模塊最最常用的一些功能入口,并直接給出了該功能需要輸入的各種參數(shù)。這樣,用戶(hù)可以一目了然的看到每個(gè)功能和參數(shù),直接輸入?yún)?shù)并點(diǎn)擊按鈕進(jìn)入功能界面。

          • 模塊快捷按鈕:在模塊圖上,每個(gè)模塊節(jié)點(diǎn)的右邊都有三個(gè)小圖標(biāo),對(duì)應(yīng)三個(gè)快捷按鈕。這三個(gè)快捷按鈕,是該模塊最最最常用的三個(gè)功能,可以直接點(diǎn)擊進(jìn)入,進(jìn)一步減少點(diǎn)擊次數(shù)。

           

          2BizBox ERP中文版(內(nèi)部預(yù)覽)

          你可能會(huì)說(shuō),至于這么大動(dòng)干戈的減少點(diǎn)擊次數(shù)么?好,咱們舉一個(gè)例子吧:假如你做的一個(gè)2BizBox界面會(huì)被1萬(wàn)人使用,或者說(shuō),2BizBox軟件足夠lucky,可以被100萬(wàn)人使用,而這些人每天都至少操作這個(gè)界面一次。如果你的界面設(shè)計(jì)增加了一次點(diǎn)擊,按每次點(diǎn)擊用時(shí)1秒,你知道這次設(shè)計(jì)每年會(huì)消耗掉多少時(shí)間嗎?100萬(wàn)人*360天=3.6億秒=10萬(wàn)小時(shí)=12500個(gè)工作日=568個(gè)工作月=近50工作年。如果按一個(gè)人一生工作35年計(jì)算,你的這個(gè)設(shè)計(jì)不亞于毀掉了一條半人命。這是在犯罪、在殺人,不是嗎?

          posted on 2011-02-15 12:16 zhangchuanzheng 閱讀(2606) 評(píng)論(0)  編輯  收藏
          主站蜘蛛池模板: 岳阳县| 古蔺县| 沙坪坝区| 玉林市| 阳曲县| 札达县| 邳州市| 雅江县| 家居| 通化县| 芦山县| 平湖市| 张家港市| 建宁县| 瑞金市| 桐庐县| 新宾| 宁强县| 平舆县| 满洲里市| 河东区| 平远县| 芜湖市| 桃园市| 蓝田县| 靖宇县| 陇西县| 湘潭县| 若羌县| 西和县| 友谊县| 景谷| 绥化市| 兖州市| 赫章县| 巫山县| 大姚县| 宣汉县| 天水市| 娱乐| 纳雍县|