.net - saber - ¿Debo devolver ''null'' o una matriz vacía?
que es un array (12)
A menos que por alguna razón haya una diferencia de significado en tu código para que un resultado sea una matriz nula frente a una vieja y vacía, devolvería una en blanco. Esto también podría ser algo específico del idioma. En algunos idiomas, es posible que solo tenga una opción.
Supongamos que tiene un método que debería crear y devolver una matriz de algún tipo. ¿Qué pasa si la matriz no se llena? ¿Devuelve una matriz vacía o nula / nada?
Bueno, realmente depende de la semántica que quieras darle a tu regreso.
Por lo general, uso las condiciones previas y posteriores para casi todas mis funciones / métodos. Eso significa que si se supone que mi método devuelve una matriz con datos de un tratamiento particular, si este tratamiento falla, el objeto debería ser nulo y la condición posterior fallaría.
Pero en su caso, supongo que no usa DbC, entonces, si me refiero solo a su pregunta:
¿Qué pasa si la matriz no se llena?
Luego regresaría nulo, ya que suponía que algo iba mal en tu fraseo.
Devuelvo lo que espera la persona que llama. Si se supone que la función devuelve "todos los objetos para los cuales X es verdadera", y X no es verdadera para ningún objeto, devuelvo una matriz vacía.
si la función no fue capaz de realizar esta búsqueda de "objetos para los que X es verdadero", falló, y tiene que devolver esa señal a la persona que llama de alguna manera. Eso podría hacerse devolviendo nulo.
Devuelvo una matriz vacía, parece lo correcto.
La respuesta depende del contrato entre el que llama y la función. Si tiene la intención de indicar que la matriz no es válida, entonces null es una mejor manera de hacerlo que devolver una matriz de tamaño cero, ya que una matriz de tamaño cero podría ser un resultado válido en alguna situación.
Me imagino que esto depende de la forma en que el lenguaje lo maneje.
En C, paso punteros y siempre incluyo un puntero que es del tamaño de la matriz. La función de llamada tiene que proporcionar dos cosas: la matriz y el tamaño de la matriz. si la función no rellena la matriz, simplemente devuelve el mismo puntero y no hace nada con el tamaño de la matriz. Por lo general, solo reinicio una estructura tipo vector y trabajo con eso.
En Perl, el tamaño de la matriz se maneja implícitamente, así que simplemente devuelvo una matriz vacía, o si hay un error, modifico la variable del código de error y devuelvo undef.
En java, uso ArrayLists y uso la propiedad de tamaño.
Realmente depende de lo que la persona que llama quiere hacer con el resultado.
Normalmente devuelvo la matriz vacía (o Collection, en Java). Esto se debe a que, por lo general, voy por un bucle y, opcionalmente, los agrego a la Colección y luego los devuelvo. Comprobando al final si Collection.size() == 0
es un paso adicional. Y luego la persona que llama debe agregar una verificación adicional para ver si el resultado es 0 y, de ser así, evite iterar la Colección.
Aprecio que podría ser más limpio devolver nulo, pero es más fácil no hacerlo a menos que tenga una razón para hacerlo.
Si esto es verdaderamente independiente del lenguaje, devolvería un objeto de matriz vacío, la mayoría de los contenedores deberían tener una función como IsEmpty () para que la persona que llama verificara si el Array IsEmpty antes de hacer algo con él.
Si esto está en C ++, puedo ver que va a anular, o si te pasan en una referencia a la matriz, entonces devuelves el tamaño de la matriz ...
Si lees detenidamente tu pregunta, te darás cuenta de que en realidad ya la has respondido tú mismo: escribiste "un método que debería crear y devolver una matriz de algún tipo" y no "un método que debería crear y tal vez devolver un conjunto de algunos ordenar o no ".
Realmente, depende de la especificación. Pero con la forma en que lo redactó, no hay forma de que el método pueda devolver el valor nulo. Cuál es el estilo que preferiría de todos modos, simplemente hace que el manejo de los bordes sea mucho más fácil.
Si tienes la suerte de estar usando C #, declara una propiedad de solo lectura estática como esta:
public static class ArrayUtil<TElement>
{
public static readonly Empty = new TElement[0];
}
(¿Esto está en el BCL? ¿Por qué no?)
Ahora puede devolver ArrayUtil<int>.Empty
o lo que sea. Esto prácticamente elimina los costos de tiempo de ejecución de usar una matriz vacía en lugar de nula y le da a la persona que llama un tiempo más simple que tener que lidiar con nulos.
Su respuesta a esta pregunta probablemente depende en gran medida del idioma en el que esté trabajando. En idiomas como C, no es posible devolver una matriz vacía, ya que una matriz es solo un puntero a alguna dirección de memoria donde comienza la matriz. En este caso, la única opción es devolver un puntero nulo.
En .NET, es mejor devolver una matriz vacía que nula, ya que evita que la persona que llama tenga que escribir una verificación nula y arriesgar una NullReferenceException
; verá que este es un patrón común en las bibliotecas de la clase base. El único caso en el que no haría esto es en el escenario poco probable de que una matriz vacía y nula tengan diferentes significados semánticos.
Las pautas de uso del arreglo oficial indican:
La regla general es que las matrices vacías, de cadena vacía ("") y vacías (0 elementos) se deben tratar de la misma manera. Devuelve una matriz vacía en lugar de una referencia nula.
Dicho esto, si usa .NET 2.0 o posterior, es mucho mejor devolver un IEnumerable<T>
o uno de sus derivados extensibles, como Collection<T>
, ReadOnlyCollection<T>
, ICollection<T>
o IList<T>
(en cuyo caso aún tendería a devolver uno vacío en lugar de nulo). Se puede encontrar más información sobre por qué estos se deben preferir en el blog de Eric Lippert .