获取数据的方法名称[关闭]
Posted
技术标签:
【中文标题】获取数据的方法名称[关闭]【英文标题】:Method names for getting data [closed] 【发布时间】:2011-01-09 15:41:20 【问题描述】:警告:这是我发布的一个不太严重的问题/讨论......但我敢打赌,大多数开发人员已经考虑过这个“问题”......
一直想就从某处获取数据并返回数据的方法的命名约定获得其他意见...
大多数方法名称都有些简单明了... SaveEmployee()、DeleteOrder()、UploadDocument()。当然,对于类,您很可能会分别使用缩写形式...Save()、Delete()、Upload()。
但是,我一直在为最初的行动而苦恼……如何获取数据。似乎对于每个项目,我最终都会在不同的命名约定之间跳跃,因为我对我使用的最后一个命名约定并不满意。据我所知,这些是可能性-->
GetBooks() FetchBooks() RetrieveBooks() FindBooks() LoadBooks()你的想法是什么?
【问题讨论】:
【参考方案1】:一切都是为了一致的semantics;
在您的问题标题中,您使用获取数据。这是极 一般在某种意义上,您需要定义 getting 的含义 语义上显着明确的方式。我提供以下 希望在思考时让您走上正轨的示例 命名事物。
getBooks()
是当你得到
与一个相关的所有书籍
对象,它意味着集合的标准是
已经定义,它们来自哪里是一个隐藏的细节。
findBooks(criteria)
是什么时候试图找到一个子集
基于参数的书籍
方法调用,这通常会
因不同的搜索而超载
标准
loadBooks(source)
是你的时候
从外部源加载,
像文件或数据库。
我不会使用
fetch/retrieve,因为它们太模糊,与 get 混为一谈,并且没有与术语相关的明确语义。
示例: fetch 暗示某个实体需要去获取远程的东西并将其带回来。狗会拿一根棍子,retrieve 是 fetch 的同义词,带有附加的语义,即您可能之前也拥有过这东西。 get 也是 obtain 的同义词,这意味着您拥有某物的独占权,并且没有其他人可以同时获得它。
Semantics 非常重要:
与意义有关的语言学和逻辑学分支
cmets 证明了像 get 和 fetch 这样的通用术语具有 没有特定的语义并且被不同的解释不同 人们。为一个术语选择一个语义,记录它的意图 暗示如果语义不明确并且与其使用一致。
含义模糊或模棱两可的词,由于基于个人观点的偏见和成见,被不同的人赋予了不同的语义,并且永远不会有好的结局。
【讨论】:
我要补充一点,如果要从数据库中检索数据,我会使用 fetch/retrieve 嗯。你会区分通配符标准和特定标准吗?例如,在查找特定出版商的书籍时,您会使用 FindBooks(publisher) 吗?或者 GetBooksFromPublisher(publisher)? publisher.getBooks() 将是首选方式,其中发布者是发布者的特定实例。 Library.getBooks(publisher) 其中发布者实现了 BookSearchCriteria 接口。与 Library.getBooks(author) 相同,其中作者实现了 BookSearchCriteria 接口。从逻辑上讲,您还可以将 Library.getPublishers() 作为工厂方法 感谢您的回答。绝对增加了一些清晰度。从本质上讲,您是说特定过滤器检索的方法应该保留在对象中。接口会以什么方式使用?例如,BookSearchCriteria 接口。能否提供一些示例代码? 当数据访问时间 低时,通常命名类似于fetch
,即在同一设备上,来自本地数据库,来自内存。@987654331 @,或download
,如果访问时间更高,来自互联网、外部数据库、来自文件【参考方案2】:
老实说,您应该与您的团队一起决定使用哪种命名约定。但是为了好玩,让我们看看你的思路是什么来决定这些:
GetBooks()这个方法属于数据源,我们不关心它是如何获取的,我们只想从数据源中获取。
FetchBooks()您将数据源视为猎犬,他的工作就是取回您的书籍。我想你应该自己决定他一次能塞多少个。
FindBooks()您的数据源是图书管理员,将使用杜威十进制系统查找您的图书。
LoadBooks()这些书属于某种“电子书包”,必须装入其中。请务必在加载后调用 ZipClosed() 以防止丢失。
RetrieveBooks()我什么都没有。
【讨论】:
接受的答案没有很好地区分“get”和“fetch”以及这个答案。 Fetch 意味着它必须由其他人完成,因为这需要一些时间或需要一些专业知识才能完成,而 get 意味着它是即时可用的,并且可以逐字或“现成”。 我今天也无法接受接受的答案。对于我的项目(基于 React/Redux),我认为区分从 Redux 存储、应用程序数据库和第三方 API 提取的数据非常重要。做到这一点肯定会有助于未来的可读性。最初的开发人员使用add
写入数据库和写入存储区。现在我正试图将它们分开,这很痛苦。【参考方案3】:
答案就是坚持你觉得舒服并始终如一。
如果您有一个贵族网站并使用 GetBooks(),那么如果您有另一个项目,如电影实体,请使用 GetMovies()。因此,无论您和您的团队喜欢什么,并且始终如一。
【讨论】:
至少你在拼写错误上是一致的。 ;-) 与consistant非常一致...:) 一点也不冒犯...谢谢您指出。【参考方案4】:不清楚“获取数据”的含义。从数据库?一份文件?内存?
我对方法命名的看法是,它的作用是消除任何歧义,理想情况下是查找文档的需要。我相信即使以更长的方法名称为代价也应该这样做。根据研究,大多数中级以上的开发人员能够以驼峰式阅读多个单词。使用 IDE 和自动完成,编写长方法名也不是问题。
因此,当我看到“fetchBooks”时,除非上下文非常清楚(例如,名为 BookFetcherFromDatabase 的类),否则它是模棱两可的。从哪里取? fetch 和 find 有什么区别?您还面临一些开发人员会将语义与某些关键字相关联的问题。例如,获取数据库(或内存)与加载(从文件)或下载(从 Web)。
我宁愿看到类似“fetchBooksFromDatabase”、“loadBookFromFile”、“findBooksInCollection”等的东西。它不那么显眼,但是一旦你超过了长度,就很清楚了。阅读本文的每个人都会立即了解您正在尝试做的事情。
【讨论】:
fetchBooksFromDatabase 的问题是当您想要分解/概括和 fetchBooks 时,可能会从 XML 中提取一些数据。我也喜欢细节,但是你会发现自己在不同的函数names中分离了相同的功能。而且那位先生并不酷! 我认为 Get 与 Find 之间的区别往往很明显,但我想知道有关 Get 与 Fetch 的问题。地狱..有区别吗? @JonH:我同意你的看法。但是,如果您事先知道您将有不同类型的 fetch,您将在类命名中对其进行编码(以便您可以从上下文中解释含义,例如 DatabaseConnector 与 XmlConnector)。 @Jason:因为“getter”无处不在(并且是 JavaBeans 等框架的一部分),许多程序员倾向于将它们视为访问数据字段的几乎透明的方式。另一方面,“Fetch”向一些程序员表明更长时间的访问,包括从一个地方到另一个地方的数据传输(a-la CPU 获取)或数据库获取。例如,Hibernate 的查询语言有一个 Fetch 结构。开发人员经常根据他们对名称的期望而不是通过阅读文档来使用方法,因此避免发送错误信号至关重要。【参考方案5】:在 OO (C++/Java) 中,我倾向于使用 getSomething 和 setSomething,因为我经常从表示该数据对象的类中获取私有属性或设置它 - getter/setter 对。另外,Eclipse 会为您生成它们。
我倾向于仅在我指的是文件时才使用 Load - 例如“加载到内存”中,这通常意味着加载到原语、结构 (C) 或对象中。我使用网络发送/接收。
如上所述,一致性就是一切,包括跨开发者。
【讨论】:
以上是关于获取数据的方法名称[关闭]的主要内容,如果未能解决你的问题,请参考以下文章