Andrew's Blog

Make things as simple as possible, but no simpler -- Albert Einstein
posts - 6, comments - 4, trackbacks - 0, articles - 5

2005年8月22日

由于Eclipse GEF的EDiagram示例始终没有正式发布,需要从CVS中将模块org.eclipse.gef.examples.ediagram导出到Workspace中方可使用。Eclipse从3.1开始增加了package一级的访问权限控制功能,一般情况下不再允许客户访问plugin中的internal包;但是EDiagram中却用到了若干internal包中的类,因此会出现9个warnings(在Eclipse 3.1中),如下图所示:


如果对这些warnings不予理会,有可能在运行时出现异常,所以必须想办法将它们排除掉。办法之一(还有更好的方法吗?)就是代码拷贝,具体步骤是:


1、GEFMessages:
. 将文件ECLIPSE_HOME/plugins/org.eclipse.gef.source_3.1.0/src/
org.eclipse.gef_3.1.0/src.zip/org/eclipse/gef/internal/GEFMessages.java
拷贝到org.eclipse.gef.examples.ediagram.editor包中。
. 删除EDiagramEditor.java文件中的import org.eclipse.gef.internal.GEFMessages;
(解决2个warnings)

2、StringMatcher:
. 将文件ECLIPSE_HOME/plugins/org.eclipse.platform.source_3.1.0/src/
org.eclipse.ui.ide_3.1.0/src.zip/org/eclipse/ui/internal/ide/StringMatcher.java
拷贝到org.eclipse.gef.examples.ediagram.model.properties包中。
. 删除ENamedElementListSelectionDialog.java文件中的import
org.eclipse.ui.internal.ide.StringMatcher;
(解决4个warnings)

3、ResourceAndContainerGroup:
. 将文件ECLIPSE_HOME/plugins/org.eclipse.platform.source_3.1.0/src/
org.eclipse.ui.ide_3.1.0/src.zip/org/eclipse/ui/internal/ide/misc/
ResourceAndContainerGroup.java,与同一目录下的文件
ContainerContentProvider.java和ContainerSelectionGroup.java;
以及父目录中的文件IDEWorkbenchMessages.java一并拷贝到org.eclipse.gef.examples.ediagram.wizard包中。
. 删除相应文件中的import语句。
(解决3个warnings) 

posted @ 2005-08-22 23:10 andrew 阅读(313) 评论(0) 编辑

2005年8月21日

Eclipse中一些图例的说明

eclipse_icons.PNG

posted @ 2005-08-21 15:03 andrew 阅读(204) 评论(0) 编辑

2005年8月6日

以下是UML程序的一个列表

免费/开源程序

  • ArgoUML - 一个功能非常完整的基于Java的UML开发工具。
  • Dia - 一个基于GTK/GNOME的图形绘制工具,同时支持UML。 
  • Eclipse建模框架 (Eclipse Modeling Framework)  
  • FUJABA - UML和Java开发平台;同时提供Eclipse插件。(逆向工程做得不错) 
  • Gaphor - C/GTK/GNOME UML编辑工具。支持导出到SVG 
  • MonoUML - 一个前沿的非常活跃基于最新的Mono的工程,Gtk#和ExpertCoder 
  • Umbrello - UML Modeller KDE的一部分 
  • UMlet - 使用Java 
  • UMLpad 
  • UniMod - 可执行的UML对于Eclipse 
  • Violet

商业程序

  • Altova UModel 2005 - 一个简单,cost effective way to draw on UML
  • Borland Together
  • Cadifra UML Editor - 一个轻量级的UML图形工具,用在Windows系统上
  • DotNet2UML
  • Enterprise Architect
  • Jude
  • Jumli - 使用Java编写
  • MagicDraw UML - 一个可视化的UML建模和CASE工具。
  • Microsoft Visio - 一个图形绘制工具,同时支持UML
  • Objecteering/UML
  • OmniGraffle - 使用在Mac OS X系统上
  • Omondo UML - 作为Eclipse的一个插件
  • Poseidon for UML - ArgoUML的商业化版本。
  • Rhapsody - 针对实时的,嵌入式应用。
  • Rational Rose
  • System Architect
  • Unimodeler
  • Visual Paradigm

posted @ 2005-08-06 16:33 andrew 阅读(415) 评论(0) 编辑

2005年6月23日

非常高兴,今天利用Google Scholar找到了16篇论文关于Design Pattern Recovery方面的论文;相信这些论文可以囊括该方向的历史沿革与研究热点。一定会潜心研读一番,为结合UML和Eclipse(EMF,UML2)进行Design Pattern Recovery的研究和I论文的撰写做好充分地准备工作。任重而道远啊!

