Nombres de métodos para obtener datos [cerrado]

103

Advertencia: esta es una pregunta / discusión no muy seria que estoy publicando ... pero estoy dispuesto a apostar que la mayoría de los desarrolladores han reflexionado sobre este "problema" ...

Siempre quise obtener otras opiniones con respecto a las convenciones de nomenclatura para los métodos que fueron y obtuvieron datos de algún lugar y los devolvieron ...

La mayoría de los nombres de métodos son algo simples y obvios ... SaveEmployee (), DeleteOrder (), UploadDocument (). Por supuesto, con las clases probablemente usaría la forma corta ... Guardar (), Eliminar (), Cargar () respectivamente.

Sin embargo, siempre he tenido problemas con la acción inicial ... cómo obtener los datos. Parece que para cada proyecto termino saltando entre diferentes convenciones de nomenclatura porque nunca estoy del todo contento con el último que usé. Por lo que puedo decir, estas son las posibilidades ->

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

¿Cuál es tu pensamiento?

Jason
fuente

Respuestas:

126

Se trata de una semántica coherente ;

En el título de su pregunta, utiliza la obtención de datos . Esto es extremadamente general en el sentido de que necesita definir qué significa obtener de manera semántica y significativa sin ambigüedades. Ofrezco los siguientes ejemplos para, con suerte, ponerlo en el camino correcto cuando piense en nombrar cosas.

  1. getBooks() es cuando estás obteniendo todos los libros asociados con un objeto, implica que los criterios para el conjunto ya están definidos y de dónde vienen es un detalle oculto.
  2. findBooks(criteria) es cuando intentamos encontrar un subconjunto de los libros en función de los parámetros de la llamada al método, esto generalmente se sobrecargará con diferentes criterios de búsqueda
  3. loadBooks(source) es cuando se carga desde una fuente externa, como un archivo o una base de datos.
  4. No usaría fetch / retrieve porque son demasiado vagos y se combinan con get y no hay una semántica inequívoca asociada con los términos.

Ejemplo: buscar implica que alguna entidad necesita ir a buscar algo que es remoto y traerlo de vuelta. Los perros buscan un palo y recuperar es un sinónimo de buscar con la semántica añadida de que es posible que también hayas tenido posesión de la cosa antes. get es un sinónimo de obtener también, lo que implica que usted tiene la posesión exclusiva de algo y nadie más puede adquirirlo simultáneamente.

La semántica es extremadamente importante:

la rama de la lingüística y la lógica que se ocupa del significado

Los comentarios son una prueba de que términos genéricos como get y fetch no tienen semántica específica y son interpretados de manera diferente por diferentes personas. Elija una semántica para un término, documente lo que pretende implicar si la semántica no es clara y sea coherente con su uso.

Las palabras con significados vagos o ambiguos reciben una semántica diferente por parte de diferentes personas debido a sus prejuicios y preconcepciones basadas en sus opiniones personales y eso nunca terminará bien.

Comunidad
fuente
4
Agregaría que usaría buscar / recuperar si los datos fueran recuperados de una base de datos
Liz Albin
1
Hmmm. ¿Distinguiría entre criterios comodín y criterios específicos? Por ejemplo, ¿utilizaría FindBooks (editor) cuando busque libros de un editor específico? ¿O quizás GetBooksFromPublisher (editor)?
Jason
5
publisher.getBooks () sería la forma preferida de hacerlo, donde el editor era una instancia específica de un editor. Library.getBooks (editor) donde el editor implementó una interfaz BookSearchCriteria. Lo mismo con Library.getBooks (autor) donde el autor implementó una interfaz BookSearchCriteria. También tendría lógicamente Library.getPublishers () como método de fábrica
3
Gracias por esta respuesta. Definitivamente agrega algo de claridad. En esencia, está diciendo que los métodos de recuperación mediante un filtro en particular deben permanecer en el objeto. ¿De qué forma se utilizaría la interfaz? Por ejemplo, la interfaz BookSearchCriteria. ¿Puede proporcionar algún código de muestra?
Jason
2
por lo general, la denominación es como fetchcuando el tiempo de acceso a los datos es bajo , es decir, en el mismo dispositivo, desde la base de datos local, desde la memoria. load, o downloadsi el tiempo de acceso es mayor , desde Internet, DB externo, desde archivo
János
13

Honestamente, debería decidir con su equipo qué convención de nomenclatura utilizar. Pero para divertirnos, veamos cuál sería su línea de pensamiento para decidir sobre cualquiera de estos:

  • GetBooks ()

Este método pertenece a una fuente de datos, y no nos importa cómo los obtiene, solo queremos obtenerlos de la fuente de datos.

  • FetchBooks ()

Tratas tu fuente de datos como un sabueso, y su trabajo es buscar tus libros. Supongo que deberías decidir por tu cuenta cuántos puede caber en su boca a la vez.

  • FindBooks ()

Su fuente de datos es un bibliotecario y utilizará el sistema Dewey Decimal para encontrar sus libros.

  • LoadBooks ()

