然後我們看一下接收消息,此時我們只關心接收消息這一部分。
接收消息(遠程) 主路徑 可選路徑 1.偵聽到客戶端發來的消息,自動顯示在用戶界面上。注意到這樣一點:當遠程主機向本地返回消息時,它的用例又變為了上面的用例“發送消息(本地)”。因為它們的角色已經互 換了。
最後看一下注銷,我們這裡研究的是當我們在本地機器點擊“注銷”後,雙方采取的動作:
注銷(本地主動) 主路徑 可選路徑 1.點擊注銷按鈕,斷開與遠程的連接 2.在用戶界面顯示已經注銷 3.更改控件狀態3.1注銷為灰色,表示已經注銷
3.2連接為亮色,表示可以連接
3.3發送為灰色,表示無法發送
與此對應,服務端應該作出反應:
注銷(遠程被動) 主路徑 可選路徑 1.自動顯示遠程用戶已經斷開連接注意到一點:當遠程主動注銷時,它采取的動作為上面的“本地主動”,本地采取的動作則為這裡的“遠程被動”。
至此,應用程序的功能分析和用例編寫就告一段落了,通過上面這些表格,之後再繼續編寫程序變得容易了許多。另外還需要記得,用例只 能為你提供一個操作步驟的指導,在實現的過程中,因為技術等方面的原因,可能還會有少量的修改。如果修改量很大,可以重新修改用例; 如果修改量不大,那麼就可以直接編碼。這是一個迭代的過程,也沒有一定的標准,總之是以高效和合適為標准。
2.分析與設計
我們已經很清楚地知道了程序需要做些什麼,盡管現在還不知道該如何去做。我們甚至可以編寫出這個程序所需要的接口,以後編寫代碼的 時候,我們只要去實現這些接口就可以了。這也符合面向接口編程的原則。另外我們注意到,盡管這是一個聊天程序,但是卻可以明確地劃分 為兩部分,一部分發送消息,一部分接收消息。另外注意上面標識為自動的語句,它們暗示這個操作需要通過事件的通知機制來完成。關於委 托和事件,可以參考這兩篇文章:
C#中的委托和事件 - 委托和事件的入門文章,同時捎帶講述了Observer設計模式和.Net的事件模型
C#中的委托和事件(續) - 委托和事件更深入的一些問題,包括異常、超時的處理,以及使用委托來異步調用方法。
2.1消息Message
首先我們可以定義消息,前面我們已經明確了消息包含三個部分:用戶名、時間、內容,所以我們可以定義一個結構來表示這個消息:
public struct Message {
private readonly string userName;
private readonly string content;
private readonly DateTime postDate;
public Message(string userName, string content) {
this.userName = userName;
this.content = content;
this.postDate = DateTime.Now;
}
public Message(string content) : this("System", content) { }
public string UserName {
get { return userName; }
}
public string Content {
get { return content; }
}
public DateTime PostDate {
get { return postDate; }
}
public override string ToString() {
return String.Format("{0}[{1}]:\r\n{2}\r\n", userName, postDate, content);
}
}