Java 重构代码以遵守OOP原则

Java 重构代码以遵守OOP原则,java,class,oop,design-patterns,Java,Class,Oop,Design Patterns,这是一个面试问题。他们给你代码,要求你批评它,并以更面向对象的方式重新安排它 public abstract class Storage{ public static Vector<IStorage> objects = /*...*/; // Create a vector IStorage empty, I do not know how public Storage(String xmlFile){ ReadFromXMLFile(xmlFil

这是一个面试问题。他们给你代码,要求你批评它,并以更面向对象的方式重新安排它

public abstract class Storage{
    public static Vector<IStorage> objects = /*...*/; // Create a vector IStorage empty, I do not know how

    public Storage(String xmlFile){
        ReadFromXMLFile(xmlFile);
        objects.addElement((IStorage)this);
    }
    protected abstract ReadFromXMLFile(String xmlFile); 

}

public interface IStorage{
    public String getAuthor();
    public String getEditor();
    public String getName();
    public boolean isBook();
    public boolean isFood();
}

// Exemple d'implémentation 
public class Novel implements IStorage extends Storage{
    private String author;
    private String editor;
    private String name;
    private boolean historical;

    public Novel(String xmlFile){
        super(xmlFile);
    }

    public String getAuthor(){return author;}
    public String getEditor(){return editor;}
    public String getName(){return name;}

    public boolean isHistorical(){return historical;}
    public void setHistorical(boolean b){historical = b;}

    public void setAuthor(String a){author = a;}
    public void setEditor(String e){editor = e;}
    public void setName(String n){name = n;}

    public boolean isBook(){return true;}
    public boolean isFood(){return false;}

    public boolean needRefrigeration(){return false;}

    private ReadFromXMLFile(String xmlFile){
        // Loads the object from an XML file
// The implementation of this method is not given
    }
}
公共抽象类存储{
公共静态向量对象=//*…*//;//创建一个向量IStorage空,我不知道如何创建
公共存储(字符串xmlFile){
ReadFromXMLFile(xmlFile);
对象。添加元素((历史)this);
}
受保护的摘要ReadFromXMLFile(字符串xmlFile);
}
公共接口历史记录{
公共字符串getAuthor();
公共字符串getEditor();
公共字符串getName();
公共布尔值isBook();
公共食品();
}
//实施范例
公共类实现了IStorage扩展存储{
私有字符串作者;
私有字符串编辑器;
私有字符串名称;
私人布尔历史;
公共小说(字符串xmlFile){
超级(xmlFile);
}
公共字符串getAuthor(){return author;}
公共字符串getEditor(){return editor;}
公共字符串getName(){return name;}
公共布尔值Ishistorial(){return historical;}
public void setHistorical(布尔值b){historical=b;}
public void setAuthor(字符串a){author=a;}
公共void集合编辑器(字符串e){editor=e;}
public void setName(字符串n){name=n;}
公共布尔值isBook(){return true;}
公共布尔值isFood(){return false;}
公共布尔值(){return false;}
私有ReadFromXMLFile(字符串xmlFile){
//从XML文件加载对象
//未给出此方法的实现
}
}
我无法检测到糟糕的OOP编程?此代码中有什么错误,我们如何更改它

谢谢

public class Novel implements IStorage extends Storage

这就是问题所在

看起来这段代码甚至无法编译

Novel扩展了存储,因为它不是抽象的,所以必须实现
ReadFromXMLFile
,但因为它是作为私有方法实现的,所以
存储
构造函数不能调用它

除此之外,
存储
的构造函数假定存储的任何子类都将实现
历史记录
,因为它将
转换为
历史记录

objects.addElement((IStorage)this);

因此,
Storage
必须实现
IStorage

我不认为这个问题是为了找出代码中的语法错误。OP将其描述为尊重OOP原则,而不是遵守Java的语法规则。抽象类中的静态向量没有问题吗?有太多错误,我不得不关闭它,因为它太宽了。我可以就这些问题直接谈5分钟。我怀疑你应该确定的问题之一是在食物和小说中使用一个通用的抽象类,在任何合理的系统中,这都是完全无关的。毕竟,你真的想得到一份食物的作者或编辑吗?静态向量也是一个问题。@Bohemian-如果不是这样的话,那就不是一个好的面试问题。@DavidWallace,但它是那么糟糕。这是一场重构盛会。@Bohemian-请告诉我设计中最严重的问题。说这个问题太难回答也无济于事。谢谢,如果它是私有的,又有什么区别呢?问题是,超类是在子类之前创建的,因此即使它是作为公共类实现的,它仍然是一个问题。
objects.addElement((IStorage)this);