Java 使用模式重构
我在模式和应用程序架构方面没有太多的实践。简言之,我必须找到对象所具有的某些属性。一些代码可以更好地描述任务:Java 使用模式重构,java,design-patterns,refactoring,Java,Design Patterns,Refactoring,我在模式和应用程序架构方面没有太多的实践。简言之,我必须找到对象所具有的某些属性。一些代码可以更好地描述任务: IAttribute { IAttribute analyze(IFunction func); } //up to 10 different attributes ArgumentsAttribute implements Attribute { Map<String, ArgType> args = new HashMap<>(); IAttr
IAttribute {
IAttribute analyze(IFunction func);
}
//up to 10 different attributes
ArgumentsAttribute implements Attribute {
Map<String, ArgType> args = new HashMap<>();
IAttribute analyze(IFunction func) {
for (Argument arg : func.getArgs()) {
args.put(arg.getName(), arg.getType());
}
if (!args.isEmpty()) return this;
return null;
}
}
ReturnAttribute implements Attribute {
IAttribute analyze(IFunction func) {
if (func.hasReturn) return this;
return null;
}
}
AttributeAnalyzer {
List<Attributes> analyzeAttributes(IFunction func) {
List<IAttribute> attributes = new ArrayList<IAttribute>();
attributes.add(new ArgumentAttribute());
attributes.add(new ReturnAttribute());
...
for (IAttribute attr : attributes) {
attr = attr.analyze(func);
if (null == attr) attributes.remove(attr);
}
return attributes;
}
}
IAttribute{
i属性分析(IFunction func);
}
//最多10种不同的属性
ArgumentsAttribute实现属性{
Map args=new HashMap();
IAttribute分析(IFunction func){
for(参数arg:func.getArgs()){
put(arg.getName(),arg.getType());
}
如果(!args.isEmpty())返回此值;
返回null;
}
}
ReturnAttribute实现属性{
IAttribute分析(IFunction func){
如果(func.hasReturn)返回此项;
返回null;
}
}
属性分析器{
列表分析属性(IFunction func){
列表属性=新的ArrayList();
添加(新的ArgumentAttribute());
add(newreturnAttribute());
...
for(IAttribute属性:属性){
属性=属性分析(func);
if(null==attr)attributes.remove(attr);
}
返回属性;
}
}
然而,这个实现似乎有点奇怪。我不喜欢属性是一种持有者,但它必须实现方法才能找到自己。在我看来,最佳实践是一个重载静态方法的机会,但显然这是不可能的。这样,我们就可以在不添加新抽象的情况下将holder从分析逻辑中分离出来(也许我不对)
IAttribute{
静态属性分析();
}
具体属性1{
int x=0;
静态属性分析(){
...
如果(x!=0)返回新的ConcreteAttribute1();
返回null;
}
}
具体属性2{
字符串s=“”;
静态属性分析(){
...
如果(!s.equals(“”)返回新的ConcreteAttribute2();
返回null;
}
}
属性分析器{
列表分析属性(){
列表属性=新的ArrayList();
attributes.add(ConcreteAttribute1.analyze());
add(ConcreteAttribute2.analyze());
...
for(IAttribute属性:属性){
if(null==attr)attributes.remove(attr);
}
返回属性;
}
}
此外,我必须过滤被破坏的属性。那么,有没有重构的方法可以让代码看起来更好呢?如果您对每个具体属性都有一个独特的
analyze
函数,并且几乎没有重叠,那么您的初始代码示例可能不会那么糟糕。但是,我会将该方法的签名更改为boolean analyze()
如果分析属性的方式有更多的重叠,那么你可以考虑一个方法<代码>布尔分析(IActudio)<代码> >在你的代码>属性分析器< /代码>类中(或者在一个专用的类中)。
每个代码,甚至<代码>具体属性1>代码>和<代码>具体属性2>代码>类是冗余的。您需要提到如何将属性应用于对象。另外,AttributeAnalyzer
看起来不像是在为给定属性做任何真实的事情或评估任何对象?@NikhilVartak好吧,有些属性仅用作指标(即对象是否具有此类属性),其他属性可能包含多个贴图或列表。然后,对象及其属性列表将放置在地图中并保存到数据库中。最后,OtherAnalyzer使用对象及其属性,并为每个属性进行对象的转换(不更改其属性)。在我的特殊情况下,对象是一个函数,属性是一些属性(如参数的数量或返回值的类型),因此“AttributeAnalyzer”接受一个参数(函数)并遍历它。请添加示例输入和预期输出。您可以从上面删除不相关的代码。@NikhilVartak我对代码进行了更详细的说明,希望能有所帮助。@Fildor这是我的错误,已修复
IAttribute {
static IAttribute analyze();
}
ConcreteAttribute1 {
int x = 0;
static IAttribute analyze() {
...
if (x != 0) return new ConcreteAttribute1();
return null;
}
}
ConcreteAttribute2 {
String s = "";
static IAttribute analyze() {
...
if (!s.equals("")) return new ConcreteAttribute2();
return null;
}
}
AttributeAnalyzer {
List<Attributes> analyzeAttributes() {
List<IAttribute> attributes = new ArrayList<IAttribute>();
attributes.add(ConcreteAttribute1.analyze());
attributes.add(ConcreteAttribute2.analyze());
...
for (IAttribute attr : attributes) {
if (null == attr) attributes.remove(attr);
}
return attributes;
}