参考:http://www.cnblogs.com/Yogurshine/archive/2013/01/14/2859248.html
1、相同点:都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通后过不同的方法来重用这个公共的用例,以减少模型维护的工作量。
2、不同点:
泛化:对于某一用例,有两个角色均可以使用它,但其中一个角色不仅可以使用它还可以对它进行别的操作,就可以使用泛化。泛化强调的是子用例间的互斥性;泛化有很强的父子关系,如检索收支信息泛化为检索收入信息和检索支出信息,有明显的重合的地方,如都有检索信息。
包含:某用例的事件流过于复杂时,为了简化用例的描述,我们也可以把某一段事件流抽象成为一个被包含的用例;如维护图书信息包含修改图书信息,添加图书信息,删除图书信息。包含强调的是包含的对象对角色的间接服务性。用户不能直接操作它,非得通过包含它的对象才能直接为角色提供服务。如果没有互斥关系或明显的重合时,就使用包含。
扩展:角色在使用一个用例时,可以执行附加的功能。扩展的用例不能单独存在。如登录时,可以选择隐身登录,也可以不选。
3、也许会比较拗口,但在作图时要求的不是太苛刻,只要说得过去就差不多了。用之前多考虑直接性与间接性,有条件性和无条件性这两个特点就行了。用以下方法:
A、如果是体现两个角色的功能有重叠的部分,就用泛化,强调子用例的互斥性。泛化的子用例和父用例有明显的重叠。
B、如果不是泛化关系,又是子用例的话,可以考虑包含,包含的父用例一定是一个完整的功能。一般包含的用例为了简化父用例。但某些时候是被包含的子用例为用户提供间接服务。
C、扩展的发展是有条件的,必须在是用某个用例时才能使用。
如以下是李老师画的
4、养成的好习惯,一定要减少复制粘贴,习惯用自己的话说。
5、MFC中:MFC启动时,一般都要经过CXXXAPP的构造函数函数,可以用来指明主窗口,如:
CQQClientDlg dlg;
m_pMainWnd = &dlg;//m_pMainWnd即为指定的主窗口,m_pMainWnd 是CWinThread的共有变量
6、对于MFC 的事件响应函数,必须在三个地方出现,第一个是类中的protected声明,第二个是message map中,用ON_MESSAGE函数与对应的按钮相关联,第三个是类的方法的定义中。如下:
位置一:
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CQQClientDlg)
afx_msg void OnMsgRecv(WPARAM wParam,LPARAM lParam);//响应自定消息WM-RECVMSG
位置二:
BEGIN_MESSAGE_MAP(CQQClientDlg, CDialog)
//{{AFX_MSG_MAP(CQQClientDlg)
ON_MESSAGE(WM_MSGRECV,OnMsgRecv)
……
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
位置三:
void CQQClientDlg::OnMsgRecv(WPARAM wParam,LPARAM lParam)
{
m_SevAddr=*(SOCKADDR_IN*)wParam;
……
}