如何顯示如下日期格式:Fri, 11 Jan 2008 15:29:31 +0800 ?
代碼如下:
1
import java.io.IOException;
2
import java.text.ParseException;
3
import java.text.SimpleDateFormat;
4
import java.util.Date;
5
import java.util.Locale;
6
7
/** *//**
8
*
9
* @author david
10
*
11
*/
12
public class Test
{
13
14
public static void main(String[] args) throws NumberFormatException,
15
IOException, ParseException
{
16
17
SimpleDateFormat sdfIn = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss",
18
Locale.US);/**//* 輸入格式 */
19
Date date = sdfIn.parse("2008-01-11 Fri 15:29:31");/**//* 輸入日期 */
20
21
SimpleDateFormat sdfOut = new SimpleDateFormat(
22
"E, dd MMM yyyy HH:mm:ss Z", Locale.US);/**//* 輸出格式 */
23
System.out.println(sdfOut.format(date));/**//* 輸出日期 */
24
}
25
26
}
其中,MM為月份,mm為分鐘,HH為24進制的小時,hh為12進制的小時。
另外,在創(chuàng)建SimpleDateFormat的時候,第二個參數(shù)Locale.US為指定系統(tǒng)編碼,如果不指定的話,輸出的星期會根據(jù)本地操作系統(tǒng)的編碼而定,中文系統(tǒng)會是“星期五”,而不是Fri 。
--------------------
WE準高手
posted @
2008-01-25 11:27 大衛(wèi) 閱讀(1295) |
評論 (0) |
編輯 收藏
摘要: Java程序性能測試
1 概述
在開發(fā)中,性能測試是設計初期容易忽略的問題,開發(fā)人員會為了解決一個問題而“不擇手段”,作者所參與的項目中也遇到了類似問題,字符串拼接、大量的網絡調用和數(shù)據(jù)庫訪問等等都對系統(tǒng)的性能產生了影響,可是大家不會關心這些問題,“CPU速度在變快”,“內存在變大”,并且,“好像也沒有那么慢吧...
閱讀全文
posted @
2008-01-24 13:13 大衛(wèi) 閱讀(1964) |
評論 (4) |
編輯 收藏
數(shù)據(jù)庫設計5步驟
1.確定entities及relationships
a)設計宏觀行為。你用此數(shù)據(jù)庫來做什么?比如,希望管理雇員的信息。
b)確定entities。對于一系列的行為,確定所管理信息所涉及到的主題范圍。這將變成table。比如,雇用員工,指定具體部門,確定技能等級。
c)確定relationships。看著行為,確定tables之間有何種關系。比如,在部門與雇員之間存在一種關系。給這種關系命名。
d)細化行為。你從宏觀行為開始,現(xiàn)在仔細檢查這些行為,看有哪些行為能轉為微觀行為。比如,管理雇員的信息可細化為:
● 增加新員工
● 修改存在員工信息
● 刪除調走的員工
e)確定業(yè)務規(guī)則??粗愕臉I(yè)務規(guī)則,確定你要采取哪種。比如,可能有這樣一種規(guī)則,一個部門有且只能有一個部門領導。這些規(guī)則將被設計到數(shù)據(jù)庫的結構中。
范例:
ACME是一個小公司,在5個地方都設有辦事處。當前,有75名員工。公司準備快速擴大規(guī)模,劃分了9個部門,每個部門都有其領導。
為有助于尋求新的員工,人事部門規(guī)劃了68種技能,為將來人事管理作好準備。員工被招進時,每一種技能的專業(yè)等級都被確定。
定義宏觀行為
一些ACME公司的宏觀行為包括:
● 招聘員工
● 解雇員工
● 管理員工個人信息
● 管理公司所需的技能信息
● 管理哪位員工有哪些技能
● 管理部門信息
● 管理辦事處信息
確定entities及relationships
我們可以確定要存放信息的主題領域(表)及其關系,并創(chuàng)建一個基于宏觀行為及描述的圖表。
我們用方框來代表table,用菱形代表relationship。我們可以確定哪些relationship是一對多,一對一,及多對多。
這是一個E-R草圖,以后會細化。
細化宏觀行為
以下微觀行為基于上面宏觀行為而形成:
● 增加或刪除一個員工
● 增加或刪除一個辦事處
● 列出一個部門中的所有員工
● 增加一項技能
● 增加一個員工的一項技能
● 確定一個員工的技能
● 確定一個員工每項技能的等級
● 確定所有擁有相同等級的某項技能的員工
● 修改員工的技能等級
這些微觀行為可用來確定需要哪些table或relationship。
確定業(yè)務規(guī)則
業(yè)務規(guī)則常用于確定一對多,一對一,及多對多關系。
相關的業(yè)務規(guī)則可能有:
● 現(xiàn)在有5個辦事處;最多允許擴展到10個。
● 員工可以改變部門或辦事處
● 每個部門有一個部門領導
● 每個辦事處至多有3個電話號碼
● 每個電話號碼有一個或多個擴展
● 員工被招進時,每一種技能的專業(yè)等級都被確定。
● 每位員工擁有3到20個技能
● 某位員工可能被安排在一個辦事處,也可能不安排辦事處。
2.確定所需數(shù)據(jù)
要確定所需數(shù)據(jù):
1. 確定支持數(shù)據(jù)
2. 列出所要跟蹤的所有數(shù)據(jù)。描述table(主題)的數(shù)據(jù)回答這些問題:誰,什么,哪里,何時,以及為什么
3. 為每個table建立數(shù)據(jù)
4. 列出每個table目前看起來合適的可用數(shù)據(jù)
5. 為每個relationship設置數(shù)據(jù)
6. 如果有,為每個relationship列出適用的數(shù)據(jù)
確定支持數(shù)據(jù)
你所確定的支持數(shù)據(jù)將會成為table中的字段名。比如,下列數(shù)據(jù)將適用于表Employee,表Skill,表Expert In。
如果將這些數(shù)據(jù)畫成圖表,就像:
需要注意:
● 在確定支持數(shù)據(jù)時,請一定要參考你之前所確定的宏觀行為,以清楚如何利用這些數(shù)據(jù)。
● 比如,如果你知道你需要所有員工的按姓氏排序的列表,確保你將支持數(shù)據(jù)分解為名字與姓氏,這比簡單地提供一個名字會更好。
● 你所選擇的名稱最好保持一致性。這將更易于維護數(shù)據(jù)庫,也更易于閱讀所輸出的報表。
● 比如,如果你在某些地方用了一個縮寫名稱Emp_status,你就不應該在另外一個地方使用全名(Empolyee_ID)。相反,這些名稱應當是Emp_status及Emp_id。
● 數(shù)據(jù)是否與正確的table相對應無關緊要,你可以根據(jù)自己的喜好來定。在下節(jié)中,你會通過測試對此作出判斷。
3.標準化數(shù)據(jù)
標準化是你用以消除數(shù)據(jù)冗余及確保數(shù)據(jù)與正確的table或relationship相關聯(lián)的一系列測試。共有5個測試。本節(jié)中,我們將討論經常使用的3個。
關于標準化測試的更多信息,請參考有關數(shù)據(jù)庫設計的書籍。
標準化格式
標準化格式是標準化數(shù)據(jù)的常用測試方式。你的數(shù)據(jù)通過第一遍測試后,就被認為是達到第一標準化格式;通過第二遍測試,達到第二標準化格式;通過第三遍測試,達到第三標準化格式。
如何標準格式:
1. 列出數(shù)據(jù)
2. 為每個表確定至少一個鍵。每個表必須有一個主鍵。
3. 確定relationships的鍵。relationships的鍵是連接兩個表的鍵。
4. 檢查支持數(shù)據(jù)列表中的計算數(shù)據(jù)。計算數(shù)據(jù)通常不保存在數(shù)據(jù)庫中。
5. 將數(shù)據(jù)放在第一遍的標準化格式中:
6. 從tables及relationships除去重復的數(shù)據(jù)。
7. 以你所除去數(shù)據(jù)創(chuàng)建一個或更多的tables及relationships。
8. 將數(shù)據(jù)放在第二遍的標準化格式中:
9. 用多于一個以上的鍵確定tables及relationships。
10. 除去只依賴于鍵一部分的數(shù)據(jù)。
11. 以你所除去數(shù)據(jù)創(chuàng)建一個或更多的tables及relationships。
12. 將數(shù)據(jù)放在第三遍的標準化格式中:
13. 除去那些依賴于tables或relationships中其他數(shù)據(jù),并且不是鍵的數(shù)據(jù)。
14. 以你所除去數(shù)據(jù)創(chuàng)建一個或更多的tables及relationships。
數(shù)據(jù)與鍵
在你開始標準化(測試數(shù)據(jù))前,簡單地列出數(shù)據(jù),并為每張表確定一個唯一的主鍵。這個鍵可以由一個字段或幾個字段(連鎖鍵)組成。
主鍵是一張表中唯一區(qū)分各行的一組字段。Employee表的主鍵是Employee ID字段。Works In relationship中的主鍵包括Office Code及Employee ID字段。給數(shù)據(jù)庫中每一relationship給出一個鍵,從其所連接的每一個table中抽取其鍵產生。
將數(shù)據(jù)放在第一遍的標準化格式中
● 除去重復的組
● 要測試第一遍標準化格式,除去重復的組,并將它們放進他們各自的一張表中。
● 在下面的例子中,Phone Number可以重復。(一個工作人員可以有多于一個的電話號碼。)將重復的組除去,創(chuàng)建一個名為Telephone的新表。在Telephone與Office創(chuàng)建一個名為Associated With的relationship。
將數(shù)據(jù)放在第二遍的標準化格式中
● 除去那些不依賴于整個鍵的數(shù)據(jù)。
● 只看那些有一個以上鍵的tables及relationships。要測試第二遍標準化格式,除去那些不依賴于整個鍵的任何數(shù)據(jù)(組成鍵的所有字段)。
● 在此例中,原Employee表有一個由兩個字段組成的鍵。一些數(shù)據(jù)不依賴于整個鍵;例如,department name只依賴于其中一個鍵(Department ID)。因此,Department ID,其他Employee數(shù)據(jù)并不依賴于它,應移至一個名為Department的新表中,并為Employee及Department建立一個名為Assigned To的relationship。
將數(shù)據(jù)放在第三遍的標準化格式中
● 除去那些不直接依賴于鍵的數(shù)據(jù)。
● 要測試第三遍標準化格式,除去那些不是直接依賴于鍵,而是依賴于其他數(shù)據(jù)的數(shù)據(jù)。
● 在此例中,原Employee表有依賴于其鍵(Employee ID)的數(shù)據(jù)。然而,office location及office phone依賴于其他字段,即Office Code。它們不直接依賴于Employee ID鍵。將這組數(shù)據(jù),包括Office Code,移至一個名為Office的新表中,并為Employee及Office建立一個名為Works In的relationship。
4.考量關系
當你完成標準化進程后,你的設計已經差不多完成了。你所需要做的,就是考量關系。
考量帶有數(shù)據(jù)的關系
你的一些relationship可能集含有數(shù)據(jù)。這經常發(fā)生在多對多的關系中。
遇到這種情況,將relationship轉化為一個table。relationship的鍵依舊成為table中的鍵。
考量沒有數(shù)據(jù)的關系
要實現(xiàn)沒有數(shù)據(jù)的關系,你需要定義外部鍵。外部鍵是含有另外一個表中主鍵的一個或多個字段。外部鍵使你能同時連接多表數(shù)據(jù)。
有一些基本原則能幫助你決定將這些鍵放在哪里:
一對多 在一對多關系中,“一”中的主鍵放在“多”中。此例中,外部鍵放在Employee表中。
一對一 在一對一關系中,外部鍵可以放進任一表中。如果必須要放在某一邊,而不能放在另一邊,應該放在必須的一邊。此例中,外部鍵(Head ID)在Department表中,因為這是必需的。
多對多 在多對多關系中,用兩個外部鍵來創(chuàng)建一個新表。已存的舊表通過這個新表來發(fā)生聯(lián)系。
5.檢驗設計
在你完成設計之前,你需要確保它滿足你的需要。檢查你在一開始時所定義的行為,確認你可以獲取行為所需要的所有數(shù)據(jù):
● 你能找到一個路徑來等到你所需要的所有信息嗎?
● 設計是否滿足了你的需要?
● 所有需要的數(shù)據(jù)都可用嗎?
如果你對以上的問題都回答是,你已經差不多完成設計了。
最終設計
最終設計看起來就像這樣:
設計數(shù)據(jù)庫的表屬性
數(shù)據(jù)庫設計需要確定有什么表,每張表有什么字段。此節(jié)討論如何指定各字段的屬性。
對于每一字段,你必須決定字段名,數(shù)據(jù)類型及大小,是否允許NULL值,以及你是否希望數(shù)據(jù)庫限制字段中所允許的值。
選擇字段名
字段名可以是字母、數(shù)字或符號的任意組合。然而,如果字段名包括了字母、數(shù)字或下劃線、或并不以字母打頭,或者它是個關鍵字(詳見關鍵字表),那么當使用字段名稱時,必須用雙引號括起來。
為字段選擇數(shù)據(jù)類型
SQL Anywhere支持的數(shù)據(jù)類型包括:
整數(shù)(int, integer, smallint)
小數(shù)(decimal, numeric)
浮點數(shù)(float, double)
字符型(char, varchar, long varchar)
二進制數(shù)據(jù)類型(binary, long binary)
日期/時間類型(date, time, timestamp)
用戶自定義類型
關于數(shù)據(jù)類型的內容,請參見“SQL Anywhere數(shù)據(jù)類型”一節(jié)。字段的數(shù)據(jù)類型影響字段的最大尺寸。例如,如果你指定SMALLINT,此字段可以容納32,767的整數(shù)。INTEGER可以容納2,147,483,647的整數(shù)。對CHAR來講,字段的最大值必須指定。
長二進制的數(shù)據(jù)類型可用來在數(shù)據(jù)庫中保存例如圖像(如位圖)或者文字編輯文檔。這些類型的信息通常被稱為二進制大型對象,或者BLOBS。
關于每一數(shù)據(jù)類型的完整描述,見“SQL Anywhere數(shù)據(jù)類型”。
NULL與NOT NULL
如果一個字段值是必填的,你就將此字段定義為NOT NULL。否則,字段值可以為NULL值,即可以有空值。SQL中的默認值是允許空值;你應該顯示地將字段定義為NOT NULL,除非你有好理由將其設為允許空值。
關于NULL值的完整描述,請見“NULL value”。有關其對比用法,見“Search conditions”。
選擇約束
盡管字段的數(shù)據(jù)類型限制了能存在字段中的數(shù)據(jù)(例如,只能存數(shù)字或日期),你或許希望更進一步來約束其允許值。
你可以通過指定一個“CHECK”約束來限制任意字段的值。你可以使用能在WHERE子句中出現(xiàn)的任何有效條件來約束被允許的值,盡管大多數(shù)CHECK約束使用BETWEEN或IN條件。
更多信息
有關有效條件的更多信息,見“Search conditions”。有關如何為表及字段指定約束,見“Ensuring Data Integrity”。
例子
例子數(shù)據(jù)庫中有一個名為department的表,字段是dept_id, dept_name, dept_head_id。其定義如下:
注意每一字段都被指定為“not null”。這種情況下,表中每一記錄的所有字段的數(shù)據(jù)都必填。
選擇主鍵及外部鍵
主鍵是唯一識別表中每一項記錄的字段。如何你的表已經正確標準化,主鍵應當成為數(shù)據(jù)庫設計的一部分。
外部鍵是包含另一表中主鍵值的一個或一組字段。外部鍵關系在數(shù)據(jù)庫中建立了一對一及一對多關系。如果你的設計已經正確標準化,外部鍵應當成為數(shù)據(jù)庫設計的一部分。
posted @
2008-01-24 10:07 大衛(wèi) 閱讀(88651) |
評論 (48) |
編輯 收藏
要開發(fā)出用戶滿意的軟件并不是件容易的事,軟件架構師必須全面把握各種各樣的需求、權衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。本文從理解需求種類的復雜性談起,通過具體案例的分析,展示了如何通過RUP的4+1視圖方法,針對不同需求進行架構設計,從而確保重要的需求一一被滿足。
呼喚架構設計的多重視圖方法
靈感一閃,就想出了把大象放進冰箱的辦法,這自然好。但希望每個架構設計策略都依靠靈感是不現(xiàn)實的--我們需要系統(tǒng)方法的指導。
需要架構設計的多重視圖方法,從根本上來說是因為需求種類的復雜性所致。以工程領域的例子開道吧。比如設計一座跨江大橋:我們會考慮"連接南北的公路交通"這個"功能需求",從而初步設計出理想化的橋墩支撐的公路橋方案;然后還要考慮造橋要面臨的"約束條件",這個約束條件可能是"不能影響萬噸輪從橋下通過",于是細化設計方案,規(guī)定橋墩的高度和橋墩之間的間距;另外還要顧及"大橋的使用期質量屬性",比如為了"能在湍急的江流中保持穩(wěn)固",可以把大橋橋墩深深地建在巖石層之上,和大地渾然一體;其實,"建造期間的質量屬性"也很值得考慮,比如在大橋的設計過程中考慮"施工方便性"的一些措施。
和工程領域的功能需求、約束條件、使用期質量屬性、建造期間的質量屬性等類似,軟件系統(tǒng)的需求種類也相當復雜,具體分類如圖1所示。
圖1 軟件需求分類的復雜性
超市系統(tǒng)案例:理解需求種類的復雜性
例子是最好的老師。為了更好地理解軟件需求種類的復雜性,我們來分析一個實際的例子。在表1中,我們列舉了一個典型的超市系統(tǒng)的需求子集,從這個例子中可以清晰地看到需求可以分為兩大類:功能需求和非功能需求。
表1 超市系統(tǒng)案例:理解需求種類的復雜性
簡單而言,功能需求就是"軟件有什么用,軟件需要做什么"。同時,注意把握功能需求的層次性是軟件需求的最佳實踐。以該超市系統(tǒng)為例:
* 超市老板希望通過軟件來"提高收銀效率"。
* 那么,你可能需要為收銀員提供一系列功能來促成這個目的,比如供收銀員使用的"任意商品項可單獨取消"功能有利于提供收銀效率(筆者曾在超市有過被迫整單取消然后一車商品重新掃描收費的痛苦經歷)。
* 而具體到這個超市系統(tǒng),系統(tǒng)分析員可能會決定要提供的具體功能為:通過收銀終端的按鍵組合,可以使收銀過程從"逐項錄入狀態(tài)"進入"選擇取消狀態(tài)",從而取消某項商品。
從上面的例子中我們還驚訝地發(fā)現(xiàn),非功能需求--人們最經常忽視的一大類需求--包括的內容非常寬、并且極其重要。非功能需求又可以分為如下三類:
* 約束。要開發(fā)出用戶滿意的軟件并不是件容易的事,而全面理解要設計的軟件系統(tǒng)所面臨的約束可以使你向成功邁進一步。約束性需求既包括企業(yè)級的商業(yè)考慮(例如"項目預算有限"),也包括最終用戶級的實際情況(例如"用戶的平均電腦操作水平偏低");既可能包括具體技術的明確要求(例如"要求能在Linux上運行"),又可能需要考慮開發(fā)團隊的真實狀況(例如"開發(fā)人員分散在不同地點")。這些約束性需求當然對架構設計影響很大,比如受到"項目預算有限"的限制,架構師就不應選擇昂貴的技術或中間件等,而考慮到開發(fā)人員分散在不同地點",就更應注重軟件模塊職責劃分的合理性、松耦合性等等。
* 運行期質量屬性。這類需求主要指軟件系統(tǒng)在運行期間表現(xiàn)出的質量水平。運行期質量屬性非常關鍵,因為它們直接影響著客戶對軟件系統(tǒng)的滿意度,大多數(shù)客戶也不會接受運行期質量屬性拙劣的軟件系統(tǒng)。常見的運行期質量屬性包括軟件系統(tǒng)的易用性、性能、可伸縮性、持續(xù)可用性、魯棒性、安全性等。在我們的超市系統(tǒng)的案例中,用戶對高性能提出了具體要求(真正的性能需求應該量化,我們的表1沒體現(xiàn)),他們不能容忍金額合計超過 2秒的延時。
* 開發(fā)期質量屬性。這類非功能需求中的某些項人們倒是念念不忘,可惜很多人并沒有意識到"開發(fā)期質量屬性"和" 運行期質量屬性"對架構設計的影響到底有何不同。開發(fā)期質量屬性是開發(fā)人員最為關心的,要達到怎樣的目標應根據(jù)項目的具體情況而定,而過度設計(overengineering)會花費額外的代價。
什么是軟件架構視圖
那么,什么是軟件架構視圖呢?Philippe Kruchten在其著作《Rational統(tǒng)一過程引論》中寫道:
一個架構視圖是對于從某一視角或某一點上看到的系統(tǒng)所做的簡化描述,描述中涵蓋了系統(tǒng)的某一特定方面,而省略了于此方面無關的實體。
也就是說,架構要涵蓋的內容和決策太多了,超過了人腦"一蹴而就"的能力范圍,因此采用"分而治之"的辦法從不同視角分別設計;同時,也為軟件架構的理解、交流和歸檔提供了方便。
值得特別說明的,大多數(shù)書籍中都強調多視圖方法是軟件架構歸檔的方法,其實不然。多視圖方法不僅僅是架構歸檔技術,更是指導我們進行架構設計的思維方法。
Philippe Kruchten提出的4+1視圖方法
1995年,Philippe Kruchten在《IEEE Software》上發(fā)表了題為《The 4+1 View Model of Architecture》的論文,引起了業(yè)界的極大關注,并最終被RUP采納。如圖2所示。
圖2 Philippe Kruchten提出的4+1視圖方法
該方法的不同架構視圖承載不同的架構設計決策,支持不同的目標和用途:
* 邏輯視圖:當采用面向對象的設計方法時,邏輯視圖即對象模型。
* 開發(fā)視圖:描述軟件在開發(fā)環(huán)境下的靜態(tài)組織。
* 處理視圖:描述系統(tǒng)的并發(fā)和同步方面的設計。
* 物理視圖:描述軟件如何映射到硬件,反映系統(tǒng)在分布方面的設計。
運用4+1視圖方法:針對不同需求進行架構設計
如前文所述,要開發(fā)出用戶滿意的軟件并不是件容易的事,軟件架構師必須全面把握各種各樣的需求、權衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。
Philippe Kruchten提出的4+1視圖方法為軟件架構師"一一征服需求"提供了良好基礎,如圖3所示。
圖3 運用4+1視圖方法針對不同需求進行架構設計
邏輯視圖。邏輯視圖關注功能,不僅包括用戶可見的功能,還包括為實現(xiàn)用戶功能而必須提供的"輔助功能模塊";它們可能是邏輯層、功能模塊等。
開發(fā)視圖。開發(fā)視圖關注程序包,不僅包括要編寫的源程序,還包括可以直接使用的第三方SDK和現(xiàn)成框架、類庫,以及開發(fā)的系統(tǒng)將運行于其上的系統(tǒng)軟件或中間件。開發(fā)視圖和邏輯視圖之間可能存在一定的映射關系:比如邏輯層一般會映射到多個程序包等。
處理視圖。處理視圖關注進程、線程、對象等運行時概念,以及相關的并發(fā)、同步、通信等問題。處理視圖和開發(fā)視圖的關系:開發(fā)視圖一般偏重程序包在編譯時期的靜態(tài)依賴關系,而這些程序運行起來之后會表現(xiàn)為對象、線程、進程,處理視圖比較關注的正是這些運行時單元的交互問題。
物理視圖。物理視圖關注"目標程序及其依賴的運行庫和系統(tǒng)軟件"最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統(tǒng)的可靠性、可伸縮性等要求。物理視圖和處理視圖的關系:處理視圖特別關注目標程序的動態(tài)執(zhí)行情況,而物理視圖重視目標程序的靜態(tài)位置問題;物理視圖是綜合考慮軟件系統(tǒng)和整個IT系統(tǒng)相互影響的架構視圖。
設備調試系統(tǒng)案例概述
本文的以下部分,將研究一個案例:某型號設備調試系統(tǒng)。
設備調試員通過使用該系統(tǒng),可以察看設備狀態(tài)(設備的狀態(tài)信息由專用的數(shù)據(jù)采集器實時采集)、發(fā)送調試命令。該系統(tǒng)的用例圖如圖4所示。
圖4 設備調試系統(tǒng)的用例圖
經過研制方和委托方的緊密配合,最終確定的需求可以總括地用表2來表示。
表2 設備調試系統(tǒng)的需求
下面運用RUP推薦的4+1視圖方法,從不同視圖進行架構設計,來分門別類地將不同需求一一滿足。
邏輯視圖:設計滿足功能需求的架構
首先根據(jù)功能需求進行初步設計,進行大粒度的職責劃分。如圖5所示。
* 應用層負責設備狀態(tài)的顯示,并提供模擬控制臺供用戶發(fā)送調試命令。
* 應用層使用通訊層和嵌入層進行交互,但應用層不知道通訊的細節(jié)。
* 通訊層負責在RS232協(xié)議之上實現(xiàn)一套專用的"應用協(xié)議"。
* 當應用層發(fā)送來包含調試指令的協(xié)議包,由通訊層負責按RS232協(xié)議將之傳遞給嵌入層。
* 當嵌入層發(fā)送來原始數(shù)據(jù),由通訊層將之解釋成應用協(xié)議包發(fā)送給應用層。
* 嵌入層負責對調試設備的具體控制,以及高頻度地從數(shù)據(jù)采集器讀取設備狀態(tài)數(shù)據(jù)。
* 設備控制指令的物理規(guī)格被封裝在嵌入層內部,讀取數(shù)采器的具體細節(jié)也被封裝在嵌入層內部。
圖5 設備調試系統(tǒng)架構的邏輯視圖
開發(fā)視圖:設計滿足開發(fā)期質量屬性的架構
軟件架構的開發(fā)視圖應當為開發(fā)人員提供切實的指導。任何影響全局的設計決策都應由架構設計來完成,這些決策如果"漏"到了后邊,最終到了大規(guī)模并行開發(fā)階段才發(fā)現(xiàn),可能造成"程序員碰頭兒臨時決定"的情況大量出現(xiàn),軟件質量必然將下降甚至導致項目失敗。
其中,采用哪些現(xiàn)成框架、哪些第三方SDK、乃至哪些中間件平臺,都應該考慮是否由軟件架構的開發(fā)視圖確定下來。圖6展示了設備調試系統(tǒng)的(一部分)軟件架構開發(fā)視圖:應用層將基于MFC設計實現(xiàn),而通訊層采用了某串口通訊的第三方SDK。
圖6 設備調試系統(tǒng)架構的開發(fā)視圖
在說說約束性需求。約束應該是每個架構視圖都應該關注和遵守的一些設計限制。例如,考慮到"一部分開發(fā)人員沒有嵌入式開發(fā)經驗"這條約束情況,架構師有必要明確說明系統(tǒng)的目標程序是如何編譯而來的:圖7展示了整個系統(tǒng)的桌面部分的目標程序pc-moduel.exe、以及嵌入式模塊rom- module.hex是如何編譯而來的。這個全局性的描述無疑對沒有經驗的開發(fā)人員提供了實感,利于更全面地理解系統(tǒng)的軟件架構。
圖7 設備調試系統(tǒng)架構的開發(fā)視圖
處理視圖:設計滿足運行期質量屬性的架構
性能是軟件系統(tǒng)運行期間所表現(xiàn)出的一種質量水平,一般用系統(tǒng)響應時間和系統(tǒng)吞吐量來衡量。為了達到高性能的要求,軟件架構師應當針對軟件的運行時情況進行分析與設計,這就是我們所謂的軟件架構的處理視圖的目標。處理視圖關注進程、線程、對象等運行時概念,以及相關的并發(fā)、同步、通信等問題。圖8展示了設備調試系統(tǒng)架構的處理視圖。
可以看出,架構師為了滿足高性能需求,采用了多線程的設計:
* 應用層中的線程代表主程序的運行,它直接利用了MFC的主窗口線程。無論是用戶交互,還是串口的數(shù)據(jù)到達,均采取異步事件的方式處理,杜絕了任何"忙等待"無謂的耗時,也縮短了系統(tǒng)響應時間。
* 通訊層有獨立的線程控制著"上上下下"的數(shù)據(jù),并設置了數(shù)據(jù)緩沖區(qū),使數(shù)據(jù)的接收和數(shù)據(jù)的處理相對獨立,從而數(shù)據(jù)接收不會因暫時的處理忙碌而停滯,增加了系統(tǒng)吞吐量。
* 嵌入層的設計中,分別通過時鐘中斷和RS232口中斷來激發(fā)相應的處理邏輯,達到輪詢和收發(fā)數(shù)據(jù)的目的。
圖8 設備調試系統(tǒng)架構的處理視圖
物理視圖:和部署相關的架構決策
軟件最終要駐留、安裝或部署到硬件才能運行,而軟件架構的物理視圖關注"目標程序及其依賴的運行庫和系統(tǒng)軟件"最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統(tǒng)的可靠性、可伸縮性等要求。圖9所示的物理架構視圖表達了設備調試系統(tǒng)軟件和硬件的映射關系??梢钥闯?,嵌入部分駐留在調試機中(調試機是專用單板機),而PC機上是常見的桌面可執(zhí)行程序的形式。
圖9 設備調試系統(tǒng)架構的物理視圖
我們還可能根據(jù)具體情況的需要,通過物理架構視圖更明確地表達具體目標模塊及其通訊結構,如圖10所示。
圖10 設備調試系統(tǒng)架構的物理視圖
小結與說明
所謂本立道生。深入理解軟件需求分類的復雜性,明確區(qū)分功能需求、約束、運行期質量屬性、開發(fā)期質量屬性等不同種類的需求就是"本",因為各類需求對架構設計的影響截然不同。本文通過具體案例的分析,展示了如何通過RUP的4+1視圖方法,針對不同需求進行架構設計,從而確保重要的需求一一被滿足。
本文重點在于方法的解說,因此省略了對架構設計中不少具體問題的說明,同時本文提供的說明架構設計方案的模型也經過了簡化。請讀者注意。
本文來自:http://www.uml.org.cn/SoftWareProcess/200607315.htm
posted @
2008-01-23 22:25 大衛(wèi) 閱讀(1833) |
評論 (0) |
編輯 收藏
一Eclipse下安裝SWT
1.到www.eclipse.org上下載SWT.
我這里用的是1.1.0.1,并且頁面上就有推薦的Eclipse3.1.1,EMF,GEF。都下載了!
2.按照Eclipse安裝插件的方法,安裝SWT,EMF,GEF。
3.如果不出意外,就可以正常使用了!
這里有一個建議:最好使用純的Eclipse,我開始用WTP版的,怎么配置也不行。
可以建立Visual Class,但是不能可視化添加控件,或者看不到控件的屬性,或者Text,TextArea控件無法添加。后來按照以上方法,重新來了一次,OK了!
二打包發(fā)布SWT程序
1.因為需要SWT的jar.但是Eclipse3.1.1配合的的SWT不是通過SWT.jar發(fā)布的!是org.eclipse.swt.win32.win32.x86_3.1.0.jar。里面包括了JINI的DLL和SWT類文件。
需要下載
http://www.eclipse.org/downloads/download.php?file=/eclipse/dow ... 09290840/swt-3.1.1-win32-win32-x86.zip
這里有SWT.jar,和3個DLL,把他們解壓縮出來,備用!
2.通過Eclipse的導出功能,生成一個可執(zhí)行的jar,MANIFEST.MF文件選擇由Eclipse生成,
并且保存到項目中。
3.上面2的步驟,只是為了得到MANIFEST.MF文件。下面修改一下這個文件。
加上 Class-Path: SWT.jar
如果還有其他的jar,用空格分開,加到后面
4.
再生成一次jar,MANIFEST.MF選擇修改后的。
5.
將打包的jar,SWT.jar,3個DLL放到一個文件夾下,雙擊可執(zhí)行的jar,程序運行!
三jar轉EXE
1.打開JSmooth0.9.7。
2.選擇skeleton,在skeleton properties中先把Launch java app in the exe process,Debug console選中。可以查看生成EXE文件執(zhí)行過程信息。
3.選擇Executable.
選擇生成的EXE文件存放位置。
選擇EXE文件圖標
設置當前路徑,選擇要轉換的jar文件所在文件夾
4.選擇Application
設置Main Class,可執(zhí)行jar中的Main Class注意寫類全名
設置Application Argument,如果需要傳入?yún)?shù),寫到這里
設置Embedded jar: 可執(zhí)行的jar
設置Classpath:SWT.jar 如果有其他的繼續(xù)添加
5.選擇JVM Selection。默認吧。
6.JVM Configuration:
可以設置java properties,內存使用
7.點齒輪。生成!看是否有錯誤。
8.EXE執(zhí)行需要的文件:EXE,3個DLL,SWT.jar
把他們考到其他目錄,一樣可以執(zhí)行!
9.去掉skeleton properties中的Launch java app in the exe process,Debug console選項。
重新生成。應該OK了!
-----
看了這個,終于完成了SWT程序打包,太爽了
posted @
2008-01-23 15:13 大衛(wèi) 閱讀(1610) |
評論 (1) |
編輯 收藏