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

时间:2014-01-04 01:24:15

标签: java android 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();
    }
}

2 个答案:

答案 0 :(得分:2)

老实说,这两种方法都是有效的,它将在很大程度上取决于数据的性质以及对象的使用方式。事实上,将这个问题标记为主要是以意见为基础几乎是诱人的!

如果解析非常特定于这些文本文件,并且如果Schedule正在其他许多地方使用,那么解析代码最好不要分开。

另一方面,如果解析在几个地方有用,那么将它放在Schedule中是有意义的。想想不要重复自己和封装。您希望代码在任何有用的地方都可见,而不是在其他地方可见,并且您只想让代码一次。

Java库中的示例包括Date类,它有一些通用构造函数,但是有DateFormat类能够完成处理{{1}的所有工作来自Date

答案 1 :(得分:1)

我投票支持选项1。

Schedule应该知道如何从String或HTML页面创建自己。这些逻辑都不应该在drawSchedule中,正如人们可能猜测的那样,它的工作应该是绘制Schedule。您希望将构建Schedule的问题与绘制它分开。

由于这不会太难,你也可以这样做。但是要小心过早地过于优雅。正如鲍勃·马丁在Agile Software Development, Principles, Patterns, and Practices中建议“夺取第一颗子弹”而内森·马兹建议用“suffering-oriented programming”,尽量不要那么“快”。让一切顺利;然后重构一个更优雅的方法,只有当不这样做的痛苦使它值得。