Android Polimorfismo: Anti-Patrón?
Estoy leyendo el libro "Programación de Android" de O'Reilly, y estoy tratando de envolver mi cabeza alrededor de la sección "Anulaciones y devoluciones de llamada" que comienza en la página 99. Usan esto como un ejemplo de buen código:
public class MyModel { public MyModel(TextView textBox) { textBox.addTextChangedListener( new TextWatcher() { public void afterTextChanged(Editable s) { handleTextChange(s); } // ... } void handleTextChange(Editable s) { // do something with s, the changed text. } }
Y más tarde llamar a esto un anti-patrón debido a la falta de extensibilidad de encapsulación:
- Limitación de Drag de ImageView en Android
- Telephony.Sms.Inbox.PERSON utiliza Contacts.People._ID obsoletos
- Archivo de Android a Base64 utilizando streaming a veces se pierde 2 bytes
- Lectura de un archivo de texto en Android Studio Java
- ¿Cómo eliminar todos los archivos temporales creados por createTempFile al salir de una aplicación en android?
public class MyModel implements TextWatcher { public MyModel(TextView textBox) { textBox.addTextChangedListener(this); } public void afterTextChanged(Editable s) { handleTextChange(s); } // ... void handleTextChange(Editable s) { // do something with s, the changed text. } }
No veo la diferencia funcional entre los dos, aparte de la segunda es mucho más legible. Ambos toman un TextView, e implementan una función de controlador para anular. ¿No sería tan fácil extender el segundo con algo como esto?
public class AnotherModel extends MyModel { @Override void handleTextChange(Editable s) { // another implementation } }
- AudioTrack sólo reproducirá audio una vez
- El detector de eventos de valor único de Firebase no devuelve
- Android: error con la interacción de fragmentos Interesante
- Las invitaciones a los servicios de juegos de Google se pierden
- Desmarcando archivos XML en objetos Java en Android?
- Gradle Advertencia "no especificado depende de las bibliotecas, pero es un jar", mientras que la compilación de un módulo de Android dentro de un módulo de biblioteca java personalizado
- Texto del atributo xpath de Appium
- Error: "El proceso de daemon recién creado tiene un contexto diferente del esperado"
Un anti-patrón debido a la falta de extensibilidad
Extensibilidad-sabio, son similares en que ambos acercamientos permiten que una subclase modifique fácilmente el TextChangeListener
existente TextChangeListener
handleTextChange
; Pero son diferentes en que la única aproximación # 2 también facilita que una subclase agregue un nuevo TextChangeListener
sin modificar el existente (heredado).
Incluso si la superclase usa el enfoque # 1, la subclase podría agregar un nuevo TextChangeListener
usando el método # 2; Pero si estamos hablando del patrón para usar en general, entonces un uso consistente del enfoque # 2 proporcionará más extensibilidad que un uso consistente del enfoque # 1.
No me gustaría la segunda forma, ya que la clase implementa una interfaz como un truco, no porque la clase naturalmente es un subtipo de la interfaz.
La segunda forma puede ser manejable para casos simples, por lo que está bien a menos que se vuelva demasiado desordenado.
En Java 8, podemos utilizar el primer formulario en una mejor sintaxis:
textBox.addTextChangedListener(this#handleTextChange); // method reference
- ProGuard no compiló con Joda Time utilizado en Windows
- ¿Cómo manejar texto largo en las preferencias de Android?