Comportamiento esperado cuando una solicitud de una colección tendrá cero elementos

13

Digamos que te dan lo siguiente ...

List<Thing> theThings = fubar.Things.All();

Si no hubiera nada que devolver, ¿qué esperaría de Fubar.Things.All () to return?

Editar: Gracias por las opiniones. Esperaré un poco y aceptaré la entrada con la mayor cantidad de ups.

Estoy de acuerdo con las respuestas hasta el momento, particularmente aquellas que sugieren una colección vacía. Un proveedor proporcionó una API con varias llamadas similares al ejemplo anterior. Un proveedor que obtuvo $ 4.6 millones en ingresos a través de sus API (s) el año pasado, por cierto. Ellos hacen algo con lo que fundamentalmente estoy en desacuerdo: lanzan una excepción.

    
pregunta abscode 16.08.2012 - 18:58

6 respuestas

29

De las dos posibilidades (es decir, devolver un null o devolver una colección vacía) elegiría devolver una colección vacía, porque permite a la persona que llama omitir una verificación del valor devuelto. En lugar de escribir esto

List<Thing> theThings = fubar.Things.All();
if (theThings != null) {
    for (Thing t : theThings) {
        t.doSomething();
    }
}

podrían escribir esto:

List<Thing> theThings = fubar.Things.All();
for (Thing t : theThings) {
    t.doSomething();
}

Este segundo fragmento de código es más corto y más fácil de leer, porque el nivel de anidamiento es menor en uno.

    
respondido por el dasblinkenlight 16.08.2012 - 19:06
6

Esperaría una lista vacía. theThings aún sería un objeto, pero theThings.Count o theThings.size() devolvería 0 .

    
respondido por el David Hogue 16.08.2012 - 19:02
5

Los problemas de diseño como este se tratan en Patrón de objeto nulo

  

... En lugar de usar una referencia nula para transmitir la ausencia de un objeto (por ejemplo, un cliente inexistente), uno usa un objeto que implementa la interfaz esperada, pero cuyo cuerpo de método está vacío. La ventaja de este enfoque sobre una implementación predeterminada de trabajo es que un objeto nulo es muy predecible y no tiene efectos secundarios: no hace nada.

     

Por ejemplo, una función puede recuperar una lista de archivos en un directorio y realizar alguna acción en cada uno. En el caso de un directorio vacío, una respuesta puede ser lanzar una excepción o devolver una referencia nula en lugar de una lista. Por lo tanto, el código que espera una lista debe verificar que, de hecho, tiene uno antes de continuar, lo que puede complicar el diseño ...

La sugerencia particularmente aplicable en su caso (devolver List cuando no hay Thing s) es:

  

... Al devolver un objeto nulo (es decir, una lista vacía ), no es necesario verificar que el valor de retorno sea de hecho una lista. La función de llamada puede simplemente iterar la lista normalmente, sin hacer nada. Sin embargo, todavía es posible verificar si el valor de retorno es un objeto nulo (por ejemplo, una lista vacía) y reaccionar de manera diferente si lo desea.

    
respondido por el gnat 16.08.2012 - 19:32
3

Debes, IMHO, devolver un valor VACÍO. No sé sobre C #, pero en Java tenemos esto:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

  // For the type-safe 
  List<String> s = Collections.emptyList();
  Set<Long> l = Collections.emptySet();
  Map<Date> d = Collections.emptyMap();

enlace

    
respondido por el Marcelo Assis 16.08.2012 - 19:26
2

Devolvería una colección vacía en lugar de devolver un valor nulo porque de esa manera puede evitar escribir una verificación nula en el código de llamada.

    
respondido por el user61896 16.08.2012 - 19:17
2

Las dos soluciones significan cosas diferentes.

Si solo hay cero de lo que está devolviendo, ¡SIEMPRE devuelve una colección vacía! Tomemos el caso de un listado de directorios. Si no hay archivos en el directorio, devuelve una colección de archivos vacía.

Por otro lado, si el directorio no existe, eso no es realmente apropiado. "No puedo devolver nada" significa algo muy diferente. En ese caso, debería devolver un valor nulo o lanzar una excepción dependiendo de la situación, no solo devuelva una colección vacía como si nada estuviera mal.

    
respondido por el Bill K 17.08.2012 - 03:29

Lea otras preguntas en las etiquetas