就是愛分享

對於原先『單工式』程式開發的技術人員而言,『多執行緒』是一項 Java的全新特色,也就是在每一個行程(process)中包含多個執行緒(Thread),因為多執行緒應用程式將程式分割成一些獨立的工作,在運用得當的應用程式中,多執行緒可以大幅提升效能。

何謂執行緒(thread)
在說明執行緒前,讓我們先來了解什麼是行程(process)。作業系統在執行一個應用程式時,正在執行的應用程式稱為一個行程,系統會分配相對的系統資源與CPU時間,執行另一個應用程式時,則是另一個行程與資源分配的產生,同時會有對應的CPU時間。在執行應用程式時,行程與資源各自獨立才不會發生應用程式間相互干擾的現象。

CPU時間只有在程式執行的狀態才能取得,但不見得每一個應用程式都能被配置到100%的CPU時間。為了充份使用CPU時間,將暫時閒置的CPU時間用在執行應用程式的其他工作上,便是執行緒的概念。以往應用程式在一個行程中只能處理一件事情,現在利用執行緒可使一個應用程式在同一時期能執行多項工作,以達到程式多工。
多執行緒的程式的語法不難卻很難控制,因為相較於單工的應用程式,其困難度與複雜度皆增加許多,例如執行緒的執行先後順序與資源維護在程式控制上便是一大考驗,控制得宜可提昇程式效能,控制不好反而使執行效能比單工程式還低。

程式中一次可以處理多個執行緒,不過在同一個時間點真正執行的只有一個(這是指單一CPU的系統而言,因為大部分的PC只有一顆CPU)。也就是說,雖然程式可以一次處理多個執行緒,但真正執行的時候一次只有一個執行緒在執行(Running),其他執行緒則在Runnable區塊中等待。執行緒的執行先後順序也會依照執行緒的優先權來判定,其他的則仍然在Runnable區塊中等待下一次優先權的判定。

圖1-說明了執行緒的工作流程:
1. 執行緒(New Thread)經由start()方法進入Runnable pool中準備執行。
2. 在Runnable pool中的每個執行緒都有自身的優先權及時間順序。
3. 再由Scheduler(排程器)進行排程。
4. 經過排列後將選出來的執行緒丟入Running中執行。
5. 此時執行緒會觸發Run()方法,並執行實作內容(寫在Run()內的程式碼)。
6. 執行完畢或程式中呼叫了stop()方法時,執行緒便銷毀,不過其狀態還將會保留,只是銷毀的執行緒將無法再被執行。
7. 若執行緒未執行完成(例如取得的CPU時間已到卻還沒完成工作,或是程式呼叫了特定的方法)將會觸發Blocking event並進入封鎖區(Blocked)。
8. 被封鎖的執行緒解除封鎖(Unblocked)或者是程式中呼叫了resume()方法之後,將再進入Runnable pool中等待下一次執行。
9. 若程式中呼叫了yield()方法(讓與)則是將執行權先給其他執行緒執行,不過其本身仍然還是在Runnable中。

實作Java執行緒
每個應用程式至少要有一個執行緒(又稱之為主執行緒)來執行應用程式,為了讓程式在執行期間能執行多樣工作--也就是所謂的多執行緒應用程式(multi-thread)--必須利用其他方法產生額外的執行緒來執行程式。Java程式語言中提供了二種方法來撰寫執行緒程式:

1. 繼承Java.lang.Thread類別。
2. 實作Runnable介面。

二種方法皆可實作出多執行緒的程式,就看程式開發人員如何抉擇與使用。通常來說,利用Thread類別撰寫比較容易,用Runnable則可以忽略Java中單一繼承的限制(例如:若要在Applet中撰寫Thread程式,因為已經繼承了Applet類別所以必須要用Runnable介面來實作)。

利用Runnable介面來撰寫執行緒,程式較有一致性,當其他程式要用到時,可以有共同介面的標準,也比較符合物件導向(OO)的精神。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
統一塑模語言(Unified Modeling Language,UML)是 Rational 公司整合 Booch、Rumbaugh 與 Jacobson 三種方法而提出的物件導向塑模工具,並且是一種視覺化(Visualizing)、文件化(Documenting)及規格化(Specifing)的軟體塑模語言,包含使用個案圖、類別圖、物件圖、循序圖、合作圖、狀態圖、活動圖、元件圖、部署圖、套件圖、複合結構圖、時序圖與互動概觀圖等十三種模式圖。

其中前九種較常用於商用資訊系統之分析與設計上:

1.使用個案圖
從使用者之觀點描述系統的行為者與系統間之互動行為與關係。從內部觀點來看,使用個案可描述系統做什麼(What);從外部觀點來看,它可描述行為者與系統如何互動(How)。

2.類別圖
主要用以表示系統存在之物件型態(或稱類別)及各物件型態間的靜態資料結構語邏輯關係,也表達類別之屬性、操作與類別間連結之限制等。

3.物件圖
用來描述一系統於某一時間點的靜態資料結構,該圖由一群相關之物件及其連結所組成。物件圖是系統在某個時間點的一個例子,而非系統的定義,可用來表達一個系統之複雜的資料結構,或藉由一時間序列的系統影像(Snapshots)來表達系統的行為。

4.循序圖
主要用以描述系統運作時物件間的互動行為,且著重以時間之先後順序為主軸,以表達物件間的訊息傳遞與處理程序。一個循序圖會有一個與之對應的合作圖,但表達的重點與方式不同。

5.合作圖
主要用以描述系統運作時物件間的互動行為,且該圖著重表達相關物件之連結結構,並能同時展現物件間的訊息傳遞的活動。

6.狀態圖
是以微觀物件為主,細分物件所發生的各項事件,並表達物件生命週期之狀態轉變及活動結果。

7.活動圖
描述一群循序與同步的活動,一個活動可表示一個工作流程步驟或一個運算的執行動作。

8.元件圖
用以說明系統設計過程各類別與物件的配置,以及敘述軟體元件間的組職架構和關係。元件是開發和執行過程之實際物件的類別,將可分解的實際基本單位模組化,這些基本單位包括模組(Module),並擁有特性和明確定義的介面。

9.部署圖
用來說明系統各軟硬體(例如處理器、處理元件)元件的配置、關聯,以及同一處理器內執行處理的時程安排等。

閱讀全文...
就是愛分享


VMware vSphere™ 是業界第一套雲端作業系統,運用強大的虛擬化功能將資料中心轉換成大幅簡化的雲端運算基礎架構,讓 IT 組織能以安全、低風險的方式使用內部和外部資源,提供新世代彈性且可靠的 IT 服務。

VMware vSphere™ 除了提供內部和外部雲端基礎之外,還使用特定聯盟與標準來橋接內部與外部雲端運算基礎架構,讓任何規模的組織都能享受雲端運算的所有優點。

VMware vSphere™ 會從複雜的基礎架構擷取應用程式與資訊,建立內部雲端運算基礎架構,讓 IT 得以傾全力支援及協助實現商業價值。VMware vSphere™ 的優點包括:

  • 縮減成本並且發揮最大的 IT 效能:針對 IT 基礎架構的管理與維護,VMware vSphere™ 免除了不必要的投資、降低成本與複雜度,協助組織以更有效率的方式提供 IT 服務。只要採用 VMware vSphere™,客戶就能節省 50 % 的資本支出,為每個應用程式省下 60 % 以上的作業支出,大幅降低企業應用程式的整體擁有與作業成本。採用 VMware vSphere™ 的組織可以針對跨內部與外部雲端基礎架構的應用程式使用自動化管理和動態資源配置,達到 15:1 以上的整合率。如此一來,便能完全告別以往昂貴、必須連接到特定系統和架構的應用程式與資訊提供模式,順暢地移轉到自行管理、動態最佳化的 IT 環境,以最有效率的方式提供企業服務。
  • 透過服務層級自動化來加強 IT 控制:隨著企業對於 IT 服務的依賴程度日益加深,是否能有效地提供應用程式,就成為企業成長或衰退、成功或失敗的關鍵要素。企業仰賴 IT 來完整控制應用程式提供機制的服務品質,這是不能妥協的。VMware vSphere™ 4 可以自動化提供服務級別協定 (SLA),其中具備的可用性、安全性和延展性能夠將資料中心管理典範從基礎架構轉換為服務遞送。需要導入新的企業服務的應用程式擁有者不必再面對複雜的伺服器、儲存裝置和網路基礎架構,可以專心提升商業價值。這樣的結果就是打造出一個自動化、受到控管的環境,能夠迅速從失敗復原並且立刻回應變更需求,不需要複雜的程序,也不會造成大量作業負擔。
  • 提供 IT 部門多種選擇:VMware vSphere™ 提供經得起未來考驗的 IT 環境以及隨選遞送企業服務的能力,可以讓您配合企業需求的變化,自由選擇適當的業界標準硬體、應用程式架構、作業系統以及內部或外部基礎架構。擁有 VMware vSphere™ 4 的客戶能保留自由選擇的彈性,不再受限於硬體、作業系統、應用程式堆疊和服務供應商。也就是說,客戶可以支援自己現有的應用程式,不必擔心未來的應用程式,同時保有在內部或外部雲端運算基礎架構之中進行部署的彈性。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
今天下課後到台大醫院會議中心
聽「創造宅經濟-接案達人實戰講座」
演講中由104外包網營運長陳啟元先生開場
介紹 2009 上班族兼差接案調查結果
其中以網站規劃建置與部落格行銷方式接案的比率增高
例如2手車商、整型美容等會以部落格方式來行銷

