2013-07-26 32 views
1

这是一个更普遍的问题。它可能是愚蠢的,但因为我经常有这个困境 - 决定问。有什么更好的做法?检索对象或object.id?

我有一个函数(在Rails,如果它很重要),我想知道哪种方法是最好的做法,编写大型应用程序时更常见。

def retrieve_object(id_of_someobject) 
    # Gets class object ID (integer) 
    OtherObject.where('object_id = ?', id_of_someobject) 
end 

这里例如它接收12 id_of_someobject

OR

def retrieve_object(someobject) 
    # Gets class object 
    OtherObject.where('object_id = ?', someobject.id) 
end 

在这里它得到类对象,并通过触发对象属性的 'id' 获得其ID。

+1

个人而言,我将对象本身发送给函数。我通常觉得这是一个不太麻烦的方法,如果你需要改变函数并需要访问其他对象变量(而不仅仅是id)的话。性能方面,我相信这两种选择都是相同的,所以我想可以归结为个人偏好。 –

回答

1

在这种情况下,我更喜欢第二种方法。它们可能在功能上是等价的,但是如果发生错误(例如调用nil.id),则在函数内处理它更有意义,以便在发生故障时更易于调试。

对于第一种方法,传入nil不会导致错误,而是会返回一个空数组。所以可能很难知道为什么你的结果不符合你的预期。第二种方法会抛出一个标志,并告诉你该错误的确切位置。如果你想通过返回一个空数组来处理这种情况,你可以明确地这样做。

正如迈克尔所说,传递整个对象也使您可以灵活地在路上执行其他操作,如果您愿意的话。我没有看到评估id然后将它传递给方法的好处,除非您已经拥有该ID而无需实例化对象。 (对于第一个选项,这将是一个引人注目的用例)

0

支持两者。这只是一条线,这种方式你不必记住或关心。

def retrieve_object(id_or_someobject) 
    id = id_or_someobject.is_a?(SomeObject) ? id_or_someobject.id : id_or_someobject 
    OtherObject.where('object_id = ?', id) 
end 
+0

这种违反公约的情况下,通过配置参数......在较大的团队中或者为了加快周转速度,可以强制自己和其他人以某种方式做到这一点。如果在每次查找之前必须检查课程,看起来似乎没有必要。 – tyler

+0

@tyler非常真实,但我假设你在其他地方找到一个或另一个,并且必须在那里检查。这只是代表检查。如果你必须选择,我会选择ID。这样你可以在不首先加载someobject的情况下执行retrieve_object(thirdobject.someobject_id)。 –

相关问题