.net - sobre - manual android studio avanzado
.NET-¿Puede sobre interfaz, y cuándo no debería interfaz (10)
Como con cualquier otra cosa, úselo con moderación y cuando sea necesario. Pregúntate a ti mismo " ¿Lo vas a necesitar? ".
¿Es posible sobre la interfaz? cuando diseñe un sistema ahora, comenzaré desde interfaces y escribiré progresivamente pruebas unitarias junto con las interfaces hasta que tenga un patrón que funcione bien. Pasaré a escribir algunas clases concretas y estableceré las pruebas unitarias contra estas.
Ahora soy alguien a quien le encantan las interfaces, en general solo terminaré pasando / regresando primativos o interfaces cuando controlo el código ... hasta ahora he encontrado que esto es ideal, puedes adaptar y mejorar fácilmente un sistema en general sin afectar los sistemas dependientes.
Obviamente no es necesario que venda las razones para usar interfaces, pero me pregunto si está al límite para interactuar con todo, ps. No estoy hablando de interfaces en blanco como en algo tan loco como:
interface IStringCollection : ICollection<string>
{
}
Estoy hablando de algo más como:
interface ISomethingProvider
{
ISomething Provide(ISomethingOptions options);
}
¿Es esto realmente exagerado? mi razonamiento es que cualquier tipo podría ganar al interactuar en algún momento ... y el único problema real que he tenido es que he tenido que aprender lo que creo que es una mejor forma de diseñar clases, ya que no tienes tonterías interacciones y ''hacks'' pasando.
Me encantaría su opinión sobre si se trata de una bomba de tiempo, y cuando decide interactuar vs no ...
ps- esto no es tanto acerca de cómo escribir interfaces.
En resumen, sí, es posible sobre interfaz de un proyecto. Tenga en cuenta que cuando la situación realmente requiere una clase base abstracta y una interfaz, mientras que ambas son similares, existen ventajas distintivas al uso de See Here . Por lo general, he notado que las personas usan interfaces cuando deberían usar clases base abstractas. Desde una perspectiva de OO, las interfaces deben usarse para enumerar comportamientos comunes que pueden abarcar clases muy diferentes. Por ejemplo, puede tener una interfaz IMove con un método llamado Move (). Ahora imagine que tiene una clase de avión, automóvil, persona e insecto. El avión y el coche pueden heredar de una clase de vehículo abstracta, pero todavía necesitan usar IMove y también lo harán Insect y Person, pero todos implementarán un movimiento diferente. Me he dado cuenta, mi yo incluido, las personas tienden a utilizar interfaces para "agrupar" clases juntas cuando realmente eso debería ser manejado por una clase base.
Encuentro que las interfaces complican el diseño, especialmente para otras personas que trabajan en sus cosas. No me malinterpreten, las interfaces son geniales para muchas cosas, pero sobre todo si desea que dos o más clases compartan una interfaz común.
Si te encuentras en una situación en la que de repente necesitas una interfaz, la refacturación con herramientas como Resharper es muy fácil :)
Es posible sobre-interfaz. La regla donde trabajo es que si tiene una interfaz en su aplicación, necesita tener al menos dos clases que la implementan (o tiene una expectativa razonable de que agregará clases de implementación en el futuro cercano).
Si necesita crear objetos simulados para probar, entonces tener la clase simulada y la clase real implementando una interfaz común es una razón válida para usar una interfaz.
No recomendaría automáticamente el uso de interfaces para todo en su aplicación, especialmente porque una sola clase generalmente se puede refactorizar fácilmente en una interfaz si es necesario.
Esto no es solo algo de .NET, el mismo problema ocurre en Java con bastante frecuencia.
A menos que sea un requisito completamente obvio, voto por no usar interfaces y simplemente refactorizar cuando la necesidad se aclare.
El enfoque pragmático dice simplemente hacer lo más simple que pueda funcionar , y no quedar atrapado en la arquitectura astronáutica.
ISwissArmyKnife!
Consulte esto:
http://thedailywtf.com/Articles/Classic-WTF-Implements-ISwissArmyKnife.aspx
Las interfaces describen un contrato de comportamiento. Si necesita abordar un conjunto de objetos de acuerdo con un patrón de comportamiento, las interfaces son útiles, no tanto si simplemente describe la estructura de los objetos. Creo que debe tener una buena razón para usarlos, como usar una fábrica que crea objetos relacionados con el comportamiento o establecer un contrato de comportamiento para parte de una biblioteca. Usar interfaces sin rumbo puede hacer que una biblioteca sea difícil de leer / comprender / mantener.
Puede ser un verdadero dolor calcular la pila de llamadas final antes de avanzar con el depurador si tiene interfaces en todas partes. Tiendo a preferir las interfaces solo cuando:
- necesita que los miembros del equipo acuerden quién debería hacer qué antes de comenzar a codificar; una interfaz luego documenta el borde exactamente
- cuando realmente necesita una interfaz para resolver el problema, al menos dos implementaciones que no se extienden entre sí
- Esperas el caso 2
Tiendo a no utilizar demasiadas interfaces para fines de prueba. Prefiero hacer un valor público privado y / o separar las clases y / o los métodos temporales mientras construyo y pruebo hasta que esté en el punto donde construí otros objetos y pruebas que eventualmente ejercerán lo que necesitaba. A veces es un dolor en el trasero hacer cambios de esa manera, pero tus pruebas te dirán cuándo olvidaste cambiar algo.
Cada vez que veo u oigo a alguien decir esto
Las interfaces describen un contrato de comportamiento
Sé que encontré a alguien que no entiende las interfaces.
Las interfaces no pueden hacer eso. Es imposible. Las interfaces no prescriben, fuerzan o de ninguna manera limitan el comportamiento .
Las interfaces describen un contrato para una interfaz , de ahí el nombre. Ellos no tienen comportamiento.
Puede esperar que los nombres que le dé a los métodos de su interfaz implicarán un comportamiento obligatorio para cualquiera que lo implemente, pero no es obligatorio que lo hagan. No hay contrato de comportamiento, ni puede haber uno.
Si necesita un cierto tipo de comportamiento, debe usar clases para aplicarlo (por ejemplo, con el patrón de Plantilla): ahí es donde está el comportamiento.
Las interfaces se abusan regularmente como una construcción de diseño, y una de las razones es debido a la creencia generalizada en esta falacia.