getOrCreate函数是一个好的还是坏的做法?

时间:2014-06-03 08:04:53

标签: java architecture

在我的代码(假设)中我想使用getOrCreate函数。我传递参数,我得到一个新实体,或者我从数据库中获得一个现有实体,如果这样的实体存在。

从一个角度来看,这是一种错误的方法,因为功能不应该做多于一件事。但从另一个角度来看,这是一个单一的操作,只是没有一个正确的英文单词,我可以减少代码中的一些重复。

那么使用这种方法是好的还是坏的做法?为什么?

3 个答案:

答案 0 :(得分:3)

这取决于很多因素。例如,您可能会为某些表保留本地缓存。现在,如果你在该表上调用getOrCreate(someValue),那么你将不得不知道你是创建它还是只是检索它。因为您可能需要刷新并重新加载缓存(通过进行另一次读取操作)。

您可能有其他依赖项,可能会在以后导致重大问题。

虽然我没有完全说这是一种不好的做法,但我认为最好分开你的担忧。

你可以做类似的事情 -

if(searchForRecord()==null)
 {
  addRecord();
 }

此方法的优点:您将始终了解系统的状态和行为(正在发生的事情)。

Singleton模式是完全不同的东西。你总是得到ONLY ONE OBJECT。该对象的创建在内部处理,并且对Singleton类是私有的。 You DONT need to know whether you get a new object or the old one because it doesn't matter to you

答案 1 :(得分:3)

这是一个获取功能。你得到了一个类的实例。

对于外界来说,get函数如何在内部工作并不重要。

    public Object getObject(int key) {
        Object object = getObjectFromDatabase(key);
        if (object == null) {
            object = createObject(key);
            writeObjectToDataBase(key, object);
        }
        return object;
    }

每个方法都有一个功能。

编辑补充:有些人从内到外看待方法。这就是在编写方法代码时需要做的事情。我认识到我的getObject方法必须做几件事来真正获得一个Object。

但是,当你命名方法时,你会从外面看一个方法。这就是我的getObject方法“获取一个Object”(非常简短的Javadoc描述)的原因。如果你不能写一个描述你方法功能的简单陈述句,你的方法可能太复杂了。

答案 2 :(得分:0)

从函数式编程的角度来看,create具有副作用,而get没有副作用。函数名称应告诉人们此函数是否包含副作用,而无需查看函数主体。因此,getOrCreate在副作用方面是模棱两可的。我认为这不是一个好习惯。

此外,我在代码中发现了许多getOrCreate(user),似乎有超过99%的时间有用户可以找到。在这种情况下,一种更好的方法是我们检查用户是否存在,如果不存在,则应引发异常。