Estos libros pertenecen a una especie de "bolsa de libros electrónicos" y deben cargarse en ella. Asegúrese de llamar a ZipClosed () después de la carga para evitar perderlos.

  • RetrieveBooks ()

No tengo nada.

Nick Larsen
fuente
1
La respuesta aceptada no distinguía bien entre "obtener" y "buscar", así como esta respuesta. Fetch implica que tiene que ser realizado por otra persona porque tomará algún tiempo o requiere cierta experiencia para cumplir, mientras que get implica que es instantáneo y está disponible literalmente o "listo para usar".
Sridhar Sarnobat
Yo también tengo problemas con la respuesta aceptada hoy. Para mi proyecto (basado en React / Redux), creo que es importante distinguir entre los datos extraídos de la tienda Redux y la base de datos de la aplicación y una API de terceros. Hacer esto bien definitivamente ayudará con la legibilidad en el futuro. El desarrollador original utilizado addpara escribir en una base de datos y escribir en la tienda. Ahora estoy tratando de separarlos, y es un dolor.
tim.rohrer
9

La respuesta es ceñirse a aquello con lo que se sienta cómodo y ser constante.

Si tiene un sitio web de Barnes and Nobles y usa GetBooks (), entonces si tiene otro elemento como una entidad Movie, use GetMovies (). Así que sea lo que sea que le guste a usted y a su equipo y sea constante.

JonH
fuente
22
Al menos eres constante en la ortografía consistente. ;-)
Wim Hollebrandse
1
Muy consistente con constante ... :)
JonH
No se ofende en absoluto ... gracias por señalarlo.
Jason
2

En OO (C ++ / Java) tiendo a usar getSomething y setSomething porque muy a menudo, si no siempre, obtengo un atributo privado de la clase que representa ese objeto de datos o lo configuro: el par getter / setter. Como ventaja, Eclipse los genera por ti.

Tiendo a usar Cargar solo cuando me refiero a archivos, como en "cargar en memoria" y eso generalmente implica cargar en primitivas, estructuras (C) u objetos. Yo uso enviar / recibir para web.

Como se dijo anteriormente, la consistencia lo es todo y eso incluye a los desarrolladores cruzados.

Anthony Pegram
fuente
1

No queda claro a qué se refiere con "obtener los datos". ¿De la base de datos? ¿Un archivo? ¿Memoria?

Mi opinión sobre la denominación de métodos es que su función es eliminar cualquier ambigüedad e idealmente la necesidad de buscar documentación. Creo que esto debería hacerse incluso a costa de nombres de métodos más largos. Según los estudios, la mayoría de los desarrolladores intermedios + pueden leer varias palabras en caso de camello. Con IDE y finalizaciones automáticas, escribir nombres de métodos largos tampoco es un problema.

Por lo tanto, cuando veo "fetchBooks", a menos que el contexto sea muy claro (por ejemplo, una clase llamada BookFetcherFromDatabase), es ambiguo. ¿Traerlo de dónde? ¿Cuál es la diferencia entre buscar y buscar? También corre el riesgo de que algunos desarrolladores asocien la semántica con determinadas palabras clave. Por ejemplo, buscar para la base de datos (o memoria) frente a cargar (desde archivo) o descargar (desde web).

Preferiría ver algo como "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection", etc. Es menos atractivo, pero una vez que superas la longitud, está claro. Todos los que lean esto entenderán de inmediato lo que está tratando de hacer.

Uri
fuente
4
El problema con fetchBooksFromDatabase es que cuando desea factorizar / generalizar y fetchBooks, entonces podría ser una extracción de datos de, por ejemplo, XML. También me gustan los detalles, pero luego te encuentras separando la misma funcionalidad en diferentes nombres de funciones . ¡Y ese señor no está bien!
JonH
Creo que la diferencia entre Obtener versus Buscar tiende a ser obvia, pero me pregunto acerca de la pregunta sobre Obtener versus Obtener. Demonios ... ¿hay alguna diferencia?
Jason
@JonH: Estoy de acuerdo contigo en eso. Sin embargo, si supiera de antemano que tendría diferentes tipos de recuperación, lo habría codificado en el nombre de la clase (para poder interpretar el significado del contexto, por ejemplo, DatabaseConnector vs. XmlConnector).
Uri
7
@Jason: Debido a que los "captadores" son tan ubicuos (y son parte de marcos como JavaBeans), muchos programadores tienden a pensar en ellos como un medio casi transparente de acceder a un campo de datos. "Fetch", por otro lado, indica a algunos programadores un acceso más prolongado que implica la transferencia de datos de un lugar a otro (búsqueda de CPU a la) o búsqueda de bases de datos. Por ejemplo, el lenguaje de consulta de Hibernate tiene una construcción Fetch. Los desarrolladores a menudo usan métodos basados ​​en sus expectativas del nombre en lugar de leer la documentación, por lo que evitar enviar la señal incorrecta es crucial.
Uri