另外也請到無名小站的人氣米滷蛋作者-老吳
分享他之前的工作經驗
為何想從事部落格經營
該如何準備兼差接案
接案重要注意事項與陷阱
如何保障雙方權利義務
正職與兼差的工作時間如何分配

以及一群七年級生的 MeWorks 工作室架站工具
只要2萬元就可以將看到喜歡的版型、配色、功能直接帶走
加上直覺的個人設計平台來完成網站
但我覺得這是將介面作得很漂亮以及個人特色
資料庫部份還是要靠現在所學的 SQL 等 DB 來完成

不過總體來說
聽完之後對於往後接案有更深的認識

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享

Android 是基於 Linux 核心的軟體平台和作業系統,是 Google 在 2007 年 11 月 5 日公布的手機系統平台,早期由 Google 開發,後由開放手機聯盟(Open Handset Alliance)開發。它採用了軟體堆疊(software stack)的架構,主要分為三部分。低層以 Linux 核心工作為基礎,只提供基本功能,其他的應用軟體則由各公司自行開發,以 java 作為編寫程式的一部分。另外,為了推廣此技術,Google 和其它幾十個手機公司建立了開放手機聯盟(Open Handset Alliance)。Android 在未公開之前常被傳聞為 Google 電話或 gPhone。大多傳聞認為 Google 開發的是自己的手機電話產品,而不是一套軟體平台。



對於 Android 的重點整理如下:

  • Android 是Google 的手機作業系統和相關軟體的總稱,和一般在說「Symbian」、「Windows Mobile」時是相同的。
  • 今天的發表有兩個不同,但相關的組成元件:以 Linux 為核心的 Android 行動平台(這間公司是 Google 在 2005 年買下的)和 Open Handset Alliance,一個由 33 間手機製造商、軟體商和電信業者組成的 Android 推廣聯合會。
  • 並沒有所謂的硬體「Gphone」,而 Google 也沒有打算(或至少沒有公開打算)要進入手機硬體市場。到時候真的做手機的,是 HTC、Samsung、LG 這些手機廠,而因為 Android 的程式碼是開放式的,理論上任何人都可以以 Android 為基礎開發新手機。
  • 雖然平台是開放的,但並沒有辦法保證裝到手機上了之後還是開放的。手機商和電信業者有權利決定是否在特定的機種上允許第三方軟體的安裝。
  • Nokia、Apple、Palm 和 Microsoft 不在這個 33 間公司的名單中。Palm 稍早發佈了新聞稿表示將繼續在 Palm OS 平台上支援 Google 的服務。
  • 國際、本土手機廠商紛紛推出Android平台手機,電信業者也看好Android平台可帶來加值服務營收。
  • Android採用開放平台及免付授權金的特性,將打破以微軟、Symbian、Linux等作業系統為主的全球智慧型手機市場生態,進一步帶動行動數據與內容應用的無限商機,遠傳也將成為繼Vodafone、DoCoMo、中國移動之後,國內首家開設網路軟體商店的電信公司。
  • 除了宏達電、英華達、雙A、廣達、華寶、正文、華冠等業者之外,國際與本土晶片大廠、知名硬體廠商也正與經濟部洽詢加入,準備與台灣NB、手機大廠一起合作開發支援可以應用在手機、小筆電、MID等終端產品的本土Android內容應用。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
由於軟硬體技術之精進與價格大幅降低,使得資訊系統的需求量與複雜度大幅提高,因此如何有效地開發系統成為大家所關心之議題。資訊系統開發模式或稱為軟體流程模式是資訊系統開發活動一系列的步驟及執行程序。當系統開發依循系統化、邏輯化的步驟進行時,有利於標準、規範與政策之推行和建立,開發的過程將更有效率、更能確保品質,也更容易管理。專家們提出了不同的資訊系統開發模式,以適用於不同情況的系統開發:

1.瀑布模式
該方法把系統開發的過程分成「幾」個階段,每個階段清楚定義要做哪些工作及交付哪些文件,各階段循序執行且僅循環一次。

2.漸增模式
該方法把需求分成「幾」個部份,然後依漸增開發計畫將每個「部份需求」之開發訂為一個開發週期,每個週期可依序或平行開發。每個週期之階段清楚定義要做哪些工作及交付哪些文件,每個階段循序進行且僅循環一次。

3.雛型模式
該方法先針對使用者需求較清楚的部分或資訊人員較能掌握之部分,依分析、設計與實施等步驟快速開發雛型。開發過程中,強調盡早以雛型作為使用者與資訊人員需求溝通與學習之工具,雙方透過雛型之操作與回饋,以釐清、修改及擴充需求,並藉以修改與擴充雛型。上述步驟反覆進行,直到系統符合雙方約定為止。

4.螺旋模式
主要是基於瀑布模式應用於政府大型軟體專案之經驗,經多次修改而成。該模式之執行由三個步驟形成一週期:(1)找出系統的目標、可行之實施方案與限制;(2)依目標與限制評估方案;(3)由剩下之相關風險決定下一步驟該如何進行。

5.同步模式
該模式之構想是源自於製造業的同步工程,同步工程的目的在於縮短產品開發時間,以提高市場競爭力。對於套裝軟體的開發專案,如何縮短開發時間、加速版本的更新是非常重大的挑戰。

6.統一流程模式
結合螺旋模式的概念,以反覆與漸增的軟體發展原理進行軟體開發,且每一次的反覆後需產出一個可運作的系統版本,並在每一個反覆週期中評估風險,以儘早發現問題。

閱讀全文...
就是愛分享
JAVA 應用程式要呈現圖形化的介面,可使用:
1.AWT(java.awt.*)-Java 早期剛推出時提供的GUI元件(或稱GUI類別庫)。
2.Swing(javax.swing.*)-Java 1.1 推出一組強化的 GUI 元件類別庫。
3.SWT-Standard Widget Toolkit,最初由 IBM 開發用來與 Swing 競爭。著名的整合開發環境 Eclipse就是用 Java 和 SWT 開發的。

以 Swing 為例:
1.設計視窗元件
2.傾聽者(Listener)介面
ActionListener
MouseListener
KeyListener
.
.
.
3.事件(Event)
ActionEvent
MouseEvent
KeyEvent
.
.
.

Java秘史:隱藏在SWT/Swing背後的故事(轉載)
譯注:本文來自_talking_java@yahoogroups.com">straight_talking_java@yahoogroups.com討論組,已經是一年多前的文章。Alan Williamson是Java Developers Journal的編輯,下文來自他在IBM的一個消息來源。SWT和Swing的論爭我見過不少,Netbeans和Eclipse的也同樣多。譯者翻譯此文並不是要激起什麼爭執,也不是支持哪一方(雖然我的確是站在SWT一邊的),更不是要攻擊Amy。我最重要的理由是,這是一篇有趣的文章。裏面有內幕、線人、公司政治、壟斷巨頭、美女、商界風雲……足夠拍一出電影。有趣,這就夠了。不過此文反映了IBM對Swing的看法和SWT的由來,還是有一點營養的。

------

要想弄清楚為什麼一切都被弄得如此混亂,要從幾年前只存在AWT的時候說起。SUN當時已經建立了一套基本的可移植控制項類,這些類映射到不同作業系統上的原生視窗元件(native widget),顯然下一步應該繼續增強這套模型,除了初始的CUA 92元件(文字、按鈕等等),再繼續加上表格、樹、記事本、滑塊等等……當時的AWT還滿是漏洞,遠不能稱為可靠,還需要SUN的coder們去修補。SUN的developer們如Graham和Otto總是習慣於公開把他們的bug歸咎為作業系統的差異,比如“Windows和OS/2的焦點次序不同”或者“在……之間Ctrl-X的行為不一樣”,以及其他蒼白的託辭,好讓批評的火力從SUN太早釋出代碼這個問題的真相上移開。然後Amy Fowler來到了SUN。不是我大男子主義,Amy是個聰明的美女,大多數呆頭呆腦只懂技術的開發人員都要被她捏在手裏。Amy來自一家Smalltalk公司,叫做Objectshare,在那裏她負責搞UI類別庫。

跟Java相比Smalltalk的歷史有些悲慘,曾幾何時有3家龐大的Smalltalk公司——IBM、Parc-Place和Digitalk。在90年代初期3家公司的市場份額大致相等,生活是美好的。Parc-Place採用仿視窗部件(emulated widgets)的設計(即Swing的設計),IBM和Digitalk則採用原生視窗部件(native widgets)。後來IBM壓倒了另外兩家,因此他們打算合併成一家,假設叫做Parc-Place Digitalk。隨後當他們試圖將他們的產品融合到一個叫做Jigsaw的計畫中時爆發了一場大戰,計畫由於政治原因失敗了(開發人員實際上已經能讓它運轉起來),就因為原生和仿造兩派的死戰。

Amy贏得了精神上的勝利,不過在IBM我們贏得了他們所有的生意,因為這兩家公司在一整年裏除了吵架什麼都沒做。當塵埃落定之後PPD(Parc-Place Digitalk當時已改名為Objectshare,跟Windscale改名為Sellafield的原因相同——讓人們淡忘之前發生的災難)的股票價格從60美元掉到了低於1美元1股。他們因為偽報收入被NASDAQ摘牌,從此消失。此時SUN正走上與PPD類似的技術方向,於是PDD的技術人員都把他們的履歷投到了SUN。Amy被雇用了,她承諾通過羽量級方案解決所有視窗元件的問題,因此說服SUN管理層讓她當了GUI開發部門的頭頭。她是拿著“這裏原來的人都搞砸了,我是來解決的”的鑰匙進來的。隨後Amy雇用了所有她過去在Parc-Place的舊朋友,讓他們來開發Swing。

