Nomes de métodos para obter dados [fechado]

103

Aviso: Esta é uma questão / discussão não muito séria que estou postando ... mas estou disposto a apostar que a maioria dos desenvolvedores ponderou sobre esse "problema" ...

Sempre quis obter outras opiniões sobre as convenções de nomenclatura para métodos que buscavam dados de algum lugar e os retornavam ...

A maioria dos nomes de métodos são um tanto simples e óbvios ... SaveEmployee (), DeleteOrder (), UploadDocument (). É claro que com as classes você provavelmente usaria a forma abreviada ... Salvar (), Excluir (), Carregar () respectivamente.

No entanto, sempre lutei com a ação inicial ... como obter os dados. Parece que para cada projeto eu acabo pulando entre diferentes convenções de nomenclatura porque nunca fico muito feliz com o último que usei. Pelo que eu posso dizer, essas são as possibilidades ->

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

Qual é o seu pensamento?

Jason
fonte

Respostas:

126

É tudo uma questão de semântica consistente ;

No título da sua pergunta, você usa obter dados . Isso é extremamente geral no sentido de que você precisa definir o que obter significa forma semanticamente não ambígua. Ofereço os exemplos a seguir para colocá-lo no caminho certo ao pensar em nomear as coisas.

  1. getBooks() é quando você está obtendo todos os livros associados a um objeto, isso implica que os critérios para o conjunto já estão definidos e de onde eles vêm é um detalhe oculto.
  2. findBooks(criteria) é quando estamos tentando encontrar um subconjunto dos livros com base em parâmetros para a chamada do método, isso geralmente será sobrecarregado com diferentes critérios de pesquisa
  3. loadBooks(source) é quando você está carregando de uma fonte externa, como um arquivo ou banco de dados.
  4. Eu não usaria buscar / recuperar porque eles são muito vagos e se confundem com get e não há semântica inequívoca associada aos termos.

Exemplo: fetch implica que alguma entidade precisa ir e pegar algo que é remoto e trazê-lo de volta. Cachorros buscam um pedaço de pau e recuperar é um sinônimo de buscar com a semântica adicional de que você também pode ter possuído a coisa antes. obter é sinônimo de obter , o que implica que você possui apenas a posse de algo e ninguém mais pode adquiri-lo simultaneamente.

A semântica é extremamente importante:

o ramo da linguística e da lógica preocupada com o significado

Os comentários são a prova de que termos genéricos como get e fetch não têm semântica específica e são interpretados de forma diferente por pessoas diferentes. Escolha uma semântica para um termo, documente o que ele pretende implicar se a semântica não for clara e seja consistente com seu uso.

palavras com significados vagos ou ambigiosos recebem semânticas diferentes por pessoas diferentes por causa de seus pré-julgamentos e preconceitos baseados em suas opiniões pessoais e que nunca terminarão bem.

Comunidade
fonte
4
Eu acrescentaria que usaria buscar / recuperar se os dados fossem recuperados de um banco de dados
Liz Albin
1
Hmmm. Você faria uma distinção entre critérios curinga e critérios específicos. Por exemplo, você usaria FindBooks (editora) ao procurar livros de uma editora específica? Ou talvez GetBooksFromPublisher (editor)?
Jason
5
publisher.getBooks () seria a maneira preferida de fazer isso, onde publisher era uma instância específica de um Publisher. Library.getBooks (publisher) onde publisher implementou uma interface BookSearchCriteria. O mesmo com Library.getBooks (autor), onde autor implementou uma interface BookSearchCriteria. Você também logicamente teria Library.getPublishers () como um método de fábrica
3
Obrigado por esta resposta. Definitivamente adiciona alguma clareza. Em essência, você está dizendo que os métodos de recuperação por um filtro específico devem permanecer com o objeto. De que forma a interface seria usada? Por exemplo, a interface BookSearchCriteria. Você pode fornecer algum código de amostra?
Jason
2
normalmente a nomenclatura é como fetchquando o tempo de acesso aos dados é baixo , ou seja, no mesmo dispositivo, do banco de dados local, da memória. load, ou downloadse o tempo de acesso for maior , da Internet, banco de dados externo, do arquivo
János
13

Honestamente, você deve decidir com sua equipe qual convenção de nomenclatura usar. Mas, para se divertir, vamos ver qual seria sua linha de pensamento ao decidir sobre qualquer um destes:

  • GetBooks ()

Este método pertence a uma fonte de dados, e não nos importamos como ele os obtém, queremos apenas obtê-los da fonte de dados.

  • FetchBooks ()

Você trata sua fonte de dados como um cão de caça, e é o trabalho dele buscar seus livros. Eu acho que você deve decidir por si mesmo quantos ele pode caber na boca de uma vez.

  • FindBooks ()

Sua fonte de dados é um bibliotecário e usará o sistema Decimal de Dewey para localizar seus livros.

  • LoadBooks ()

