获取数据的方法名称


103

警告:这是我发布的不是很严重的问题/讨论,但是我敢打赌大多数开发人员都在考虑这个“问题” ...

一直想就方法的命名约定获取其他意见,这些方法从某处获取数据并返回该数据...

大多数方法名称有些简单明了... SaveEmployee(),DeleteOrder(),UploadDocument()。当然,对于类,您最有可能分别使用简短形式... Save(),Delete()和Upload()。

但是,我一直在努力采取初步措施……如何获取数据。似乎对于每个项目,我最终都会在不同的命名约定之间跳来跳去,因为我对上一个使用的项目从来都不满意。据我所知,这些可能性->

  • GetBooks()
  • FetchBooks()
  • RetrieveBooks()
  • FindBooks()
  • LoadBooks()

你在想什么

Answers:


126

这都是关于一致的语义 ;

在问题标题中,您使用获取数据。从某种意义上说,这是非常普遍的,您需要定义获取在语义上非常明确的方式。我提供以下示例,希望您在考虑事物命名时走上正确的道路。

  1. getBooks() 就是当您获得与某个对象相关联的所有书籍时,这意味着该集合的条件已经定义,并且它们来自何处是一个隐藏的细节。
  2. findBooks(criteria) 是在尝试根据方法调用的参数查找书籍的子集时,通常会因不同的搜索条件而超载
  3. loadBooks(source) 从外部源(例如文件或数据库)加载时。
  4. 我不会用取/检索,因为他们太含糊,把事情混为一谈GET并有与术语相关丝毫不含糊语义。

示例: fetch表示某些实体需要去获取遥远的东西并将其带回。狗拿一根棍子,而检索则是fetch的同义词,具有您以前可能也拥有的东西的附加语义。GET是一个代名词获得,以及这意味着你有什么独有并没有其他人可以同时获得它。

语义非常重要:

与意义有关的语言学和逻辑学分支

这些评论证明,诸如getfetch之类的通用术语没有特定的语义,并且由不同的人以不同的方式解释。选择一个术语的语义,如果语义不清晰并且与它的用法一致,则记录该词的含义。

含糊不清或含糊不清含义的单词因其基于个人见解的偏见和偏见而被不同的人赋予不同的语义,并且永远都不会结束。


4
我要补充一点,如果要从数据库中检索数据,我将使用fetch / retrieve
Liz Albin 2010年

1
嗯 您能否区分通配符标准和特定标准。例如,从特定出版商处查找书籍时,是否会使用FindBooks(publisher)?还是GetBooksFromPublisher(publisher)?
杰森

5
如果Publisher是Publisher的特定实例,则publisher.getBooks()将是首选方法。Library.getBooks(publisher),其中发布者实现了BookSearchCriteria接口。与Library.getBooks(author)相同,其中author实现了BookSearchCriteria接口。从逻辑

3
感谢您的回答。绝对会增加一些清晰度。本质上,您说的是通过特定过滤器进行检索的方法应随对象一起使用。接口将以何种方式使用?例如,BookSearchCriteria接口。您可以提供一些示例代码吗?
杰森

2
通常,命名就像fetch当数据访问时间短时一样,即在同一设备上,从本地数据库,从内存访问。load,或者download如果访问时间是较高的,从互联网,外部数据库,从文件
亚诺什

13

老实说,您应该与您的团队决定使用哪种命名约定。但是为了好玩,让我们来看看您对以下任何一项做出决定的思路:

  • GetBooks()

此方法属于数据源,我们不在乎它如何获取它们,我们只想从数据源中获取它们。

  • FetchBooks()

您像对待猎犬一样对待数据源,而取书是他的工作。我猜您应该自己决定他一次可以容纳多少个嘴。

  • FindBooks()

您的数据源是图书馆员,将使用Dewey Decimal系统查找书籍。

  • LoadBooks()