顯然Swing應該做的是僅僅成為一個繪製框架,給那些希望創建地圖軟體或者繪圖軟體的人們使用,無論如何,應該圍繞AWT類庫來建造它,按鈕之類的東西仍然交給AWT來管。SUN的人比如Philip和Mark已經讓AWT能夠處理表格、樹和記事本(notebook,?),所以Swing的方向應該說很明顯了。但那些毀了PDD的人不幹,他們非要把一切都弄成羽量級的。由於SUN管理層的無知,再加上Amy無情的政治手段,造成了我們今天所見的混亂局面。Amy還使SUN相信Swing是作為Mozilla專案的一部分與Netscape聯合開發的,事實上這只是她的宣傳伎倆。

在IBM,我們從第一天起就憎惡Swing。龐大、滿是錯誤,而且難看至極。原先我們的工具如VisualAge for Java都是用Smalltalk(用的是原生視窗元件)寫的,所以當我們將這些工具向Java代碼庫遷移時,我們需要一套視窗元件。IBM這邊的開發人員都是原來搞Smalltalk的那一批人,我們對管理層要求用Swing來構建WebSphere Studio工具都非常不情願。Swing是個可怕的充滿缺陷的怪獸。

在WebSphere Studio最初的預覽中,當與Microsoft Visual Studio作對比演示的時候,我們所有的客戶都討厭它,就因為它的外觀,而不管它的功能有多強。大多數消費者都不會買一輛讓人覺得難看的車,哪怕這車有一台出色的引擎。因此我們開始了一個項目,是把我們的Smalltalk原生視窗元件移植到Java上去。這個項目是加拿大的Object Technology International小組做的。這個項目獲得了成功,被運用在我們發佈的VisualAge Micro Edition產品中,VisualAge Micro Edition後來成為J2ME開發方面一個非常成功的IDE。但是OTI的人發現,Swing在讀取Windows事件方面有極嚴重的缺陷,我們甚至無法進行SWT(S開始是Simple的縮寫,不過後來變成了Standard的縮寫)和Swing間的互操作。他們在讀事件佇列的時候用了一種可能留下記憶體漏洞的方式,所以我們不得不採用我們自己的查詢Windows事件佇列的迴圈,以糾正這個錯誤。

我們試了一次又一次讓SUN修復這個錯誤,但Amy就是聽不進去,所以我們才決定SWT和AWT/Swing不能共存。我們甚至在SWT中定義了自己的Point和Rectangle類——整個工具包對AWT或Swing都沒有任何依賴。我們把這個工具包放到了Eclipse中,這是一個工具平臺,它的總體設計目標就是要戰勝Micrsoft和Visual Studio。Eclipse是開源的,所以任何人都可以在上面構建自己的東西,我們已經有像TogetherSoft和Rational這樣的公司移植到了上面。我們的競爭者是Microsoft,所以我們所有努力和注意力都是從正面針對Microsoft。

不管怎麼說SUN對此非常不滿。他們的Netbeans跟Eclipse做的是相同的事,因此他們向IBM高層抱怨。他們認為SWT是要將你綁到Windows上,這純粹是胡說,因為SWT能通過GTK在Mac/Linux上執行,以及一大堆嵌入式平臺。他們拒絕讓Eclipse獲得Java認證,因為裏面有原生代碼,所以Eclipse產品必須很小心地使用“Java”這個SUN的商標。Eclipse甚至不能把自己稱為一個Java IDE,SUN已經威脅過要採取法律行動來制止IBM在任何時候把Eclipse稱作一個Java IDE。結果之一就是IBM在Eclipse上創建的GUI設計工具,允許你構建Swing/AWT GUI,卻不讓你往裏面拖放SWT視窗控制項。

將SWT從Eclipse中分離出來是完全可能的,只需要把DLL拷貝出來放到路徑中,並使用視窗元件工具包來給你的銀行或者保險或者其他什麼應用程式開發GUI。再次說明,我們無法更進一步,因為SUN把我們的雙手綁上了。雖然作為Eclipse開放源碼協議的一部分,CPL允許我們提供這樣的解決方案,但SUN已經很清楚地表明他們不希望我們這樣做。 對於用戶社區來說,無論IBM和SUN的最終動機是什麼,我發現有一點總是很有趣:喜愛Swing的人總會說“一旦你花上幾年時間去掌握它,你就能正確地使用它”,這基本上是他們在試圖證明和維護他們辛苦得來的用途有限的專門技術;而SWT的擁護者們說的是“哇,這真快,這跟原生的一樣,還可以用XP皮膚……它還又輕又小”。有一句話是我喜歡的,我們的一個用戶說,Swing就像Java決定不通過作業系統來實現原生的IO,而是通過磁頭馬達API自己來讀磁片的磁區。Swing基本上就是這樣的,它拿著個底層的“paint(Graphics)”方法,自己來繪製所有的視窗元件。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
(2009年6月16日香港訊) 
昇陽電腦全面更新Java產品推出Java Store為全球軟件開發人員帶來無窮商機

JavaFX、JavaSE及開放源碼網絡應用平台GrassFish產品系列新版本同時面世,為業界帶來驚天動地轉變

美國昇陽電腦公司 (納斯達克交易代號:JAVA) 全面更新一系列的Java產品,包括JavaFX 1.2平台、JavaSE 6 Update 14,以及開放源碼網絡應用平台GrassFish產品系列。此外,該公司亦正式推出專門為Java及JavaFX應用而設的網上店舖 — Java Store,為全球軟件開發人員締造無窮商機。

時至今天,Java是全球最享負盛名的品牌、最受歡迎的社群,又是最廣為應用的技術平台。目前,全球有超過六百五十萬名Java開發人員,有超過七十億台Java設備,當中包括二十六億台流動設備、四千萬台電視機頂盒及八億台Java桌面電腦。

JavaFX 1.2平台
新推出的JavaFX 1.2平台包括全新的跨平台用戶介面庫、更快的應用啟動速度,並透過實時串流通訊協定 (Real Time Streaming Protocol,簡稱RTSP) 提供串流媒體支援,還包含其他各項針對桌面平台、瀏覽器及流動平台的強化功\能。JavaFX 1.2的嶄新用戶介面庫讓開發人員創造豐富的用戶介面,過程簡便快捷,同時亦可包含專為數據虛擬化及商業智能應用而設的元件。

JavaFX 1.2的用戶可以率先存取專為OpenSolaris及Linux而設的JavaFX運行環境及工具。JavaFX涵蓋\了所有主要消費者及企業操作平台,使其成為豐富互聯網應用 (Rich Internet Application,簡稱RIA) 平台中覆蓋\最廣泛的平台之一。為了協助開發及技術設計人員建設JavaFX應用,JavaFX網站 http://www.javafx.com 提供了最新的範例、教學課程、文章及網上教學短片。

JavaSE Update 14
JavaSE Update 14藉著Garbage-First Collector提供Java Hotspot Client VM功\能。全新的「Garbage-first」或「『G1』 Garbage Collector」是具效率的動態記憶體管理軟件,能夠在應用程式回收系統記憶體時,減少對軟件的干擾。JavaSE Update 14亦提供全新的企業級功\能,如六十四位元插件支援,以及支援Internet Explorer 8瀏覽器和即將推出的Windows 7操作系統。此外,該新軟件繼續增強以消費者用戶為本的新功\能,包括Java插件、改善原機圖像支援,以及強化效能,如配合Java Quick Starter、Java核心及全新Java webstart/插件快取,加快啟動速度。

JavaFX TV
另外,昇陽電腦亦曾於早前舉行的JaveOne會議上,展示在下一代LG電視上運行JavaFX TV的概念產品。JavaFX TV伸延JavaFX平台的理念,將豐富及全面互動的內容,帶到電視及機頂盒上。該軟件建基於同系列的Java技術,以及如藍光 (Blu-ray) 碟的BD-J標準、tru2way及其他全球性電視標準,有助開發人員及內容創造商充分利用現存的技能及工具。JavaFX TV可讓開發人員輕易瞄準電視平台,並創造度身訂製及互動的電視收看體驗。

GlassFish產品系列全面更新
昇陽電腦的GressFish產品系列建基於領先的開放源碼項目,藉著經預先整合及測試,且功\能全面的開放源碼網絡應用平台,從而加快新產品的上市時間,並提升生產力。當中的強化功\能包括:

Sun GlassFish Web Stack是預先整合及測試的LAMP (Linux、Apache、MySQL及PHP) 套件,當中包含已更新至最新版本的領先開放源碼項目軟件,如Apache HTTP、Lighttpd、PHP、Ruby、Python、Squid、Tomcat,以及全球最受歡迎的開放源碼數據庫MySQL。此外,GlassFish Web Stack亦提供以用戶介面為基礎、嶄新且全面的管理工具,以簡化單一及多重實質部署。這些功\能躍進有助確保以LAMP套件部署動態語言的企業,可存取最新的技術版本,同時又得到全面的支援服務及跨平台能力。

Sun GlassFish Web Space Server是昇陽電腦的現代化入門網站方案,當中融合了針對安全網絡存取 (如SSL-VPN) 模組的強化技術,同時整合了昇陽電腦的身份管理工具Sun Identity Manager及Microsoft SharePoint,以及Documentum和Alfresco內容管理系統。藉著嶄新的安全網絡存取功\能,用戶毋須在客戶端安裝軟件,也可建立虛擬專用網絡連結。這有助減少成本,同時簡化入門網站及其他網絡應存取的安全連結設定。

GlassFish產品系列現時透過靈活的用戶定價模式供應,價格由每台伺服器九百九十九美元起。昇陽電腦亦為GlassFish產品系列客戶提供一系列的支援及服務選項,由基本的修補軟件服務到 24 x 7關鍵任務支援服務。