posted @ 2005-06-23 23:53 andrew 阅读(349) 评论(0) 编辑

2005年1月24日

如何在编译时刻判断两个类型是否可以自动转换?
——《Modern C++ Design》读书笔记(1)

设T和U是任意的两个类型,用什么方法判定类型T可以自动转换到类型U呢?

答案是:借助sizeof运算符。

其实,sizeof的实力相当强大。不论是什么类型,也不论是多么复杂的
表达式,只要把它交给sizeof,结果都将返回该表达式的值的类型长度。
也就是说,sizeof的背后必须暗藏一整套推导机制,它可以推导出表达式
值的类型。最终,sizeof并不关心整个表达式,而只是返回结果的长度。

我们的基本思想是,使用sizeof和函数重载机制。

声明两个重载函数,一个函数的形参接受可以转换为U的类型;另一个函数的
形参接受任何其他类型。使用类型T的临时变量来调用重载函数。如果接受U的函数
被调用,则可断定T是能够转换为U的。如果接受任何其他类型作参数的函数被调用
,那么T不能转换为U。

为了判断到底哪一个函数被调用,我们要让两个函数的返回类型具有不同的大小,
然后用sizeof来检查它们。只要能区分出来大小,类型本身是什么倒无关紧要。

首先,建立两个大小不同的类型:

typedef char Small;
class Big { char dummy[2]; };

根据C++标准规定sizeof(char)等于1,于是sizeof(Small)等于1。Big的大小我们
不知道,但是它肯定比1要大。

然后,声明一个函数,它接受U作为参数类型,并返回Small:

Small Test(U);

再声明一个重载函数版本,它必须在不能进行自动类型转换的情况下才被系统调用,
这就需要使用到省略号参数了:

Big Test(...);

下面对Test函数调用应用sizeof运算符:

bool const convExists = sizeof(Test(T())) == sizeof(Small);

对了,就是它!这里T()表示调用T的缺省构造函数建立一个临时变量,sizeof会从
这个表达式中抽取出它的值的长度。长度只能是两个值:sizeof(Small)或sizeof(Big)
中的一个。这取决于那个版本的重载函数会被调用,而事实是只有在T可以自动转换
为U的情况下Small Test(U)函数才会调用,从而convExists==true。

有一个问题:如果T不存在缺省构造函数,那么上述表达式在求值过程中岂不会出现
编译错误?该如何解决呢?可以巧妙的使用如下函数:

T MakeT();  // 没有实现定义
bool const convExists = sizeof(Test(MakeT())) == sizeof(Small);

为什么这种方案可行呢?关键在于sizeof的神奇特性:因为sizeof在推导类型长度的
过程中,并不实际求取任何表达式的值,没有表达式会被真正地计算出来。

好了,一切就绪。现在我们可以将上述方法用一个类模版封装起来,它将封装所有
的类型推导,而仅提供结果数据:

template<class T, class U>
class Conversion
{
    type char Small;
    class Big { char dummy[2]; };
    static Small Test(U);
    static Big Test(...);
    static T MakeT();
public:
    enum { exists =
           sizeof(Test(MakeT())) == sizeof(Small) };
};

下面编写主函数来测试Conversion类:

int main()
{
    using namespace std;
    cout << Conversion<double, int>::exists << ' '
         << Conversion<char, char*>::exists << ' '
         << Conversion<size_t, vector<int> >::exists << endl;
}

该程序输出结果:

1 0 0

说明:虽然std::vector存在一个接受size_t作为参数的构造函数,但是由于
该构造函数被声明为了explicit,因此不能从size_t自动转换为std::vector.

另外,我们还可以在Conversion中实现一个常量sameType,以判断T和U是否
具有相同的类型:

template<class T, class U>  // 主模板
class Conversion
{
    type char Small;
    class Big { char dummy[2]; };
    static Small Test(U);
    static Big Test(...);
    static T MakeT();
public:
    enum { exists =
           sizeof(Test(MakeT())) == sizeof(Small) };
    enum { sameType = false };
};

template<class T>   // 部分特化模板
class Conversion<T, T>
{
public:
    enum { exists = true, sameType = true };
}

当T和U的类型一样时,部分特化模板会被优先实例化,因此exists和sameType都为true。

借助于Conversion模板类,我们很容易判断T和U是否存在继承关系,具体如何进行,还是
等到下次再说吧……

posted @ 2005-01-24 23:56 andrew 阅读(670) 评论(0) 编辑

2004年12月17日

posted @ 2004-12-17 09:27 andrew 阅读(686) 评论(0) 编辑