Fácil:
Imagine que tiene un método, llamémoslo getProducts . Ahora, el tipo de retorno ingenuo para este método es ArrayList .
Pero esto es, cuando lo piensas, un tipo de retorno extraño. ¿Qué significa, en este contexto, escribir código como:
- ¿Cuál es la mentalidad requerida por un desarrollador de software para tener éxito en una empresa basada en productos?
- ¿Cómo puede un desarrollador de software independiente proteger su trabajo?
- Cómo encontrar un buen trabajo desafiante como desarrollador de software
- ¿Realmente crees que el discurso de "las compañías de software están predicando" hay muy pocos ingenieros de software calificados disponibles en los Estados Unidos? ¿Es este discurso de 'no tener suficientes ingenieros calificados' un farol para lograr que el gobierno dé más H1B?
- ¿Existe un libro completo, guía o documento del sitio web de las diferentes metodologías de desarrollo de software?
getProducts (). add (foo)
La respuesta es: no tiene sentido.
También es quebradizo. Imagine que tengo 100 lugares en mi código que llaman a getProducts . Ahora, llega el día en que quiero cambiar la implementación a una diferida, donde devuelvo un iterador que solo funciona cuando se extraen los datos. Ahora necesito ir y cambiar, potencialmente, otras 100 piezas de código que pueden depender del hecho de que estoy devolviendo un objeto demasiado robusto.
El principio general del diseño del software es devolver, desde cualquier método, el tipo de objeto menos capaz y menos específico que pueda. No queremos que nadie confíe en el hecho de que estamos usando internamente una ArrayList, si es que lo hacemos, porque eso hace que el software sea frágil al acoplar llamadas a los que llaman .
Al devolver una interfaz, por ejemplo, IEnumerable, aún puede devolver la ArrayList, pero ahora ninguna persona que llama puede confiar en los detalles de su implementación. Esto deja su código interno libre de cambiar, por ejemplo, usar una LinkedList en su lugar, sin afectar ningún código que sea cliente suyo.
También mejora la claridad: al devolver la interfaz más específica posible, hace que la intención del código sea mucho más clara al hacer que las acciones sin sentido sean imposibles.
HTH.