昇陽電腦隆重推出Java Store
昇陽電腦隆重推出為消費者而設的Java Store,使用戶能夠購買各式新穎的Java及JavaFX應用,同時亦讓開發人員及軟件公司能涉獵全球多達十億人次的Java用戶市場,開發當中的龐大商機。Java Store提供一個創新的銷售渠道,能夠輕易接觸潛在客戶,增加收入來源。

Java Store建基於JavaFX技術,可藉著Java運行環境自動傳送到各個最終用戶。全球有超過八億的桌面Java用戶,將能以既容易又安全的方法,透過Java Store尋找及購買嶄新的Java應用及內容。Java Store以易於使用和亮麗的用戶介面,展示包括個人生產力、商業、社交網站及娛樂等軟件。Java Store亦可讓用戶以簡單的拖放方式,在選取合適的軟件後,輕易安裝在桌面上,大大簡化軟件安裝程序。欲知更多有關Java Store的資訊,請瀏覽:http://store.java.com

Java Warehouse為Java Store及合作夥伴提供全面的內容支援
Java倉庫 (Java Warehouse) 負責集合、儲存、管理及分發所有由開發人員製作,並希望放到Java Store的應用。這些應用將跨越消費者日常生活上的所有屏幕—瀏覽器、桌面電腦、流動平台及電視。昇陽電腦負責管理專門針對桌面電腦的Java Store,而流動及電視服務供應商則可運用Java倉庫購買高質素的應用,存放於以現有或特定品牌營運的軟件商店。

美國昇陽電腦公司 (Sun Microsystems Inc) 簡介
美國昇陽電腦公司一直以「網絡就是電腦」(The Network Is The Computer) 的單一目標發展,使其發展出針對全球主要市場的技術。昇陽電腦分享創新及建立社群的哲學,正正站於下一代運算模式 – 「參與時代」(Participation Age) 的最前線。昇陽電腦的業務運作遍布全球一百多個國家。如需美國昇陽電腦公司進一步資料,請瀏覽

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
Java 程式透過 JDBC 驅動程式與資料庫連接,JDBC 是用於執行 SQL 的 Java API,它將資料庫存取的 API 與 SQL 陳述分開,實現資料庫無關的 API 介面,藉由 JDBC 統一的介面,開發人員只要專注於 SQL 陳述,而可以不必理會底層的資料庫驅動程式與相關介面。

使用 JDBC,由廠商實作資料庫的介面,而 SQL 的操作部份由 Java 程式設計人員負責,如果要更換驅動程式,則只要載入新的驅動程式來源即可,Java 程式的部份則無需改變。

簡單的說,JDBC讓Java程式設計人員在撰寫資料庫程式的時候,可以「寫一個程式,適用所有的資料庫」。

下圖JDBC API、資料庫驅動程式與資料庫之間的關係:



JDBC資料庫驅動程式依實作方式可以分為四個類型:

Type 1 -> JDBC -ODBC Bridge
使用者的電腦上必須事先安裝好 ODBC 驅動程式,Type 1 驅動程式利用 Bridge 的方式將 JDBC 的呼叫方式轉換為 ODBC 的呼叫方式,用於 Microsoft Access 之類的資料庫存取:

Application <--> JDBC-ODBC Bridge <--> ODBC Driver <--> Database

Type 2 -> Native Bridge
驅動程式上層包裝 Java 程式以與 Java 應用程式作溝通,將 JDBC 呼叫轉為原生程式碼的呼叫,下層為原生語言(像是 C、C++)來與資料庫作溝通,下層的函式庫是針對特定資料庫設計的,不若 Type 1 可以對 ODBC 架構的資料庫作存取:

Application <--> Native-API Bridge <--> Native API <--> Database

Type 3 -> Middlewave(就算 DB 系統換掉,Java 程式都不變)
透過中介的伺服器或中間件來存取資料庫,客戶端驅動程式以特定於伺服器或中間件的網路協定,與伺服器或中間件進行溝通,而由中介伺服器或中間件來完成所有的資料庫存取動作,然後將結果傳回給驅動程式:

Application <--> JDBC-Net <--> middleware 或 server <--> Database

Type 4 -> Pure Java Driver(最常用的方法)
直接以資料庫的網路協定與資料庫作溝通,而不透過橋接、中介伺服器或中間件來存取資料庫:

Application <--> Native-Protocol <--> Database

Type 3與Type 4可以使用純Java撰寫,跨平台時是較建議採用的驅動程式。

MySQL的JDBC驅動程式屬於Type 4,稱之為Connector/J,目前有支援JDBC 2.0與JDBC 3.0的版本,您可以在以下的網站取得:
http://www.mysql.com/products/connector-j/index.html

在使用 JDBC 之前必須要有 jar 和說明書
以Eclipse 開發工具為例
要先加入外來(3rd party)類別庫(jar)
Project 按右鍵/Properties/Java Build Path/Libraries/Add Extended JARs

以 MySQL 為例,其步驟如下:

1.讀取驅動程式

class.forName("com.mysql.jdbc.Driver");

2.取得與資料庫的連線(Connection)

