tobase64string - java string getbytes base64
¿Codificación a interfaces? (8)
Como lo entiendo, uno crea interfaces para delinear la funcionalidad esperada y luego implementa estos "contratos" en clases concretas.
El único tipo de mutación que veo en tu pensamiento es este: vas a llamar a los contratos esperados, no a la funcionalidad esperada. La funcionalidad se implementa en las clases concretas. La interfaz solo indica que podrá llamar a algo que implemente la interfaz con las firmas de método esperadas. La funcionalidad está oculta del objeto llamante.
Esto le permitirá estirar su pensamiento en polimorfismo de la siguiente manera.
SoundMaker sm = new Duck();<br/>
SoundMaker sm1 = new ThunderousCloud();
sm.makeSound(); // quack, calls all sorts of stuff like larynx, etc.<br/>
sm1.makeSound(); // BOOM!, completely different operations here...
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué significa "programar a una interfaz"? 32 respuestas
Quiero consolidar mi comprensión del concepto de "codificación a interfaz". Como lo entiendo, uno crea interfaces para delinear la funcionalidad esperada y luego implementa estos "contratos" en clases concretas. Para usar la interfaz, uno puede simplemente llamar a los métodos en una instancia de la clase concreta.
El beneficio obvio es conocer la funcionalidad proporcionada por la clase concreta, independientemente de su implementación específica.
Basado en lo anterior:
- ¿Hay alguna falacia en mi comprensión de la "codificación de interfaces"?
- ¿Hay algún beneficio de la codificación de las interfaces que me perdí?
Gracias.
Para usar la interfaz, uno puede simplemente llamar a los métodos en una instancia de la clase concreta.
Por lo general, tendría una variable escrita en el tipo de interfaz, permitiendo así solo acceso a los métodos definidos en la interfaz.
El beneficio obvio es conocer la funcionalidad proporcionada por la clase concreta, independientemente de su implementación específica.
Una especie de Lo más importante es que le permite escribir API que toman parámetros con tipos de interfaz. Los usuarios de la API pueden pasar sus propias clases (que implementan esas interfaces) y el código funcionará en esas clases aunque aún no existieran cuando se escribió (como java.util.Arrays.sort ()) capaz de ordenar cualquier cosa que implemente Comparable
o que venga con un Comparator
adecuado).
Desde una perspectiva de diseño, las interfaces permiten / imponen una clara separación entre los contratos de API y los detalles de implementación.
Creo que es posible que haya insinuado esto, pero creo que uno de los mayores beneficios de la codificación de una interfaz es que está rompiendo la dependencia de la implementación concreta. Puede lograr un acoplamiento suelto y facilitar el cambio de implementaciones específicas sin cambiar mucho el código. Si solo estás aprendiendo, echaría un vistazo a varios patrones de diseño y cómo solucionan los problemas mediante la codificación de las interfaces. Leyendo el libro Head First: Design Patterns realmente me ayudó a hacer clic.
El objetivo de codificar contra interfaces es desacoplar su código de la implementación concreta en uso. Es decir, su código no hará suposiciones sobre el tipo concreto, solo la interfaz. En consecuencia, la implementación concreta se puede intercambiar sin necesidad de ajustar su código.
La principal ventaja es que el uso de una interfaz empareja una clase con sus dependencias. Luego puede cambiar una clase o implementar una nueva implementación de interfaz concreta sin tener que cambiar las clases que dependen de ella.
No mencionó la parte sobre cómo obtener una implementación de la interfaz, lo cual es importante. Si crea una instancia explícita de la clase de implementación con un constructor, su código estará vinculado a esa implementación. Puede utilizar una fábrica para obtener una instancia para usted, pero luego estará tan vinculado a la fábrica como antes a la clase de implementación. Su tercera alternativa es usar la inyección de dependencia, que consiste en tener una fábrica que conecta el objeto de implementación al objeto que lo usa, en cuyo caso se escapa de tener la clase que usa el objeto vinculado a la clase de implementación oa una fábrica.
Solo una posible corrección:
Para usar la interfaz, uno puede simplemente llamar a los métodos en una instancia de la clase concreta.
Uno llamaría a los métodos en una referencia de la interfaz de tipo, que utiliza la clase concreta como implementación:
List<String> l = new ArrayList<String>();
l.add("foo");
l.add("bar");
Si decidió cambiar a otra implementación de lista, el código de cliente funciona sin cambios:
List<String> l = new LinkedList<String>();
Esto es especialmente útil para ocultar detalles de implementación, proxies de generación automática, etc.
Encontrará que los marcos como spring y guice animan la programación a una interfaz. Es la base para ideas como aspect-oriented programación aspect-oriented aspectos, los proxies generados automáticamente para la gestión de transacciones, etc.
Tu entendimiento parece estar bien. Su compañero de trabajo acaba de pasar por su escritorio y tiene todas las últimas fotos de la fiesta de Navidad protagonizada por su jefe borracho cargado en su memoria USB. Su compañero de trabajo y usted no piensan dos veces acerca de cómo funciona esta unidad de disco, para usted es una caja negra, pero saben que funciona gracias a la interfaz USB .
No importa si se trata de un SanDisk o un Titanium (ni siquiera estoy seguro de que sea una marca), el tamaño / color tampoco importa. De hecho, lo único que importa es que no está roto (legible) y que se conecta a USB.
Su memoria USB se rige por un contrato, es esencialmente una interfaz. Se puede asumir que cumple algunas funciones muy básicas:
- Se conecta al USB
Cumple con el método de contrato CopyDataTo:
Interfaz pública IUSB {void CopyDataTo (string somePath); // utilizado para copiar datos desde la unidad de miniaturas a ...}
Cumple con el método de contrato CopyDataFrom:
Interfaz pública IUSB {void CopyDataFrom (); // utilizado para copiar datos desde su PC a la unidad de miniaturas}
Puede que no sean esos métodos, pero la interfaz IUSB es solo un contrato que los proveedores de unidades de miniaturas deben cumplir para garantizar la funcionalidad en varias plataformas / proveedores. Así SanDisk hace su memoria USB por la interfaz:
public class SanDiskUSB : IUSB
{
//todo: define methods of the interface here
}
Ari, creo que ya tienes una comprensión sólida (por lo que parece) de cómo funcionan las interfaces.