我正在读取一些文本文件来创建对象。哪个类应该根据 OOP 原则处理文本文件?
我有一个 GUI 对象,其中包含绘制表格并用数据填充它的方法。此数据可以从 HTML 页面解析,也可以从缓存的文本文件中读取。我可以想到两种方法来解决这个问题,我想知道哪一种更好。
选项 1:
public void drawSchedule()
{
try
{
if (CacheManager.hasData("schedule")) //this is not the complete logic, but enough for this post
{
String cacheString = CacheManager.readData(this, "schedule");
Schedule schedule = new Schedule(cacheString);
}
else
{
//read data from HTML page
}
catch (IOException e)
{
//generic error handling
e.printStackTrace();
}
}
选项 2:
public void drawSchedule()
{
try
{
if (CacheManager.hasData("schedule")) //this is not the complete logic, but enough for this post
{
String cacheString = CacheManager.readData(this, "schedule");
//parse data here so we end up with a bunch of variables
//courseList would be an ArrayList of Courses, if it makes any difference
Schedule schedule = new Schedule(firstDay, courseList);
}
else
{
//Read data from HTML page
}
catch (IOException e)
{
//generic error handling
e.printStackTrace();
}
}
老实说,这两种方法都是有效的,这将在很大程度上取决于数据的性质以及对象的使用方式。事实上,将问题标记为主要基于意见几乎是很诱人的!
如果解析非常特定于这些文本文件,并且如果Schedule
在许多其他地方使用,那么解析代码可能最好分开。
另一方面,如果该解析在多个地方有用,那么将其放在Schedule
中是有意义的。想想不要重复自己和封装。您希望代码在有用的任何地方都可见,但在其他任何地方都看不到,并且您只想拥有一次代码。
Java 库中的示例包括 Date
类之类的东西,它有一些泛型构造函数,但还有一个 DateFormat
类,它能够完成所有工作来处理进出String
的Date
。
我投票支持选项1。
Schedule
应该知道如何从String
或HTML页面创建自己。这些逻辑都不应该在drawSchedule
,正如人们可能猜到的那样,他的工作应该只是画一个Schedule
。您希望将构建Schedule
的关注点与绘制它分开。
由于这不会太难做到,你不妨这样做。但要小心,不要太快地变得太优雅。正如鲍勃·马丁(Bob Martin)在《敏捷软件开发、原则、模式和实践》(Agile Software Development, Principles, Patterns, and Practices)中建议的那样,"拿起第一颗子弹",内森·马兹(Nathan Marz)建议"以痛苦为导向的编程",不要那么快就变得尽可能"漂亮"。让一切首先工作;然后,只有当不这样做的痛苦使它值得时,才重构为更优雅的方法。