摘要: OOD實例閱讀筆記(二)
Use case 圖包括的內容
Use case圖是用于需求分析的工具。他和實現技術沒有任何關聯。他的目的寫出特定情況下的需求。
首先就是要有一定的場景。場景包括特定的環境(case 發生的條件),參與的人(action)和系統所做的響應。
一般情況下回采用黑箱的use
case(blak – box
use case)。黑箱的us... 閱讀全文
OOD實例閱讀筆記 說明:我閱讀的這個例子是密爾沃基工程學校(Milwaukee School of Engineering)的學生于2000做的課程(CS400 – Senior Design)設計。看上去很不錯。設計報告可以通過下面的地址可以獲得。http://www.uml.org.cn/appCase/pdf/resource-management-software-design.pdf 1. 設計步驟 1.1. 確定系統為用戶提供的所有服務。并建立Use cases。 1.2. 建立概念模型。確定主要的類以及他們的屬性。主要類來源主要有兩個: l Use Cases中的名詞。英文的原話為: by looking at the nouns in the use cases, it was
possible to pick out a number of classes for possible implementation. l
從用戶提供的信息中提取類的信息。英文的原文為: by going back to the proposal and examining other
information provided by the client, additional classes and the data to be stored
in these classes were obtained. 1.3.
畫出概要的sequence圖。用于描述類之間的互動關系。Sequence圖是和Use Case圖一一對應的。用Sequence來描述Use Case的具體實現。
1.4.
建立類圖。類圖要包括系統中所有的類,以及各個類之間的關系。 在于上面的步驟進行的過程中。文檔的起草需要同步進行。 2.
Use case的建立 Use case只是單純的描述domain處理。他描述的是系統和用戶的交互。為確定類,以及類的方法屬性做準備。
這個周末去了一趟上海。 最有感觸的就是上海新開通的軌道交通4號線。我乘坐的區間是臨平路~火車站。在這個短短的幾站路的過程中。我看到了地鐵(地下),清軌(空中),鐵路(地面上)這三種方式。從臨平路到寶山路是采用的新建的地下軌道。當到了寶山路這一段是就充分利用3號線已有的資源。這就是我看到的清軌了。進了火車站后又直接利用火車的軌道。完成著一段路程。真的可算做到充分利用現有資源。 其實在我們現在的軟件開發的過程中。完全是可以借鑒這個觀點的(其實很多地方已經這么干了)。 但是在利用現有資源的前提是要了解現有資源。評估他帶來的好處。 ![]() Hibernate Tool 使用說明
使用環境: Eclipse 3.2M3 (http://www.eclipse.org) HibernateTools-3.1.0.beta2(http://www.hibernate.org/255.html) 插件的安裝就不用多說了吧。 1、 創建cfg文件。 Ctrl + N 帶出如下窗體。![]() 選中Hibernate Configuration File(cfg.xml)項。并Next下去。 選擇配置文件的路徑。 Next后就可以看到具體的配置窗體。 ![]() 在這個界面中你可以配置你的SessionFactory的一些屬性。這個就不用多說了吧。不過有一點還是要多說一下的。就是你可以選擇同時創建一個Console。如果你不選中的話,cfg文件就創建完成了。 創建Hibernate Console Configuration。其他應用的基礎。當然以cfg文件為基礎的。可以通過Ctrl + N 帶出如下窗體中選擇Hibernate Console Configuration帶出創建的界面。![]() 最初的時候Mapping file可以不選。只要填上Configuration file(就是我們剛才創建的那個J)。另外需要在Classpath中加入你jdbc driver。這樣的話你就可以按Finish了。 產生代碼和Map文件。 ![]() 點擊Hibernate Code Generation……后會進入如下的界面 ![]() 點擊New,右邊會出現如下界面 ![]() 在這個tab頁里你可以設置對于那個Console來產生代碼。以及代碼輸出目錄。如果你想通過reverse來確定產生那些代碼,那你就勾上reverse engineer from jdbc connection吧。 另外插件還允許你使用自己的代碼產生模板(模板引擎是使用的apache的velocity) ![]() 這里你可以設置你需要產生的內容。具體的我就不羅嗦了。 這些都設好以后你就可以通過 Run button來產生代碼了。3. 使用Console 我們現在可以把剛才生成的java class和mapping文件加到console中來了。 打開Hibernate console透視圖。![]() 在這里你可以執行Hql.查看查詢結果。查看對象屬性,等等。 我們現在就先看一下執行hql.![]() 這樣就會打開hql的編輯器。 ![]() 編輯其中提供了三個比較好用的功能,Content Assist,Content Tip,Format Hql.具體的有哪些功能可以自己看看。 在執行前是否想看一下最終的sql是什么樣的,那就看看好了。通過Hibernate Dynamic Query Translator可以辦到。![]() 還有我的hql中有參數,如何對這些參數賦值呢。 那就通過Query Parameters視圖吧。這個特別對于需要多次執行的hql是不是很方便。(是我個人比較喜歡的一個功能)。![]() 所了這么多,到底如何執行啊,如何看結果啊。 看看這個就好了。![]() 至于結果你可以通過Hibernate Query Result視圖來查看。如果配合上屬性視圖那你可以看得更清楚。 ![]() 最后還送一個視圖。 ![]()
昨天把spring文擋中的MVC-step-by-step看了一遍。感覺很爽。以前沒有在web項目中使用spring的經驗。通過昨天的學習,感覺挺方便的。想好好的看一下。
EMF不光為我們生成了模型類的代碼。還為我們提供了一個默認的模型編輯器。要看到這個模型編輯器我們只需要運行一下就可以看到了(用Eclipse Application的方式)。 他默認的編輯器如下圖所示![]() 共有三個部: 1. 編輯器的主體。包括六種呈現方式。 a) Selection. b) Parent. c) List. d) Tree e) Table f) Tree With Columns. 2. Outline部分。 Properties,會根據選擇不同的對象而改變顯示的內容。 關于Jface部分的工作模式我在《Table View 的合作類的模式》一文中有提到,不過需要說明的是,在Jface中的Viewer他們的ContentProvider可能不一樣的。要完成這部分的功能emf的產生代碼中分別放到了兩個插件里實現了他們分別是edit和editor。 Edit提供了Item 的Provider,他存在的意義就在于把邏輯對象和UI分割開。而Editor通過使用edit提供的Provider實現了一個編輯器的UI和Command部分,他是正真的用戶界面部分。 下面我們就先來看看edit中的類。 好了,首先edit中使用的是adapt模型。所以edit中的插件對象會實現所有的viewer,Properties所需要的接口。 Emf為我們實現通用的接口。所以這絕對是一個學習的好機會。 廢話不多說了,來看代碼把。 首先看聲明: public class FamilyItemProvider 他的繼承關系可以用下圖來表示:extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource { ![]() 他們之間的職能以及實現的接口可用下圖來描述: ![]() AdapterImpl是為了實現Adapter模式而設定. ItemProviderAdapter完成一些基本功能。下面就分別從不同的接口來說明 1. ResourceLocator:該接口是用來進行資源定位的。 2. IDisposable 是emf框架提供的一種析構接口。 3. IChangeNotifier 為"Notification and Adapters"模式提供必需的方法。 CreateChildCommand.Helper 最下面的EMF根據我們的模型產生的Provider的了。他實現了5個接口。
1. IEditingDomainItemProvider 這部分我還清楚,懷疑和command有關。 2. IStructuredItemContentProvider 該接口為TableViewer,ListViewer,TreeViewer提供服務。 This is the interface needed to populate the top level items in a TreeViewer, the items of a ListViewer, or the rows of a TableViewer. 3. ITreeItemContentProvider This is the interface needed to populate subtrees in a TreeViewer 4. IItemLabelProvider This is the interface implemented to provide a label text and even a label icon for an item; it receives delegated calls from ILabelProvider. 5. IItemPropertySource This is the interface is needed to populate property sheet items。it is the same as IpropertySource。except that the object is passed as the first parameter for each method.這一篇還只是edit部分剛開一個頭。 下一期會介紹一下他的command部分。
又是周末。在過去的一周里一直在和wtp較勁.不過還好在周末前找到了答案.算是一點安慰吧.
這個周末還是西方的圣誕節.在這個圣誕節里打算接著寫EMF 生成的Model Code閱讀筆記(一) 系列.這一期會把精力放在editor上. 并為下周的uml分享做點準備. 如果可能的話會給遠方的她打個電話... 在八進制的中講述了從模型到應用程序的生成過程。我通過類似的方法生成了一個應用程序。 代碼生成后,我就想看看EMF為我生成了什么樣的代碼。我如果需要修改的話該如何修改。 我的“Hellow world”是采用的“Using EMF”文中的模型。根據這個模型建立了一個EMF Model: ![]() 根據這個模型生成model class的結構如下圖所示: ![]() 從圖中我們可以看到有三個包: 他們分別是:family,family.impl和family.util。 family和family.impl包之間的差別就是一個是Interface,另外一個是這些Interface的實現。 我們先來看看我們模型中出現過的類: Family,FamilyTree,Female,Male以及Individual。 由于我是采用Annotated Java的方式生成的模型。所以在family包中的代碼并沒有太多的變化。/** * Return the father * @return the father * @model */ Male getFather(); /** * Sets the value of the '{@link com.jet.swt.emf.family.Family#getFather <em>Father</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Father</em>' reference. * @see #getFather() * @generated */ void setFather(Male value); 他只是為我提供了Set方法。接口的繼承也沒有做修改。但是他對應的實現類就有了很多變化。 首先從類的申明來看: public class FamilyImpl extends EDataObjectImpl implements Family { 我們可以看到我們的FamilyImpl是從EdataObjectImpl類繼承而來。處于好奇我有在Hiberarchy中打開他的繼承關系看了一下。![]() 這里有一張圖可以清晰的說明這個繼承關系的職能。 ![]() ![]() 這樣我們的就可以不寫一行代碼就可以使我們的對象具有Notification/Common的功能(關于Notification和Common的功能到底是怎樣的,我會在后續的學習筆記中記下來。呵呵,是不是很爽啊)。另外在《Eclipse Modeling Framework: A Developer's Guide》一書的第二章也有提到這部分的內容,不過由于他講解的EMF的版本比較老和我現在使用的版本有點出入,不過基本的功能還是講到了。 好了,看完申明我們就來繼續往下看吧。在Family下面有三個屬性,father,mother和children。 EMF給我們生成的對應的代碼為: protected Male father = null;
/** * The cached value of the '{@link #getMother() <em>Mother</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getMother() * @generated * @ordered */ protected Female mother = null; /** * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getChildren() * @generated * @ordered */ protected EList children = null; 以及一些get和set方法。 對于set方法中除了基本的賦值以外還加上了向所有對這次變動感興趣觀察者發送一個變更消息: 對于get方法要分基本類型還是對象這兩種類型來處理。 如果是基本類型,直接返回就好了。 如: public String getName() { 如果是對象的話就有點麻煩了。先要判斷該對象是否使用了代理(這一部分我還不是太清楚)如果是的話就獲得他的代理對象,并判斷獲得代理對象是否和當前對象是否相等,如果不等就發送一個變更消息。最終返回對象(肯能是一個代理對象)。return name; } public Male getFather() { if (father != null && ((EObject)father).eIsProxy()) { Male oldFather = father; father = (Male)eResolveProxy((InternalEObject)father); if (father != oldFather) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, FamilyPackage.FAMILY__FATHER, oldFather, father)); } } return father; } 還有其他類將在下一篇記下。 1、 Using EMF, Author :Catherine Griffin 2、 EMF介紹系列(二、從模型生成應用程序) Author:八進制 3、 Mastering Eclipse Modeling Framework,Author:Vladimir Bacvanski(Vladimir@inferdata.com) Petter Graff(petter@inferdata.com) Eclipse Modeling Framework: A Developer's Guide Author:Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose由于開發項目要求jdk配置比較低,所以Eclipse中的WorkSpace default 的jre設得比較低。如果自己想測試一下高版本得jdk內容得話,就需要切換jdk得配置。 在3.2中我發現了一個很有方便功能,用來完成這個功能。
通過Alernate jar就可以達到為該項目設定jre了。 這樣是不是很爽啊。呵呵。
|