邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

#

     摘要: OOD实例阅读笔记(二) Use case 图包括的内容 Use case图是用于需求分析的工具。他和实现技术没有任何关联。他的目的写出特定情况下的需求。 首先就是要有一定的场景。场景包括特定的环境(case 发生的条件),参与的人(action)和系统所做的响应。 一般情况下回采用黑箱的use case(blak – box use case)。黑箱的us...  阅读全文
posted @ 2006-01-10 19:11 Jet Geng 阅读(1117) | 评论 (0)编辑 收藏

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处理。他描述的是系统和用户的交互。为确定类,以及类的方法属性做准备。

       建立Use case 的步骤用例建模(Use Case Modeling)--捕获用户需求se_case.html 一文有了很详细介绍。我就不多说了(主要原因是没有人家说的好)。


posted @ 2006-01-08 10:07 Jet Geng 阅读(1461) | 评论 (1)编辑 收藏

这个周末去了一趟上海。

最有感触的就是上海新开通的轨道交通4号线。我乘坐的区间是临平路~火车站。在这个短短的几站路的过程中。我看到了地铁(地下),清轨(空中),铁路(地面上)这三种方式。从临平路到宝山路是采用的新建的地下轨道。当到了宝山路这一段是就充分利用3号线已有的资源。这就是我看到的清轨了。进了火车站后又直接利用火车的轨道。完成着一段路程。真的可算做到充分利用现有资源。

其实在我们现在的软件开发的过程中。完全是可以借鉴这个观点的(其实很多地方已经这么干了)。

但是在利用现有资源的前提是要了解现有资源。评估他带来的好处。
如果能够解决评估现有资源和采用现有资源的总代价和采用传统方式的代价的比较。那就比较爽了。现在我对这个一点头绪都没有。
欢迎你的任何意见。谢谢了先。


line4.gif
posted @ 2006-01-03 16:07 Jet Geng 阅读(624) | 评论 (1)编辑 收藏

Hibernate Tool 使用说明

使用环境:

