我正在编写一个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 :(得分:0)
因此,正如字段名称所示,我想从IStructuredSelection
中提取的每个项目都必须满足某些条件。我的想法是使用 bean validation 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
项和pojo属性的每个组合调用该方法。如果结果是每个项目都可以分配给没有约束违规的bean属性,那么我可以继续处理实际的命令。也可以处理歧义。
修改强>
我已经实现了这个建议,它的效果非常好。使用这种技术,还可以非常容易地以编程方式向用户解释为什么某个命令未启用或无法执行。
我现在不想忘记提及JCommander,这是这个想法的灵感来源。