Interfaces en C#

Post on 13-Apr-2017

64 views 1 download

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 ?