Eclipse 3.2M3 (http://www.eclipse.org)

HibernateTools-3.1.0.beta2(http://www.hibernate.org/255.html)

插件的安装就不用多说了吧。

1、  创建cfg文件。

Ctrl + N 带出如下窗体。
New.gif

选中Hibernate Configuration File(cfg.xml)项。并Next下去。

选择配置文件的路径。

Next后就可以看到具体的配置窗体。

newcfg.gif

在这个界面中你可以配置你的SessionFactory的一些属性。这个就不用多说了吧。不过有一点还是要多说一下的。就是你可以选择同时创建一个Console。如果你不选中的话,cfg文件就创建完成了。

创建Hibernate Console Configuration。其他应用的基础。当然以cfg文件为基础的。可以通过Ctrl + N 带出如下窗体中选择Hibernate Console Configuration带出创建的界面。
new console.gif
最初的时候Mapping file可以不选。只要填上Configuration file(就是我们刚才创建的那个J)。另外需要在Classpath中加入你jdbc driver。这样的话你就可以按Finish了。
产生代码和Map文件。
gencode.gif
点击Hibernate Code Generation……后会进入如下的界面
createcode.gif
点击New,右边会出现如下界面
gencodemain.gif

在这个tab页里你可以设置对于那个Console来产生代码。以及代码输出目录。如果你想通过reverse来确定产生那些代码,那你就勾上reverse engineer from jdbc connection吧。

另外插件还允许你使用自己的代码产生模板(模板引擎是使用的apachevelocity

gencodeconfig.gif

这里你可以设置你需要产生的内容。具体的我就不罗嗦了。

这些都设好以后你就可以通过 Run button来产生代码了。

3.         使用Console

我们现在可以把刚才生成的java classmapping文件加到console中来了。

打开Hibernate console透视图。
consolepresi.gif

在这里你可以执行Hql.查看查询结果。查看对象属性,等等。

我们现在就先看一下执行hql.
executehql.gif
这样就会打开hql的编辑器。
hqleditor.bmp

编辑其中提供了三个比较好用的功能,Content Assist,Content Tip,Format Hql.具体的有哪些功能可以自己看看。

在执行前是否想看一下最终的sql是什么样的,那就看看好了。通过Hibernate Dynamic Query Translator可以办到。
hibernatedynamicquerytranslator.gif

还有我的hql中有参数,如何对这些参数赋值呢。

那就通过Query Parameters视图吧。这个特别对于需要多次执行的hql是不是很方便。(是我个人比较喜欢的一个功能)。queryparameters.gif

所了这么多,到底如何执行啊,如何看结果啊。

看看这个就好了。run.gif
至于结果你可以通过Hibernate Query Result视图来查看。如果配合上属性视图那你可以看得更清楚。
queryresult.gif
最后还送一个视图。
model.gif


posted @ 2005-12-29 17:17 Jet Geng 阅读(18495) | 评论 (19)编辑 收藏

昨天把spring文挡中的MVC-step-by-step看了一遍。感觉很爽。以前没有在web项目中使用spring的经验。通过昨天的学习,感觉挺方便的。想好好的看一下。
posted @ 2005-12-27 12:19 Jet Geng 阅读(911) | 评论 (1)编辑 收藏

EMF不光为我们生成了模型类的代码。还为我们提供了一个默认的模型编辑器。要看到这个模型编辑器我们只需要运行一下就可以看到了(用Eclipse Application的方式)。

他默认的编辑器如下图所示viewer.gif

共有三个部:

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的产生代码中分别放到了两个插件里实现了他们分别是editeditor

Edit提供了Item Provider,他存在的意义就在于把逻辑对象和UI分割开。而Editor通过使用edit提供的Provider实现了一个编辑器的UICommand部分,他是正真的用户界面部分。

下面我们就先来看看edit中的类。

好了,首先edit中使用的是adapt模型。所以edit中的插件对象会实现所有的viewer,Properties所需要的接口。

Emf为我们实现通用的接口。所以这绝对是一个学习的好机会。

废话不多说了,来看代码把。

首先看声明:

public class FamilyItemProvider
    
extends ItemProviderAdapter
    
implements    
        IEditingDomainItemProvider,    
        IStructuredItemContentProvider,    
        ITreeItemContentProvider,    
        IItemLabelProvider,    
        IItemPropertySource {
他的继承关系可以用下图来表示:
providerh.gif

他们之间的职能以及实现的接口可用下图来描述:

itemprivdelayer.gif
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 itemsit is the same as IpropertySourceexcept that the object is          passed as the first parameter for each method.

这一篇还只是edit部分刚开一个头。

下一期会介绍一下他的command部分。

posted @ 2005-12-25 13:36 Jet Geng 阅读(1730) | 评论 (0)编辑 收藏

又是周末。在过去的一周里一直在和wtp较劲.不过还好在周末前找到了答案.算是一点安慰吧.
这个周末还是西方的圣诞节.在这个圣诞节里打算接着写EMF 生成的Model Code阅读笔记(一) 系列.这一期会把精力放在editor上.
并为下周的uml分享做点准备.
如果可能的话会给远方的她打个电话...



posted @ 2005-12-23 18:34 Jet Geng 阅读(501) | 评论 (0)编辑 收藏

在八进制的中讲述了从模型到应用程序的生成过程。我通过类似的方法生成了一个应用程序。

代码生成后,我就想看看EMF为我生成了什么样的代码。我如果需要修改的话该如何修改。

我的“Hellow world”是采用的“Using EMF”文中的模型。
familytree.JPG
根据这个模型建立了一个EMF Model
family model.gif
根据这个模型生成model class的结构如下图所示:
class code.gif

从图中我们可以看到有三个包:

他们分别是:family,family.implfamily.util

familyfamily.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中打开他的继承关系看了一下。hiberarchy.gif

这里有一张图可以清晰的说明这个继承关系的职能。

hiberachyfunction.gif
我例子中的Business Layer是FamilyImpl类。

这样我们的就可以不写一行代码就可以使我们的对象具有Notification/Common的功能(关于NotificationCommon的功能到底是怎样的,我会在后续的学习笔记中记下来。呵呵,是不是很爽啊)。另外在《Eclipse Modeling Framework: A Developer's Guide》一书的第二章也有提到这部分的内容,不过由于他讲解的EMF的版本比较老和我现在使用的版本有点出入,不过基本的功能还是讲到了。

好了,看完申明我们就来继续往下看吧。

Family下面有三个属性,father,motherchildren

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;

以及一些getset方法。

对于set方法中除了基本的赋值以外还加上了向所有对这次变动感兴趣观察者发送一个变更消息:

public void setFather(Male newFather) {
        Male oldFather 
= father;
        father 
= newFather;
        
if (eNotificationRequired())
            eNotify(
new ENotificationImpl(this, Notification.SET, FamilyPackage.FAMILY__FATHER, oldFather, father));
    }

对于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 FrameworkAuthor: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
posted @ 2005-12-18 13:12 Jet Geng 阅读(3947) | 评论 (4)编辑 收藏

在中国Eclipse社区中,看到了很多关于EMF的帖子。会来写了一个“Hellow world”样的东西果然很爽。想近一步学习一下。并想把学习的过程通过这个Blog记录下来。
在这里先感谢一下八进制。从他的blog中学到不少东西。

posted @ 2005-12-18 10:41 Jet Geng 阅读(703) | 评论 (0)编辑 收藏

由于开发项目要求jdk配置比较低,所以Eclipse中的WorkSpace default jre设得比较低。如果自己想测试一下高版本得jdk内容得话,就需要切换jdk得配置。

3.2中我发现了一个很有方便功能,用来完成这个功能。
选中项目中的jre,通过右键带回菜单:

jrealert1.gif
选中Configure后就会有如下的对话框:

jrealert2.gif

通过Alernate jar就可以达到为该项目设定jre了。

这样是不是很爽啊。呵呵。


posted @ 2005-12-17 10:23 Jet Geng 阅读(2114) | 评论 (6)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页