Esses livros pertencem a algum tipo de "bolsa de livros eletrônica" e devem ser carregados dentro dela. Certifique-se de chamar ZipClosed () após o carregamento para evitar perdê-los.

  • RetrieveBooks ()

Eu não tenho nada.

Nick Larsen
fonte
1
A resposta aceita não distinguiu bem entre "obter" e "buscar", bem como esta resposta. Fetch implica que deve ser feito por outra pessoa porque vai levar algum tempo ou requer algum conhecimento para ser executado, enquanto get implica que é instantâneo e está disponível literalmente ou "pronto para uso".
Sridhar Sarnobat
Eu também estou tendo problemas com a resposta aceita hoje. Para o meu projeto (baseado em React / Redux), acredito que é importante distinguir entre os dados que estão sendo extraídos da loja Redux e o banco de dados do aplicativo e uma API de terceiros. Fazer isso da maneira certa certamente ajudará na legibilidade no futuro. O desenvolvedor original usado addpara gravar em um banco de dados e gravar na Loja. Agora estou tentando separá-los, e é uma dor.
tim.rohrer
9

A resposta é apenas manter o que você se sente confortável e ser consistente.

Se você tiver um site barnes and nobles e usar GetBooks (), se tiver outro item, como uma entidade Movie, use GetMovies (). Portanto, o que você e sua equipe quiserem e sejam consistentes.

JonH
fonte
22
Pelo menos você é consistente em erros ortográficos consistentes. ;-)
Wim Hollebrandse
1
Muito consistente com consistente ... :)
JonH
Nem um pouco ofendido ... obrigado por apontar isso.
Jason
2

Em OO (C ++ / Java), tendo a usar getSomething e setSomething porque muitas vezes, senão sempre, estou obtendo um atributo privado da classe que representa esse objeto de dados ou configurando-o - o par getter / setter. Além disso, o Eclipse os gera para você.

Eu tendo a usar Carregar apenas quando me refiro a arquivos - como em "carregar na memória" e isso geralmente implica carregar em primitivos, structs (C) ou objetos. Eu uso enviar / receber para web.

Como dito acima, consistência é tudo e isso inclui desenvolvedores cruzados.

Anthony Pegram
fonte
1

Não está claro o que você quer dizer com "obter os dados". Do banco de dados? Um arquivo? Memória?

Minha opinião sobre a nomenclatura de métodos é que sua função é eliminar quaisquer ambigüidades e, idealmente, a necessidade de consultar a documentação. Acredito que isso deva ser feito mesmo às custas de nomes de métodos mais longos. De acordo com estudos, a maioria dos desenvolvedores intermediários + são capazes de ler várias palavras em caso de camelo. Com IDE e completações automáticas, escrever nomes de métodos longos também não é um problema.

Portanto, quando vejo "fetchBooks", a menos que o contexto seja muito claro (por exemplo, uma classe chamada BookFetcherFromDatabase), é ambíguo. Buscar de onde? Qual é a diferença entre fetch e find? Você também está arriscando o problema de alguns desenvolvedores associarem a semântica a certas palavras-chave. Por exemplo, buscar banco de dados (ou memória) vs. carregar (do arquivo) ou baixar (da web).

Eu prefiro ver algo como "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection", etc. É menos aparente, mas quando você ultrapassa o comprimento, fica claro. Todo mundo lendo isso entenderia imediatamente o que você está tentando fazer.

Uri
fonte
4
O problema com fetchBooksFromDatabase é quando você deseja fatorar / generalizar e buscar livros, então pode haver algum extrato de dados de, digamos, XML. Eu também gosto de detalhes, mas você se vê separando a mesma funcionalidade em diferentes nomes de função . E esse senhor não é legal!
JonH
Acho que a diferença entre Get versus Find tende a ser óbvia, mas me pergunto sobre a questão em relação a Get versus Fetch. Inferno ... há uma diferença?
Jason
@JonH: Concordo com você nisso. No entanto, se você soubesse com antecedência que teria diferentes tipos de busca, você teria codificado isso na nomenclatura da classe (para que pudesse interpretar o significado do contexto, por exemplo, DatabaseConnector vs. XmlConnector).
Uri
7
@Jason: Como os "getters" são tão onipresentes (e fazem parte de estruturas como JavaBeans), muitos programadores tendem a considerá-los meios quase transparentes de acessar um campo de dados. "Fetch", por outro lado, indica a alguns programadores um acesso mais demorado que envolve a transferência de dados de um lugar para outro (a-la CPU fetching) ou banco de dados. Por exemplo, a linguagem de consulta do Hibernate possui uma construção Fetch. Os desenvolvedores costumam usar métodos com base em suas expectativas do nome, em vez de ler a documentação, portanto, evitar enviar o sinal errado é crucial.
Uri