2013-01-17 31 views
1

我正在编写一个eclipse插件,我想在其中为JDT包资源管理器提供一个操作。为了执行该动作,必须选择两个不同的文件。因此,我在该操作的命令处理程序中检索JDT包资源管理器的活动选择。这是我的问题所在。如何干净地处理日食中的结构化选择?

目前从IStructuredSelection中提取选定文件的代码涉及多个局部变量,其中包含多个if语句,并且在大约30行代码中有多个返回值。当然这段代码看起来至少有点难看。

我应该使用什么概念和/或模式来使代码更清洁?

eclipse平台recommends使用adapter pattern。所以,我想创建这样一个POJO的:

public class FooCommandArgs { 

    private IFile xmlFile; 
    private IFile csvFile; 

    //getters and setters here ... 

} 

IStructuredSelection为它创造了必要的适配器。但是,这样做只会将丑陋的代码移到其他地方。

回答

0

因此,如字段名称所示,我想从IStructuredSelection中提取的每个项目都必须满足一些条件。我的想法是为此使用bean验证api。然后,POJO是这样的:

public class FooCommandArgs { 

    @NotNull 
    @FileExtension("xml") 
    @Content(type=ContentType.XML, value="http://my.schema.location/schema.xsd") 
    private IFile xmlFile; 

    @NotNull 
    @FileExtension("csv") 
    private IFile csvFile; 

    //getters and setters here ... 

} 

Bean验证API的Validator接口提供的方法<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)我可以用了点。我只需要反思java bean的属性,然后针对IStructuredSelection item和pojo属性的每个组合调用该方法。如果结果是每个项目都可以被分配给没有约束违反的bean属性,那么我就可以继续处理实际的命令。歧义可能也可以处理。

编辑:
我已经实施了这个建议,它工作得很好。使用这种技术,还可以非常容易地以编程方式向用户解释为什么某个命令未启用或无法执行。

在这一点上,我不想忘记提及JCommander,这是这个想法的灵感。

相关问题