Connection conn = DriverManager.getConnection("jdbc:
mysql://140.137.202.11/company?user=db98
&password=98db");

3.產生指定物件(statement)

Statement stmt = conn.createStatement();

4.取得查詢結果

ResultSet rs = stmt.executeQuery("select *
from employees");

while(rs.next()){
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
System.out.println(rs.getInt(3));
System.out.println(rs.getInt(4));
}


閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享


前些時候收到某電腦補習班的一封電子郵件
標題是2009 JAVA 認證日
演講內容有包括 Java 認證在職場的優勢
以及一些 Java 的開發工具介紹
而且現場報名可以優惠5,300元(原價6,600元)

不過這種活動不外乎就是要促銷Java這張認證吧了
正巧之前也收到「網管人」電子報:
代考歪風復燃 衝擊證照價值 IT證照 不再可靠?
提到沈寂一段時間的代考集團
最近又有死灰復燃的現象
而且採用部落格聯播的行銷手法
入侵各大IT人員常瀏覽的網站...

所以取得 IT 證照到底有沒有用呢?
正如我以前準備 CCNA 和 MCSE 時的一句話:
「有證照不代表有實力,但沒證照人家就不知道你有實力!」

上個月中台北市政府勞工局有辦就業博覽會
其中有家剛好有徵 Java 程式設計師
其需求條件是熟 Java struts、hibernate、Spring 等1年以上經驗
並沒有提到證照的事情
所以說還是要有實務經驗(最重要是要能夠利用開發工具完成專案)
因此沒有證照的話也無所謂,但如果有的話會更好!!

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
安裝MS SQL Server 2005時,如果選擇安裝全部的「服務」時,在成功安裝之後,以Windows Server 2003為例,選取「開始」功能表的 系統管理工具\服務\SQL Server(MSSQLSERVER),將此服務啟動。

接着,選取 程式集\Microsoft SQL Server 2005\SQL Server Management Studio 啟動MS SQL Server 2005的管理程式(SQL Server Management Studio)。然後選取要連接的伺服器,伺服器類型(T)可分為以下幾種

Database Engine:此一伺服器是MS SQL Server 2005的主要服務,也就是主要的伺服器引擎,要登入此引擎必須先啟動「SQL Server」服務。

Analysis Services:此一伺服主要是負責「線上分析服務」服務(Online Analytical Processing,OLAP),要登入此服務前必須要先啟動「SQL Server Analysis Services」服務。

Reporting Services:此一伺服主要是負責「報表」服務(Reporting Services),要登入此服務前必須要先啟動「SQL Server Reporting Services」服務。

SQL Server Mobile:此一伺服主要是負責「SQL Server行動資料庫」服務(SQL Server Mobile),要登入此服務前必須要先啟動「SQL Server Mobile版本」的服務。

Integration Services:此一伺服主要是負責「整合」服務(Integration Services),要登入此服務前必須要先啟動「SQL Server Integration Services」服務。

在伺服器的對話中,只要填入所要連線遠端伺服器的FQDN(Full Quality Doman Name)、IP Address或是填入localhost連至本機服務。

在驗證(A)的部份可分為兩種,其一為「Windows驗證」,也就是由Windows作業系統來負責帳號的管理和驗證,亦可整合Windows的Active Directory Service,也就是帳號的單一簽入(Single Sign On,SSO)。另一由SQL Server本身所管理的「SQL Server驗證」,此一帳號資料庫與Windows不同,是由SQL Server本身建立與管理。

當連線成功之後會出現Microsoft SQL Seerver Management Studio的管理畫面。在畫面中可以看到已經存在有多個資料庫,我們區分為系統資料庫與其他資料庫。

系統資料庫

master:這個master資料庫是屬於系統層級的資料庫,也就是一個核心資料庫。其中所記錄的包括登入帳號、被管理的端點伺服器(endpoints)、分散式處理中被鏈結的伺服器(linked server)以及SQL Server系統的所有設定項目。除此之外,master資料庫中也記錄了在SQL Server中的所有資料庫資訊,包括這些資料庫的實體檔案位置和SQL Server的初始資訊。

model:這個model資料庫的目的是當成所有新建資料庫所參考的一個樣版資料庫,也就是在新增一個資料庫時,系統會參考此model資料庫來新增出新的資料庫。

msdb:這個msdb資料庫是讓「SQL Server Agent」服務所使用的,讓此代理程式(Agent)紀錄排程警告、排程作業和其他相關作業之用。

rempdb:tempdb是一個全域性的資料庫,可以提供給使用者暫時儲存資料的一個資料庫,或是使用者在經過龐大資料計算時暫存的一個資源,不過要注意的,存於此資料庫內的資料都是短暫的,如果系統重新啟動之後,將會全部被清除掉。

其他資料庫

AdventureWorks:此資料庫是MS SQL Server 2005所提供的一個範例資料庫,提供使用者方便練習使用。

AdventureWorksDW:此資料庫是MS SQL Server 2005所提供的一個倉儲(Sata Warehouse)範例資料庫,提供使用者方便練習使用。

閱讀全文...
就是愛分享
湯老師今天繼續上一堂課的繼承
並適時帶入多型的觀念
沒有解釋太多理論
從實際練習的範例循序漸進地理解他們的用法
再回頭看那些理論就更有清楚的觀念了

以下這篇是從網路上轉載來的
覺得他對於JAVA的封裝、繼承和多型講得很清楚且詳細
當然最重要的是要看的懂 ^^

作者:蔡學鏞
Welcome to O'Reilly Taiwan!

OO

Java 是物件導向的(object-oriented)語言。物件導向近年來成為顯學,全新的程式語言幾乎都具備物件導向的特色,而舊的程式語言也紛紛在新版本中開始支援物件導向的特色。

所謂「物件導向的特色」,指的是物件導向的三個機制,三者缺一不可,此三個機制分別為封裝(encapsulation)、繼承(inheritance)、多型(polymorphism)。我也喜歡把這三個機制稱為三個階段,以突顯出它們之間的次序性:沒有封裝就不可能會有繼承,沒有繼承就不可能會有多型。為了稱呼上的方便,我們常常將物件導向簡稱為 OO。

有一些程式語言常被誤認為是 OO 的語言,但其實不然。例如:Visual Basic 6 以及更早的版本只支援封裝,不支援繼承和多型,所以不可以被視為 OO 的語言。這種只支援封裝 的語言,只能被稱為 object-based 程式語言。但是 Visual Basic 7(也就是 Visual Basic.NET)開始支援繼承和多型,所以可以被視為 OO 的語言,因此威力大增,語言的複雜度也會大增,因為繼承和多型會帶來許多複雜的特質。

封裝

關於封裝,你可以扮演兩種角色:

‧封裝者:封裝出一個類別(class),以供他人使用。
‧類別使用者:使用別人封裝出來的類別

程式員都是在這兩種角色之間不斷地轉換:一會兒封裝出一個類別,一會兒使用別人封裝好的類別。 當一個類別使用者顯然比當一個封裝者簡單許多,只要透過 new 這個關鍵字來產生類別的 instance,即可使用。如果欲使用的是 class method/field,甚至連 new 都可以省了。既然當類別使用者比當封裝者來得簡單,我們自然是盡量使用既有的類別, 這樣就可以達到很高的再用性(reusability)。Java 平台提供了數千個已經封裝好的類別,我們可以直接拿來使用, 這可以為我們省下許多時間。這些類別所形成的集合,就稱為 API。

查詢 Java API

J2SE 平台所具備的 API,就稱為 Core API(核心 API)。你可以在你的 Java 2 SDK 路徑下找到 docs/api/index.html,這就是 API 文件,從這裡,你就可以找到每個類別的用法(例如我們在 Hello 程式中使用的 System,就是一個類別)。畫面如下所示:



我很喜歡把程式設計比喻成設計一個主機板。主機板的設計者不用一切從頭來,因為他們有許多 IC chip(晶片)可以使用(其中有一個 chip 為 CPU)。從市面上的各種 chip 中(SIS、Intel、VIA…), 挑選出各種適合的 chip,再把這些 chip 全都放到主機板上適當的位置固定好,再把這些 chip 的接腳之間互相 連接起來就可以了。這麼一來,設計主機板的工作包含:

1.挑選 chip
2.應用這些 chip 來進行電路佈局(circuit layout)

寫程式很類似設計主機板,差異在於主機板是硬件,程式是軟件。寫 Java 程式不用一切從頭來,因為我們有許多類別可以使用。從 Java Core API 的類別中, 挑選出各種你需要的類別,把這些類別用在你的程式中,程式中利用 Java 的關鍵字(keyword) 和算符(operator)將這些類別銜接起來就可以了。這麼一來,寫程式的工作包含:

1.挑選適當的類別
2.應用這些類別來完成程式

繼承

既有的 Java API 已經可以滿足我們大多數時候的需求,但還是有些時候,我們希望有一個類別能提供特定的功能,但是 Java API 不提供這樣的類別。我們通常會找協力廠商(thirty party)購買這樣的類別。有許多軟體公司專門提供類別庫(class library),收納了許多好用的類別,例如繪製統計圖表(chart)的類別、產生報表(report)的類別、複雜科學計算的類別……等。你可以在 WWW 上找到許多這樣的產品。

如果沒有任何廠商提供完全符合你需求的類別,或者你根本不想增加成本購買 third party 的類別(這些類別通常都不單獨出售, 而是許多類別被包在一起成為類別庫,且售價不便宜),那麼你只好自己寫一個這樣的類別。

假設我們現在就有這樣的需求,需要設計一個類別。在下面的程式碼中,我們封裝出一個名為 ClassB 類別:


// code-1
class ClassB
{
int doThis() {
// ...
// ...很多、很多程式碼...
// ...
}
int doThat() {
// ...
// ...很多、很多程式碼...
// ...
}
}

這時候,你發現有一個叫做 ClassA 的類別,也提供了 doThis() 和 doThat(),其中 ClassA 的 doThis() 完全就是 ClassB 的 doThis() 所需要的功能,但是 ClassA 的 doThat() 卻和 ClassB 的 doThat() 所需要的功能有一些小差異,你希望 ClassB 的 doThat() 傳出值一定是大於等於零的整數。 你可以把 ClassA 拿來運用在 ClassB 中,將 code-1程式改寫如下:

// code-2
class ClassB {
ClassA a = new ClassA();
int doThis() {
return a.doThis();
}
int doThat() {
return Math.abs(a.doThat());
// Math.abs() 是取絕對值(正數)的意思

}
}

code-2 的版本因為運用 ClassA,所以整個程式比 code-1 更精簡。我們稱 ClassA 被嵌入(embed)到 ClassB 中,ClassB 把 method 遞送給 ClassA 的 method 來處理。

如果 ClassA 除了具有 doThis() 和 doThat() 之外,還具有100 個 method, 分別叫做 method1() method2()、……、method100(),而且這100 個 method 每個都是 ClassB 想要具備的功能,那麼我們的 code-2 程式可以改寫如下:

// code-3
class ClassB {
ClassA a = new ClassA();
int doThis() {
return a.doThis();
}
int doThat() {
return Math.abs(a.doThat());
}
int method1() {
return a.method1();
}
int method2() {
return a.method2();
}
// ...一直重複類似的程式碼

int method100() {
return a.method100();
}
}

這根本就是一場惡夢, 因為我們不斷地把 ClassB 的 methodX() 轉給 ClassA 的 methodX()。這個程式糟透了, 我們應該把它改成下面的版本:

// code-4
class ClassB extends ClassA{
int doThat() {
return Math.abs(a.doThat());
}
}

code-4 的版本用到繼承(inheritance)的技巧。繼承也是封裝的一種,所以語法和封裝很類似,唯一的差異是多了 extends 以及後面的 ClassA。extends 是 Java 的關鍵字,後面接著一個類別的名稱,用來表示繼承的來源。以此例來說,我們稱 ClassA 是 ClassB 的父類別(parent class),或超類別(super class),或基底類別(base class);我們稱 ClassB 是 ClassA 的子類別(child class),或次類別(sub-class),或衍生類別(derived class)。

code-4 的寫法之所以比 code-3 簡潔,是因為 code-4 使用繼承。在 code-4 中,雖然 ClassB 本身只定義了一個 method,也就是 doThat() ,但是 ClassA 中的 method 也會被自動繼承過來。 換句話說,我們可以拿 ClassB 的對象來呼叫 ClassA 中定義的 method,如下例所示:

ClassB b = new ClassB();
b.doThis();
b.method1();

這就是繼承的目的「之一」:達到程式碼的再用性(reusability)。ClassB 輕易地運用了 ClassA 的程式碼。 (繼承的另一個目的是:為多型做準備。)我主張繼承應該被視為一種特殊的封裝,因為繼承只是一種「過程」,繼承的結果仍是封裝,一個全新的封裝。

在繼承的時候,如果子類別定義了和父類別完全相同名稱(包括參數、傳出值、修飾字)的 method,我們就說子類別的此 method 推翻(override)了父類別的同名 method。從 code-4 的例子來看,ClassB 的 doThat() 推翻了 ClassA 的 doThat()。

請注意,在繼承的時候,不只 instance method 會被繼承,連 instance field、class field、class method 都會被繼承。

如果你不希望你所設計出來的類別被其他類別繼承,那麼你可以利用 final 來修飾此 class,如下所示:

// code-5
final class MyClass {
// ...
}

如果你不希望你所設計出來的某個 method 被子類別推翻(override),那麼你可以利用 final 來修飾此 method,如下所示:

// code-6
class MyClass {
final int myMethod() {
// ...
}
}

java.lang.Object

在 Java 中,每個類別都會有父類別。如果你沒有用 extends 關鍵字來指定父類別,那麼它的父類別就是 java.lang.Object, 例如:code-6 的程式其實等同於下面的程式:

// code-7
class MyClass extends java.lang.Object {
final int myMethod() {
// ...
}
}

java.lang.Object 是一個很特殊的類別,因為:

‧它是唯一沒有父類別的類別
‧Java 所有的類別都直接或間接地繼承了 java.lang.Object

請牢記下面三點:

‧每個類別(java.lang.Object 除外)一定有一個父類別
‧一個父類別可以有許多子類別
‧所有的類別都源自於 java.lang.Object

繼承的使用時機

認清繼承的使用時機很重要。如果存在某個類別(比方說 ClassA), 其功能和我們的需求「差不多」,但有一些不同之處,那麼我們就「可以」 使用繼承的方式來設計一個類別(比方說 ClassB),以將 Class 的功能抄襲過來, 並進行「擴充」或「修改」。

「可以」使用繼承,不代表「一定要」使用繼承。 繼承也不見得全然都只有好處,沒有任何缺點。有些時候,兩個 class 之間的關係,用 association 的關係比用繼承的關係好。也就是說, 有些時候我們不用 code-4 的版本,反而使用 code-2 的版本,因為這樣做有下列的好處:

‧在 code-2 中,a 可以被其他類使用;但在 code-4 中,則無法這麼做。
‧在 code-2 中,a 可以隨時被設定成別的物件;但在 code-4 中,則無法改變。
‧ClassB 可以不提供部份的 method,例如:code-2 就不提供 method1()~method100();但在 ode-4 中, ClassB 無法決定哪些 method/field 要繼承或不繼承。

特別注意:繼承一定需要「擴充」或「修改」,如果不擴充也不修改,這樣的繼承就毫無意義可言。所謂的擴充,指的是:子類別新定義父類別沒有的 method,以擴充功能;所謂的修改,指的是子類別提供 method 推翻父類別的同名 method。

多型

關於多型(Polymorphism),一言以蔽之:「當某變數的實際型態(actual type)和形式型態(formal type)不一致時,呼叫此變數的 method,一定會呼叫到「正確」的版本, 也就是實際型態的版本。

從這句話,我們可以思索下面的問題:

為什麼實際型態和形式型態會不一致?
多型帶來時麼好處?
如果你能夠瞭解這兩點,你就能徹底瞭解多型。

學會多型之後,你不可以對多型有「錯誤的期待」。千萬要小心下面這兩點:

1.多型的機制只用在 method 上,不用在 field 上。
2.多型的機制只用在 instance method上,不用在 class method 上。

在本文章中,我也會對上述兩點提出明確的解釋。

為什麼實際型態和形式型態會不一致?

請看下面的例子:

int a = 3;
long b = a;

因為 a 和 b 是基本型態(primitive type),而非 reference 型態,所以 a 的值會被複製一份到 b。在複製的過程中,a 的值原本是 32 bit 的 int,會被自動地擴充成(widen)64 bit 的 long,再指定(assign)給 b。正因為有擴充和複製,所以對於 b 來說,其實際型態(值的型態)和形式型態(宣告時的型態)都一樣是 long。

所有屬於基本型態的變數都類似如此,在設定其值的時候,會經歷擴充(或縮減)以及複製,製造出實際型態和形式型態一致的值。

但是 reference 型態可就不一樣了。請看下面的例子:

class ClassA {
void method1() {
System.out.println("method1() in ClassA");
}
void method2() {
System.out.println("method2() in ClassA");
}
}
class ClassB extends ClassA {
void method1() {
System.out.println("method1() in ClassB");
}
void method3() {
System.out.println("method3() in ClassB");
}
}
public class ClassC {
public static void main(String[] args) {
ClassA a = new ClassB();
a.method1(); // method1() in ClassB
a.method2(); // method2() in ClassA
a.method3(); // compile-time error
}
}

對於 reference 型態來說,使用指定算符(assignment operator)時, 只有記憶體位址會被複製,對象本身不會被複製,所以實際值並不會受到變寬或變窄的破壞。

我們在 ClassC 中,產生一個 ClassB 的對象,並將它設定給 a。但是 a 被宣告成 ClassA 型態,所以 a 的實際型態(ClassB)和形式型態(ClassA)並不一致。 在這樣的情況下,呼叫 a 的 method1() 會 執行到哪一個版本?實際型態的版本或形式型態的版本?正確答案是實際型態的版本。這就是多型!

讓我們再看一次文章一開始對多型所下的定義:「當某變數的實際型態和形式型態不一致時,呼叫此變數的 method,一定會呼叫到正確的版本,也就是實際型態的版本」。現在,你是不是比較能體會了。

如果我們嘗試著呼叫 a 的 method2() 時,結果會呼叫到 ClassA 的 method2(),這是因為 ClassB 沒有定義 method2(),其 method2() 乃是繼承 ClassA 而來的。

如果我們嘗試著呼叫 a 的 method3() 時,則無法通過編譯。 這是因為 Java 是強制型態檢查的語言(strongly-typed language),這意味著 編譯時會檢查形式型態是否有提供該 method。a 的形式型態是 ClassA,不提供 method3(),雖然 a 的實際型態有提供 method3(),但編譯只管形式型態, 可不管實際型態,所以形式型態也稱為編譯期型態(compile-time type), 實際型態也稱為執行期型態(runtime type)。

或許你會覺得「ClassA a = new ClassB();」的寫法很怪,為什麼要把 ClassB 的物件宣告成 ClassA 型態?的確,通常我們不會這麼做,但形式型態和實際型態互異的情況卻往往是在不知不覺中發生,請看下面的例子:

class ClassD {
static void method4(ClassA a) {
// a 的形式型態是 ClassA,實際型態則不一定是 ClassA
a.method1(); //呼叫實際型態的 method1();
}
}
public classE {
public static void main(String[] args) {
ClassB b = new ClassB();
ClassD.method4(b);
// ClassD.method4() 需要一個 ClassA的參數,
// 因為 ClassB 繼承自 ClassA,
// 所以 ClassB 相容於 ClassA,
// 也因此我們可以傳入 ClassB 的對象當參數
}
}

因為我們傳進 ClassD.method4() 的參數其實際型態是 ClassB,但是在 method4() 的定義中將它宣告為 ClassA,造成了形式型態和實際型態不一致。這類似於「ClassA a = new ClassB();」的寫法,只不過一切都是在暗中進行,從程式上來看並不明顯。大部分的多型,都是導因於此。

從上面的例子來加以歸納,我們可以知道多型的發生必須是:

有直接或間接繼承關係的兩個類別,子類別的 method 將父類別的 method 予以override。
實際型態為子類別的物件,被當成父類別來使用,呼叫其 overrided method。

多型帶來什麼好處?

多型是建立在繼承的基礎之上的,沒有繼承,就不會有多型。繼承的目的有兩種:

‧繼承程式碼:達到程式碼再用性(reuse)
‧繼承介面(interface)。達到介面再用性(reuse),為多型預作準備

更明白地說:多型是仰賴介面的繼承。至於程式碼的繼承,完全無涉於多型。

讓我打個比喻:電腦主機板(Main Board)上面能夠插上 Intel 的 CPU,也能插上 AMD 的 CPU,一切運作順利,那是因為 Intel 的 CPU 和 AMD 的 CPU 都遵守該主機板要求的介面(interface)。 這麼一來,任何廠商只要能符合此介面,就能和該主機板搭配使用,主機板不需要做出任何修改。

同樣地,ClassD 的 method4() 需要 ClassA 的介面,不管是 ClassA 的 instance 和 ClassB 的 instance 都能符合這樣的要求(ClassB 繼承了 ClassA 的介面), 所以都能當作 method4() 的參數,和 ClassD.method4() 合作無間。任何對象只要能符合 ClassA 的介面,就能和 ClassD 合作無間,ClassD 的程式碼不需要進行任何修改。 多型的機制,讓程式具備了動態的擴充性。

Reflection 也可以讓程式具備動態的擴充性,甚至比多型更動態,所以有些場合可以使用 reflection 來取代多型,但 reflection 通常效率較差,而且有的語言不提供 Reflection 機制。 Java 早在 1.1 以後就開始支援 Reflection API 了 ,而 Java1.4 版的 Reflection API 速度也大幅地提升了。 如果你對於 Java Reflection API 感興趣的話,可以參考 java.lang.reflect.*。

多型的機制只用在 method 上,不用在 field 上

簡單來說,只要符合下兩點,就可能會有多型:

1.有直接或間接繼承關係的兩個類別,子類別的 method 將父類別的 method 予以 override。
2.實際型態為子類別的對象,被當成父類別來使用,呼叫其 overrided method。

請注意:上述兩點指的是 method,而非 field。對於 field 來說,根本沒有多型這一回事。請看下面的例子:

class ClassA {
String field1 = 'A1';
String field2 = 'A2';
}

class ClassB extends ClassA {
String field1 = 'B1';
String field3 = 'B3';
}

public class ClassC {
public static void main(String[] args) {
ClassA a = new ClassB();
System.out.println(a.field1()); // "A1"
System.out.println(a.field2()); // "A2"
System.out.println(a.field3()); // compile-time error
}
}

對於 field 來說,形式型態決定了一切,完全和實際型態無關。 雖然 a 的實際型態是 ClassB,但是形式型態是 ClassA,所以 a.field1 得到的結果是”A1”,a.field2 得到的結果是”A2”。

如果子類別提供了和父類別一樣名稱與參數的 method, 我們說子類別的 method 把父類別的同名 method 給 override 了。如果子類 別提供了和父類別一樣名稱的 field,我們說子類別的 field 把父類別的同名 field 給 shadow 了。

針對 method 和 field 的作法居然如此大的不同,這絕對不是 Java 語言的設計者故意想折磨你。事實上,這樣的設計有其巧妙之處。在 Java 的思維中:介面是對象之間溝通的管道,而介面只包含了類別的名稱和 method 的集合。至於 field,則是不屬於介面的一部份。既然如此,而多型又是完全是 依靠介面,所以當然多型會把 field 排除在外。

多型的機制只用在 instance method 上,不用在 class method 上

被 static 修飾的 field/method 是屬於 class field/method。繼承的時候,依然可以繼承這些 static field/method。封裝和繼承的效果可以同時用在 class 或 instance 上。換句話說:封裝不只封裝 instance field/method,也可以封裝 class field/method;繼承不只繼承父類的 instance field/method,也繼承父類別的 class field/method。

但是,切記,多型只能對 instance 產生作用,不能對 class 產生作用,這可以從我對多型的定義看出端倪,定義如下:

當某變數的實際型態和形式型態不一致時,呼叫(invoke)此變數的 method,一定會呼叫到正確的版本,也就是實際型態的版本。

class 是形式型態,沒有實際型態,根本就和多型無關。只有 instance 才可能會造成形式型態和實際型態不一致。

請看下面的例子:

class ClassA {
static void method1() {
System.out.println("method1() in ClassA");
}
static void method2() {
System.out.println("method2() in ClassA");
}
}
class ClassB extends ClassA {
static void method1() {
System.out.println("method1() in ClassB");
}
static void method3() {
System.out.println("method3() in ClassB");
}
}
public class ClassC {
public static void main(String[] args) {
ClassA a = new ClassB();
a.method1(); // method1() in ClassA
a.method2(); // method2() in ClassA
a.method3(); // compile-time error
}
}

因為這裡的 method1()、method2()、method3() 都是 static,所以和多型無關,編譯器直接使用靜態連結(static link),而不會留到執行期才動態地決定真正該呼叫的 method 為何。因為編譯器在編譯期就做必須決定 method, 所以編譯器完全依賴形式型態,這麼一來「a.method1()」等於是「ClassA.method1()」, 「a.method2()」等於是「ClassA.method2()」。

多型的英文是 polymorphism,poly 是「多」的意思,morph 是「型」的意思,這個「型」可做「型態」解。 也就是說,只有當一件事物有多種型態時,才會有的一種機制。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
MS SQL Server 2005是由微軟公司所開發的資料庫管理系統,此套資料庫管理系統主要是基於網路協定之上的資料庫管理系統,所以使用者或是管理者可以透過不同的網路協定,例如網際網路的TCP/IP之通訊協定與MS SQL Server 2005進行連線使用或管理。

由微軟公司所開發的MS SQL Server 2005資料平台,其中所包括的基本元件如下:



Relational Database(關聯式資料庫)-是儲存基本資料的所在,也就是未經計算或處理過的原始資料(raw data)。

Replication Services(複寫服務)-使用在分散式系統或是行動資料處理,可將企業內資料庫進行同步或非同步複寫至其他資料庫,而被複寫的資料庫稱之為複製品(Replica),亦可支援異質資料庫系統,例如甲骨文之資料庫管理系統(Oracle Databases)。

Notification Services(通知服務)-可經過個人化及定時地對不同連線中或行動裝置進行資料更新通知。

Integration Services(整合服務)-提供對資料倉儲(data warehousing)和企業資料整合(data integration)之資料萃取(Extraction)、轉換(Transformation)以及載入(Loading)能力,合稱為ETL。

Analysis Services(分析服務)-使用多維度資料庫,對大型且複雜的資料集進行「線上分析處理」(Online Analytical Processing,OLAP)功能之服務。

Reporting Services(報表服務)-提出使用者建立、管理和遞交傳統的紙本導向之報表或以網頁為基礎的報表功能。

Management Tools(管理工具)-一個整合型的管理工具,可進行資料庫的基本和進階管理與效能的調校等等,也就是指「Microsoft SQL Server Management Studio」。

閱讀全文...
就是愛分享
SQL合併查詢(Join)是使用在多個資料表的查詢,其主要的目的是將關聯式資料庫正規化分析分割的資料表,還原成使用者所需的資訊。因為正規化的目的是避免異動(新增、刪除及修改)操作中易發生異常現象,也可以避免不必要的人工資料操作和不小心將重要資料刪除,但關聯被分割之後所產生的問題在於查詢上的不便性會發生,所以才會有合併理論。

在合併理論中,首先介紹「卡氏積」(Cartesian Product),也稱之為「交叉乘積」(Cross Product)或稱為「交叉合併」(Cross Join),卡氏積是將兩個關聯做相乘,所得結果是來自所有可能性的對應(Mapping)關係所呈現出來,再將各自的屬性全部列出。

但產生如此的卡氏積之後,或許會發現此新的關聯中的資料,甚多不合情理的值組,所以再加上兩關聯之間的「條件限制」或稱為「對應」(Mapping)關係,稱為內部合併(Inner Join)又稱為條件式合併(Condition Join)。

不過在內部合併的過程中,有些值組會因為彼此無法互相對應而消失不見,如果使用者認為不合理,就可以利用外部合併(Outer Join),而合併之後對應不到的關聯值組,會在屬性填入空值(Null Value)。主要可分為三種:
左邊外部合併(Left Outer Join)-左邊的資料表擁有優先權,左邊所有的資料都會被包含,而右邊只有符合的資料才會被包含。
右邊外部合併(Right Outer Join)-右邊的資料表擁有優先權,右邊所有的資料都會被包含,而左邊只有符合的資料才會被包含。
完全外部合併(Full Outer Join)-左邊外部合併與右邊外部合併的聯集。



(a)所表示的是「內部合併」,兩個關聯之間,具有某些(一個或多個)屬性值彼此「對應」所合併出來的結果。
(b)所表示的是在左邊關聯中的某些(一個或多個)屬性值,無法對應到右邊相對應的屬性值的值組,所合併出的結果在右邊的屬性值將會是空值(Null Value)。
(c)所表示的是在右邊關聯中的某些(一個或多個)屬性值,無法對應到左邊相對應的屬性值的值組,所合併出的結果在左邊的屬性值將會是空值(Null Value)。
(d)所表示的是在左、右兩邊關聯的某些(一個或多個)相對應的屬性值彼此無法「對應」的部份,但是在合併後的左、右兩邊屬性皆會有值存在。
(a)+(b)所表示的即是「左邊外部合併」。
(a)+(c)所表示的即是「右邊外部合併」。
(a)+(b)+(c)所表示的即是「完全外部合併」。
(a)+(d)所表示的是「卡氏積」或稱「交叉乘積」或「交叉合併」。

閱讀全文...
就是愛分享
「物件導向程式設計」簡單地說,就是一種抽象且擬人化的程式設計,與以往我們所熟悉的「程序式程式設計」大不相同,因此程式設計師所設計的不再是一個個函式,而是一個個將程式抽象化且各自獨立的物件。物件內用來描述資料的稱作屬性(Attribute),用來描述物件內部的行為稱作方法(Method),因此我們可以說,物件是一群相關屬性(資料)與方法(函式)的組合。

物件導向程式(OOP)中,物件(Object)就是某個類別(Class)的實體(Instance)。在Java 語言中,產生一個物件實體可用new這個關鍵字,而所有的類別可透過繼承的關係相互呼叫、引用與傳遞訊息,形成一種彼此繫結且有層次的結構。

Java物件導向程式語言的2個精神與3個特徵如下:

2個精神
1.抽象化(Abstraction):物件抽象化幫助我們瞭解並實際掌握物件的內容。
2.繼承(Inheritance):抽象化是指物件被良好地定義及描述,繼承則是賦予程式能重複使用物件以增加其延展性。

3個特徵
1.繼承(Inheritance):承接所有父類別(Super-class)所有屬性方法,並可以加以改造的特性。
2.封裝(Encapsulation):將資料(屬性)與操作此資料的函數(方法)包在一起的特性。
3.多型(Polymorphism):呼叫相同的函式,卻會出現不同行為的現象。
‧過載(overloading):將一個函數名稱,賦予一種以上的函數實體,以便依據當時情形,擇一執行。
‧覆寫(Overriding):將繼承下來的方法,以同名函數蓋掉的特色。

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
今年台北國際電腦展號稱亞洲最大、全球第二的電腦展
展場包括世貿一、三館和國際會議中心
以及南港世貿一、四樓
兩個展場之間都有免費接駁專車接送
全票200元



進場之後得知馬總統會蒞臨參觀
就這麼剛好被我拍到...



國際電腦展是只接受國內外買主的訂單、不能有販售的行為
不過最後一天有少數幾家在報表紙上手寫"ON SALE"的字樣
通常我也不會在這裡買任何東西
我是來見見場面、增長知識滴...

我認為今年熱門的焦點包括:

WiMAX
WiMAX是一種寬頻無線網路接取技術,在某種程度上還能替代有線網路(Cable、ADSL),讓偏遠地區的網路連接更為容易。台北市政府還表示北市無線寬頻網路布線密度,已是全球之冠;即日起至明年5月31日止,民眾搭捷運木柵線、內湖線都可以免費無線上網。

目前WiMAX(IEEE 802.16)最大的對手就是Wi-Fi( IEEE 802.11),WiMAX在傳輸距離、頻寬、安全、QoS上都優於Wi-Fi。但將來發展如何還是未知數,因為台灣政府砸大錢扶殖WiMAX產業,大陸政府則是全力投入TD-SCDMA,從國際間的發展趨勢來看,大陸以其龐大的內需市場,TD在未來市場上似乎比WiMAX更有優勢。

微軟推出的Windows 7作業系統
微軟最新發表的Windows 7作業系統預計10月22日正式上市,整個介面與Windows Vista非常相像,不過我覺得最特別的是支援觸控式螢幕。至於其他新功能,就等我將已經拿到手的Windows 7 Release Candidate安裝之後,再來個心得報告...



多點式觸控螢幕
自2007年1月蘋果(Apple)推出iPhone以來,讓人們認識到觸控螢幕的魅力,以「手指操作」取代「按鍵操作」的人性化介面深受消費者青睞。在iPhone熱賣下,觸控螢幕應用更從智慧型手機延展至數位相機、衛星導航系統、MP3、股票機等消費性電子產品領域。

觸控螢幕並不是新產品,事實上,觸控螢幕技術早已為工業領域所廣泛應用,終端應用產品包括工業電腦、醫療儀器、銷售管理系統(Point On Sale;POS)及ATM,甚至是博弈機、樂彩機、售票系統也早已採用觸控螢幕技術。

且有別於以往,觸控螢幕朝電腦應用滲透,也意味著將由原本僅侷限於2.4吋至10吋中小尺寸為主流產品,拓展至17吋以上大尺寸為主攻市場,加上觸控技術也由「單點觸控」進化至「多點觸控」。

由於Windows 7和iMAC OS X都有支援多點觸控螢幕,利用手指在觸控式螢幕可以對畫面上的物件作互動,例如小狗會隨手指擺動、水面會隨手指產生波紋等等。因此多點式觸控已成為未來電腦發展趨勢,業界認為年底還只是試溫期,必須等到明年才會大幅成長,所以發現今年多點觸控螢幕廠商有增加的趨勢。

另外像是3D數位電子看板也有很多家廠商在現場展示。



USB 3.0
USB 3.0數據傳輸速率每秒達5GB,比起USB 2.0的每秒達480MB快了10倍之多,不過在會場我只看到一家有擺出來成品,所以還沒有到普及的階段。

-----

看完之後,腳好酸、肚子又餓
於是就跑去101大樓地下一樓美食街吃肯德基的「雙響卡啦巨無霸」
今天每一家分店前50名只要說「雙響卡啦巨無霸加量不加價」就送給你吃
當然都已經下午3點多了,怎麼可能有這麼好康的事情呢?



什麼?你問我美圖呢?
喔...當然這是壓軸啊!
來看看我拍的麻豆們...


阿里巴巴小姐在現場發環保袋,看到我要拍她,馬上停住給我甜美的微笑,我給她4顆半 ^^


十詮小姐旁邊有個拿小白的攝影大哥,所以都沒有正面看過我,給她們4顆


創見小姐是個網路上很有人氣的麻豆兼主持人,旁邊總是有一~大~堆~粉絲,給她4顆半


Rhino小姐的攤位是在很不起眼的角落,不過她身材好、腿又漂亮,很難不發現的,我給她4顆


Tyan小姐青春有活力,我比較喜歡最右邊那一位,我給她3顆半


Microsoft小姐身材好、笑容甜美,只可惜她的黃牙扣了點分數,我給她4顆

當然我拍的還不止這些麻豆
但是我的N82手機畢竟不是DSLR
雖然手機有一大堆如白平衡、清晰度等等
但我都懶的去設定,所以有些拍的不好就沒拿出來了
因為我來看展覽的真正目的是來增長電腦的新知識喔... ㄒㄒ

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享


也就是說在檔案系統是以檔案(File)為最基本的邏輯單位,相關的資料將被彙集在一個檔案中,以關聯式資料模型則稱之為關聯(Relation),關聯式資料庫管理系統(RDMS)則是以資料表(Table)稱之,物件導向則以類別(Class)來當成基本邏輯單位。

以關聯式資料庫管理系統(Relational Database Managements System,RDBMS)進行探討和說明。在每一個資料庫內,會因為所包含的物件類型或物件數量過多,所以會以不同的「綱要」(Schema)來做為分隔,不同的綱要會有不同的綱要名稱,方便不同系統或不同用途所使用,其中包括資料表(Tables)、檢視表(Views)、預存程序(Stored Procedures)、函數(Functions)、觸發器(Triggers)、定義域(Domains)、限制(Constraints)...等等的不同物件類型。

結構化查詢語言是一種關聯查詢語言,一般在資料庫管理系統的實作上,可分為三種:
1.資料定義語言(DDL,Data Definition Language ) - 定義資料庫物件使用的語法
Create:建立資料庫的物件。
Alter:變更資料庫的物件。
Drop:刪除資料庫的物件。

2.資料操作語言(DCL,Data Control Language ) - 控制資料庫物件使用狀況的語法
Grant:賦予使用者使用物件的權限。
Revoke:取消使用者使用物件的權限。
Commit:Transaction 正常作業完成。
Rollback:Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態。

3.資料控制語言(DML,Data Manipulation Language ) - 維護資料庫資料內容的語法
Insert:新增資料到 Table 中。
Update:更改 Table 中的資料。
Delete:刪除 Table 中的資料。
Select:選取資料庫中的資料。

閱讀全文...
就是愛分享
Eclipse是一套開放原始碼的整合開發環境(IDE)
最初的設計適用於Java程式開發
不過因為提供了強大的外掛機制
所以只要加裝相關外掛
亦可使用於開發C/C++、PHP、Python...等程式
目前Eclipse可在Windows、Linux、Solaris、MacOS X等多種作業系統上執行
不過系統必須安裝JRE或JDK

底下來介紹將原來的英文介面轉換成中文的方法

如果不想開網頁,可以跳過前面幾個步驟,複製後方粗體字即可
首先到 Eclipse 網頁下載點,點 Eclipse Project download page 或 Other downloads 網址如下
http://download.eclipse.org/eclipse/downloads/
接下來點選 Babel project 網址如下
http://babel.eclipse.org/babel/
接下來點選 Download a language pack 網址如下
http://www.eclipse.org/babel/downloads.php
看到畫面上的
http://download.eclipse.org/technology/babel/update-site/ganymede
複製起來,之後打開 Eclipse 3.4
在工具列點選 Help 選 Software Updates
接下來選 Availabe Software 標籤,點右邊的 Add Site
貼上剛剛複製的網址點OK

點開剛剛新增的 Site
(此時要看機器的效能,學校的電腦花了差不多40分鐘才跑完)
就會看到 Eclipse Language Pack for Traditional Chinese 打勾,
點右邊的 Install
接下來就就只需要下一步之類
就可以安裝完成
重開後就有一個中文的環境

閱讀全文...
標籤: 0 意見 | | edit post
就是愛分享
為了因應更複雜的應用
或是為了提昇效率
我們也能將中間的應用程式伺服器工作再分散到多個伺服器
建立多層式的資料庫應用架構。
例如讓Web伺服器執行單純的網頁伺服器工作
而再加入一台專用的應用程式伺服器
來做購物車、訂單的處理、或是其他功能的程式



Client:
Dream Weaver ┐
Flash │Web
PhotoShop │Design
Photo Impact ┘
Java Script ┐
Ajax ┘Web Client 程設

Web Server:
1.Sun:TomCat Apachet JSP
2.MS:IIS 5.0/6.0 + ASP.NET
3.Open Resource:Apache + Php

DB Server:
1.SQL Server(T-SQL)
2.Oracle(PL/SQL)
3.IBM DB/2
4.MySQL

Application Server:
1.Java Solution(J2EE)
2..NET Solution(C++)

免費的Solution:
Linux OS + Apache Web Server + Php + MySQL + OS Commerce EC AP

閱讀全文...
就是愛分享
為期五個月的網際網路資料庫設計班
在上了一個月的課程之後
終於在今天的「系統分析與設計」分了組
看得出來大部份的組別都是找"鄰居"
不知小組運作到最後會不會問題很多?
正如老師所說:因不解而結合,因了解而分開。

另外話說國內從事 "企業(Enterprise)" 軟體的獨立開發廠商(ISV),大致可以分為三種營利的模式:


  • Project (專案)。
  • Package (套件)。
  • Product (產品)。


算起來,應該約有 80% 以上的開發廠商是以專案開發為主的(Project-based)。專案,顧名思義,會偏以滿足單一任務的工作性質,服務的對象也偏以單一的客戶為主,目的就在於能達成客戶對資訊系統的期望,而這些期望,也就是系統所提供的服務與功能—軟體開發廠商所負責承諾來實現,並換取實質的回饋報酬。

我們都知道,最為難的就是如何能滿足客戶的期望,因為,客戶的期望一直在變;又,競爭的因素,專案性質的資訊系統開發總是被要求在最短的時間,以最少的成本來完成,自然,種種不合理的要求,品質當然也就不佳。

請記得,開發端與客戶端是要能達成一種實質交易上的平衡,而開發端投入許多的心力與人力,來服務單一的客戶,卻換取開發端認為不合理的報酬,當然這種交易的結果也就無法讓雙方都能協調滿意的了。

只賣給一家客戶,即使開發 ERP 系統拿到 200 萬元,開發端都還認為是慘賠,因為人員的實質負擔實在不敷成本。一般專案性質的軟體開發總是存在一個根本問題:無法達成軟體的大量複製!



至於套件與產品如何區別?套件的特性是,它提供了預先定義好的功能(pre-defined)給客戶,然後利用 "參數(parameters)",讓客戶來自行 "微調" 系統功能;若是客戶單位要求的是套件沒有的功能、企業規則或企業流程的話,當然就要找原開發廠商,然後回到 "專案" 的型態來開發新的功能。

專案要作的是滿足客戶的需求,但期望客戶的需求變動不要太頻繁;套件則是提供預先定義好的需求給客戶,但其假設點是客戶的要求不多、規模不大(這也就是國內的 ERP 廠商的客戶鎖定在中小企業的原因)。兩者的根本問題是:彈性度不足,無法提供 Enterprise 層級的資訊系統,有效的客製化與變動性管理!

那麼,該具備什麼樣的特性才 "夠格" 稱之為 "產品(Product)" 呢?答案就是理出專案與套件的共同問題:讓系統更有彈性!



閱讀全文...