【发布时间】:2013-09-28 22:27:21
【问题描述】:
在我的班级中,我们将创建一个包含多个主类和共享类的项目。在一个名为UserApp 的特定主类中,我创建了UserInterface 类的一个对象,它直接 处理一个名为Log.txt 的文件。
我在UserApp 内部创建了一个类的对象DataStorage,我用它来调用一个将字符串值返回给UserApp 的方法。然后我获取该字符串值并将其传递给UserInterface 中的一个方法,该方法将写入文件Log.txt。例如:
public class UserApp {
public static void main(String[] args) {
UserInterface ui = new UserInterface();
String[] commands = ui.readCommandLine();
while(!ui.isFileEnd()){
switch(command[0]){
case "LI": ui.displayThis(dataStorage.listById());
break;
case "QI": ui.displayThis(dataStorage.queryById(command[0]));
}
}
}
}
public class DataStorage {
public String queryById(String id) {
// Stuff the method does goes here
return stringToReturn;
}
}
对我来说,这似乎是最 OOP 的做事方式。我给她发了电子邮件,问她这是否正确。她说要在DataStorage 中的listById() 内调用ui.displayThis... 这意味着我需要在DataStorage 类中创建一个UserInterface 对象,或者将DataStorage 对象作为listById() 的参数。如果我像她说的那样做,listById() 方法不会返回字符串,而是无效的。例如:
public class UserApp {
public static void main(String[] args) {
String[] commands = ui.readCommandLine();
while(!ui.isFileEnd()){
switch(command[0]){
case "LI": dataStorage.listById(); // Here is the difference
break;
case "QI": dataStorage.queryById(command[0]); // And here
}
}
}
}
public class DataStorage {
public void queryById(String id) {
UserInterface ui = new UserInterface();
// Stuff the method does goes here
ui.displayThis(stringToDisplay);
}
}
还有更多的 switch 语句和方法,但我觉得没有必要为这个问题展示它们。我对此进行了一些研究,根据我收集到的信息,我不确定这是一种风格偏好,或者一种方式是否比另一种更好。她希望我这样做的方式对 OOP 语言来说并不合适。哪种方法实际上对于 OOP 设计是正确的?
编辑:第二部分实际上是传入一个 UserInterface 对象作为参数。这似乎比每次都创建对象更有意义。 this 会是更好的方法吗?
【问题讨论】:
-
旁注:
switch语句中的情况会失败,所以按照您编写的方式,"LI"命令将执行"LI"和"QI"操作。如果这不是您想要的,请使用break;。 -
如果我们遵循
Model-View-Controller (MVC)-原则,其中DataStorage中的Model,UserInterfaceView,和UserAppController,那么在任何情况下都不应该DataStorage调用UserInterface,甚至知道它的存在。 MVC 是一个古老的原则,我希望即使是老师也知道它。但我猜不是…… -
你导师的解决方案非常可笑。暴露所有的 GUI 内部,让它们成为数据层和 UI 层之间的 API 是非常罕见的。
-
@ajb 啊,我的错。我将添加编辑。谢谢。
-
一方面,正确地执行第二种方式需要一组稳定的 GUI 操作来处理数据。与您的方式相反,API 是一组查询操作可用数据的可能方式。根据经验,后者往往是一组更可预测(主要是样板文件)和稳定的功能集 - 你的模型变化比你的 UI 少。
标签: java class oop parameter-passing