用于从字符串创建对象的正确 OOP 方法



我正在读取一些文本文件来创建对象。哪个类应该根据 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 类,它能够完成所有工作来处理进出StringDate

我投票支持选项1。

Schedule应该知道如何从String或HTML页面创建自己。这些逻辑都不应该在drawSchedule,正如人们可能猜到的那样,他的工作应该只是画一个Schedule。您希望将构建Schedule的关注点与绘制它分开。

由于这不会太难做到,你不妨这样做。但要小心,不要太快地变得太优雅。正如鲍勃·马丁(Bob Martin)在《敏捷软件开发、原则、模式和实践》(Agile Software Development, Principles, Patterns, and Practices)中建议的那样,"拿起第一颗子弹",内森·马兹(Nathan Marz)建议"以痛苦为导向的编程",不要那么快就变得尽可能"漂亮"。让一切首先工作;然后,只有当不这样做的痛苦使它值得时,才重构为更优雅的方法。

最新更新