这些书属于某种“电子书包”,必须装入其中。确保加载后调用ZipClosed(),以防止丢失它们。

  • RetrieveBooks()

我一无所有。


1
接受的答案并不能很好地区分“获取”和“获取”以及该答案。Fetch表示它必须由其他人来完成,因为这将花费一些时间或需要一定的专业知识才能完成,而Fetch则表示它是即时且逐字可用的或“现成的”。
Sridhar Sarnobat

我今天也难以接受公认的答案。对于我的项目(基于React / Redux),我认为区分从Redux存储中提取的数据与应用程序的数据库与第三方API的区别非常重要。正确执行此操作无疑将有助于将来的可读性。用于add写入数据库和写入商店的原始开发人员。现在,我试图将它们分开,这很痛苦。
tim.rohrer,

9

答案就是坚持自己喜欢的东西并保持一致。

如果您有一个贵族和贵族网站,并且使用GetBooks(),那么如果您有另一个项目(例如Movie实体),请使用GetMovies()。因此,无论您和您的团队喜欢什么,并保持一致。


22
至少在一致拼写错误方面您是一致的。;-)
Wim Hollebrandse 2010年

1
非常一致,一致... :)
JonH 2010年

完全没有冒犯...谢谢您指出。
杰森

2

在OO(C ++ / Java)中,我倾向于使用getSomething和setSomething,因为我经常(如果不是总是)从代表该数据对象的类中获取一个私有属性,或者对其进行设置-getter / setter对。另外,Eclipse会为您生成它们。

我倾向于仅在我指的是文件时才使用加载-就像在“加载到内存”中一样,这通常意味着加载到基元,结构(C)或对象中。我将发送/接收用于网络。

如上所述,一致性就是一切,其中包括跨开发人员。


1

您对“获取数据”的含义还不清楚。从数据库?一份文件?记忆?

我对方法命名的看法是,它的作用是消除任何歧义,理想情况下是查找文档的需求。我相信即使以更长的方法名称为代价也应该这样做。根据研究,大多数中级以上的开发人员都可以在驼峰情况下阅读多个单词。使用IDE和自动完成功能,编写长方法名称也不是问题。

因此,当我看到“ fetchBooks”时,除非上下文非常清楚(例如,名为BookFetcherFromDatabase的类),否则它是模棱两可的。从哪里获取?提取和查找之间有什么区别?您还冒着一些开发人员将语义与某些关键字关联的问题的风险。例如,获取数据库(或内存)与负载(从文件)或下载(从Web)相比。

我宁愿看到类似“ fetchBooksFromDatabase”,“ loadBookFromFile”,“ findBooksInCollection”之类的东西。它虽然不那么引人注目,但是一旦您超过了长度,就很清楚了。每个阅读此书的人都将立即获得您正在尝试做的事情。


4
fetchBooksFromDatabase的问题在于,当您想分解/概括和获取fetchBooks时,可能是从XML中提取了一些数据。我也喜欢细节,但是您会发现自己在不同的函数名称之间分离了相同的功能。那先生不酷!
JonH 2010年

我认为“获取”与“查找”之间的差异往往很明显,但我想知道有关“获取”与“获取”的问题。地狱..有区别吗?
杰森

@JonH:我对此表示同意。但是,如果您事先知道将具有不同类型的访存,则可以在类命名中对其进行编码(以便可以从上下文中解释含义,例如DatabaseConnector与XmlConnector)。
乌里(Uri)2010年

7
@Jason:因为“获取器”无处不在(并且是JavaBeans之类的框架的一部分),所以许多程序员倾向于将它们视为访问数据字段的几乎透明的方式。另一方面,“访存”向某些程序员指示更长的访问时间,其中涉及到处传输数据(a-la CPU访存)或数据库访存。例如,Hibernate的查询语言具有Fetch构造。开发人员经常使用基于名称期望的方法,而不是阅读文档,因此避免发送错误的信号至关重要。
乌里(Uri)2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.