interfaces en c#
TRANSCRIPT
C# InterfacesGermán Küber.Net DeveloperMicrosoft Student Partner (MSP)
@germankuberhttps://aka.ms/NetBaireshttp://germankuber.com.ar
¿ Por que Interfaces ?
Mantenibilidad Extensibilidad
Fácil de Testear
¿ Que es una interfaces ?Describen un grupo de funciones relacionadas que pueden pertenecer a cualquier clase o estructura.
Contrato Miembros públicos : Propiedades Métodos Eventos Índices
Escenario : Polígonos regularesLargo = 5
Largo = 5
Largo = 5Larg
o = 5
Largo = 5
Largo = 5
Largo
= 5
• 3 o mas lados• Todos los lados
iguales
PerímetroLargo = 5
Largo = 5
Largo = 5Larg
o = 5
Largo = 5
Largo = 5
Largo
= 5
Perímetro = Nº lados x largo de cada ladoPerimeter = 4 x 5
Perimeter = 20Perimeter = 3 x 5
Perimeter = 15
ÁreaLargo = 5
Largo = 5
Largo = 5Larg
o = 5
Largo = 5
Largo = 5
Largo
= 5
Área = L. Largo x L. Largo
Perimeter = 5 x 5Perimeter = 25
Área = (L. Largo x L. Largo)/ x Sqrt(3) / 4
Area = 5 x 5 x Sqrt(3) / 4 Area = 10.8 (apróximadamente)
Clases concretas?Clases abstractas?
Interfaces?
Clase abstracta : Puede tener implementaciones
Interfaces: No poseen implementaciones
Comparación: Implementación
Comparación: Herencia Clase Abstracta : Herencia simple
Interface: Herencia múltiple
Clase Abstracta : Puede tener modificadores de acceso
Interface: Automáticamente todos sus miembros son públicos
Comparación: Modificadores de Acceso
Contrato
CamposPropiedadesContructoresDestructores
MétodosEventosIndices
PropiedadesMétodosEventosIndices
Comparación: Miembros válidos
Clases Abstractas
Interfaces
Comparación
Clases Abstractas Interfaces
• Puede contener implementaciones
• Herencia simple
• No puede contener implementaciones• Herencia multiple
Mantenibilidad
Buenas prácticas
Programar orientado a abstracciones y no a tipos concretos
Interfaces
Programar orientado a interfaces y no a clases concretas
List<T> Array
ArrayListSortedList<TKey, TValue>
HashTableQueue / Queue<T> Stack / Stack<T>
Dictionary<TKey, TValue> ObservableCollection<T>
+Custom Types
Clases concretasColecciones
Interfaces
Interfaces de Colecciones
Extensibilidad
Diferentes Data Sources Relational Databases
Microsoft SQL Server, Oracle, MySQL, etc. Document / Object Databases (NoSQL)
MongoDB, Hadoop, RavenDB, etc. Text Files
CSV, XML, JSON, etc. SOAP Services
WCF, ASMX Web Service, Apache CXF, etc. REST Services
WebAPI, WCF, Apache CXF, JAX-RS, etc. Cloud Storage
Microsoft Azure, Amazon AWS, Google Cloud SQL
Patrón RepositorioCapa de abstracción para comunicar nuestra aplicación con el almacén de datos
Aplicación
Repositorio
Data Storage
WCF Service Repository
CSV File Repository
SQL Database Repository
Aplicación
Repositorios Intercambiables
Repositorio SimpleOperaciones
• C => Create• R => Read• U => Update• D => Delete
Interface Repository
Clase sin Interface
public class Catalog{public string Save(){return "Catalog Save";
}
// Other members not shown}
Catalog catalog = new Catalog();catalog.Save(); // "Catalog Save"
Declaración
Uso
Implementación estándar de Interface
Catalog catalog = new Catalog(); catalog.Save(); // "Catalog Save"
ISaveable saveable = new Catalog(); saveable.Save(); // "Catalog Save"
Declaración
Usopublic interface ISaveable{string Save();
}
public class Catalog : ISaveable{public string Save(){return "Catalog Save";
}
// Other members not shown}
Implementación Explicita
Declaración Tipo Concreto
Variable interface
Castear a Interface
Declaración Implementación
Implementación Explicita
Fácil de Testear
Interfaces
Programar orientado a interfaces y no a clases concretas
Programa orientado a interfaces
No referenciar clases concretas
Compile-Time Factory
Dynamic Loading Se obtiene el tipo y el Assembly de la
configuración Carga Assembly por Reflection Creo una Instancia de Repository con Activator
Comparación Factory
Compile-Time Factory Dynamic Factory
• Tiene un parámetro• Quien llama decide que
repositorio quiere• Compile-Time Binding• La Factory necesita referencia al
conjunto de repositorios
• No tiene parámetro• La Factory retorna un repositorio
basándose en la configuración• Run-Time Binding• La Factory no tiene referencia real
a los repositorios
Unit Testing• Testear pequeñas porciones de código• Eliminar dependencias reales con
DataSources• Realizar pruebas de integración
¿ Que queremos Testear ?
Dependencias
Implementar ViewModel
View (UI Elements)
View Model
Repository
Data Storage
Buenas Prácticas
Interface Segregation Principle
• Tener interfaces granulares.• No obligar a los clientes a depender
de métodos que no utilicen
List<T> Interfaces
IEnumerable
IEnumerable<T>GetEnumerator
()GetEnumerator
()
List<T> Interfaces
ICollection<T>Count
IsReadOnly
Add() Clear()
Contains() CopyTo() Remove()
List<T> Interfaces
IList<T>Item /
Indexer IndexOf() Insert()
RemoveAt()
Interfaces Granulares Si necesito :
Iterar una Collection / Sequence
Data Bind a List Control Usar LINQ functions
Si necesito : Agregar/Eliminar Items de una
Collection Contar Items en una Collection Limpiar la Collection
Si necesito : Control sobre el orden de los
Items en una Collection Obtener ítem por índice
IEnumerable<T>
IList<T>
ICollection<T>
IPersonRepository
Segregation
¿Cuando Clases Abstractas y cuando
Interfaces?
Regular PolygonClase Abstracta
Person RepositoryInterface
s• Service Repository
• File Repository
• SQL Repository
Dependency Injection Código poco acoplado
Delegación de responsabilidad de obtener instancias
Patrones de diseño Constructor Injection Property Injection Method Injection Service Locator
Dependency Injection Containers Unity, StructureMap, Autofac, Ninject, Castle Windsor, and
many others
Dependency Injection
Mocking Crear objetos controlados
En memoria Solo implemento el
comportamiento que quiero
Ideal para pruebas unitarias
Mocking Frameworks RhinoMocks Microsoft Fakes Moq
¿ Por que Interfaces ?
¿ Preguntas ?