Eclipse 任务列表(3)记号和任务列表进一步抽象
 
- UID
- 1066743
|

Eclipse 任务列表(3)记号和任务列表进一步抽象
进一步抽象XM 一直围绕这两个组件来组织:核心,独立于 Eclipse 并提供命令行界面;Eclipse 插件。要将 XM 移植到其他界面,只需要像 Messenger(请参阅 )那样抽象用户界面的接口即可。我曾经为一些项目定义了 Eclipse 之上的 servlet 用户界面。
虽然我计划进一步加强 XM 与 Eclipse 的集成,但是也想保留命令行选项。两种界面各有自己的用途。对于日常操作而言,我多数时间都在用 Eclipse 环境,但是命令行版本对于 crontab(计划工作执行的一种 UNIX 工具)非常方便。为了同时支持两种方式,我抽象了 XM 核心引擎中的资源和文件。
最初的 XM 使用的是 JDK File 对象,以后您会看到它是造成多数集成问题的根源,Eclipse 没有使用 File 对象。相反,它使用了自己的 IResource 接口。此外,经验告诉我,依靠 File 有很大的局限性。Eclipse 不是惟一没有使用文件的软件包,SAX 使用 InputSource,而 JAXP 使用 Source。
如果代码需要和几种不同的库进行交互该怎么办?可以使用代理模式(请参阅 )来抽象各个库。在代理模式中,由一个(或多个)对象为底层的库提供通用的接口。可以实例化该对象,把请求转发给任何一个库。采用这种模式的好处是,调用代码时无需担心代理要转发的库。
XM 引入 Filename 接口来抽象文件或资源的概念。 Filename 已经在 Eclipse IResource(为了在 Eclipse 内使用)和 JDK File 对象(为了在命令行中使用)上得以实现。清单 3 是 Filename 的声明。Eclipse 专用版提供了源代码(请参阅 )。
清单 3. 文件和资源的抽象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| package org.ananas.xm.core;
import java.io.File;
import org.xml.sax.InputSource;
import org.ananas.xm.core.XMException;
public interface Filename
extends CoreConstants
{
public boolean isRoot()
throws XMException;
public boolean isFile();
public boolean isFolder()
throws XMException;
public boolean exists()
throws XMException;
public String getName()
throws XMException;
public String getShortName()
throws XMException;
public String getSuffix()
throws XMException;
public String getProjectPath()
throws XMException;
public Filename getParent()
throws XMException;
public Filename[] getChildren()
throws XMException;
public void setPersistentMetadata(String key,String value)
throws XMException;
public void setPersistentMetadata(String key,String[] values)
throws XMException;
public void setTransientMetadata(String key,Object value)
throws XMException;
public Object getMetadata(String key)
throws XMException;
public String getMetadataAsString(String key)
throws XMException, ClassCastException;
public String[] getMetadataAsArray(String key)
throws XMException, ClassCastException;
public File asFile()
throws XMException;
public InputSource asInputSource()
throws XMException;
public Object asPlatformSpecific()
throws XMException;
public boolean hasSamePath(Filename document)
throws XMException;
public boolean isDescendantOf(Filename document)
throws XMException;
public boolean remove()
throws XMException;
}
|
XM 核心中的所有类(如 Messenger)都使用 Filename 进行了改写。 |
|
|
|
|
|