Las mejores prácticas con respecto a las clases anónimas en aplicaciones de IU


8

Cuando se trabaja con programas Java basados ​​en la interfaz de usuario, una forma de asociar el comportamiento a ciertas acciones (por ejemplo, al hacer clic en un botón) es mediante el uso de clases anónimas. En el ejemplo a continuación, el marco de la GUI es SWT, sin embargo, tengo los mismos problemas con los componentes Swing o Android UI. A saber, la estructuración de mis programas.

MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE);
sampleMenuItem.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent event) {
         doSomething();

         // handle all table entries
         for (int i=0; i<10; i++) {
             doSomething2();
         }

         doSomething3();
         doSomething4();
    }
});

Por supuesto, algunos podrían argumentar que la cantidad de código en el ejemplo anterior ya garantiza la creación de una clase dedicada que contenga la lógica. Esto también lo sugiere la regla "Las clases anónimas de Sonar no deberían tener demasiadas líneas" .

Curiosamente, esta regla también especifica que:

calamar: S1188 - Mientras se espera el soporte de cierre en Java, las clases anónimas son la forma más conveniente de inyectar un comportamiento sin tener que crear una clase dedicada. Pero esas clases internas anónimas deben usarse solo si el comportamiento se puede lograr en unas pocas líneas. Con un código más complejo, se requiere una clase con nombre.

Sin embargo, dado que los cierres aún no han llegado a Java, mi pregunta es si hay soluciones más elegantes que :

  • escribir un montón de código dentro de clases anónimas que tiene todo tipo de inconvenientes (reutilización limitada, navegación más lenta a través del código, ...)
  • creando una gran cantidad de clases dedicadas que todas ellas podrían tener una funcionalidad muy limitada (es decir: sobre ingeniería, ...)

Para ampliar mi pregunta: también me gustaría saber cuáles son las mejores prácticas con respecto a este aspecto de las aplicaciones de IU basadas en Java. ¿Hay algún patrón bien establecido?


Usaría clases anónimas donde la probabilidad de reutilización del código es relativamente baja, y necesita varias implementaciones de una interfaz. Esto evita que tenga que escribir una nueva clase para cada implementación. ¿Has visto esto ?
Robert Harvey

@Robert, soy consciente del hecho de que el código adjunto a una clase anónima normalmente no está destinado a ser reutilizado. Sin embargo, encontré algunas instancias en las que me hubiera gustado poder hacer esto, sin embargo. Por ejemplo, en el caso de que un Button y un MenuItem necesiten ejecutar el mismo código, pero solo con ligeras adaptaciones y sin violar DRY. Por esta razón, estoy buscando técnicas que permitan una mejor separación y estructuración de mi código.
Jérôme

Lo haces promocionando la clase anónima a una clase real.
Robert Harvey

Como mencioné en mi pregunta, esta es una de las soluciones que conozco. Sin embargo, estoy buscando otras técnicas o mejores prácticas en caso de que existan . Sin embargo, si no existe tal cosa, y tenemos que elegir entre crear una clase anónima o una clase real, esta podría ser una respuesta válida también ... :-) En el pasado, he trabajado con varias GUI en un montón de diferentes lenguajes de programación Y desde Delphi hasta Visual Studio e incluso Eiffel [sic], siempre consideré la forma Java utilizando clases anónimas bastante detalladas en términos de LOC que se necesitan para lograr un resultado.
Jérôme

1
Eso es porque Java es inherentemente detallado. No se puede arreglar estúpido.
Robert Harvey

Respuestas:


2

El único patrón que he visto que funciona es "Cuando el código se vuelve difícil de entender qué está pasando, es hora de dejar de usar una clase anónima".

En su ejemplo, el cuerpo del método es la clase anónima. Podría mover el "nuevo Adaptador de selección" a su propia línea, para que el par de apertura sea un poco más obvio, pero por lo demás está bien. Donde te metes en problemas es cuando una persona aleatoria ya no puede descubrir dónde están la clase anónima y el código del método.

También he creado una variable privada o método para mantener la clase anónima. Puse ese tipo de cosas al final de la clase, fuera del camino. De alguna manera, cierra la brecha entre una clase completamente nueva y la mantiene en el medio del código. Sin embargo, algunas personas lo consideran mal estilo, pero mi regla general es codificar primero la legibilidad.


Estoy totalmente de acuerdo con respecto a su primer párrafo. Sin embargo, a veces parece engorroso crear una clase dedicada, especialmente cuando algo que comienza con unas pocas líneas crece con el tiempo. Hasta ahora, nunca he visto a alguien asignar clases anónimas a variables privadas al final de la clase principal. Sin embargo, puedo ver el beneficio de estructurar el código sin crear muchas clases pequeñas dedicadas. Incluso si puede ser un mal estilo, en parte responde a mi pregunta con respecto a qué otras técnicas existen. +1
Jérôme

1

Las clases internas anónimas son algo puramente estilístico; no existen como tales dentro de la clase que contiene al nivel del archivo .class que se crea durante la compilación; todas las clases internas anónimas CREAN un archivo .class separado como si estuvieran escritas como clases de nivel superior.

Puede ver esto si navega hasta el directorio de salida (normalmente denominado "fuera") y busca la clase interna por su nombre. Verá un archivo de clase separado para su clase interna. Como recuerdo, su nombre es OuterClassName $ InnerClassName.class. Al constructor de una clase interna anónima (que se crea aunque no la escriba usted mismo) se le pasa una referencia a "esto", que por supuesto es la clase externa que lo contiene.

Así que no base su decisión en ninguna inquietud que tenga sobre "hacer muchas clases". Es puramente una cosa estilística.

Cuando comencé Java, las clases anónimas me parecían un gran desastre solo porque violaban el ritmo de la clase, que era algo así como un método de método variable variable, de repente apareció este montón de código. En realidad, todavía me irritan levemente.

Su supuesta ventaja es que facilitan la comprensión del código: no tiene que ir a otro archivo para ver qué hará el método de la clase interna anónima. Pero eso es todo.

Entonces la decisión es estilística y nada más. Si te gusta, úsalo, si no, no lo hagas.

solo quería agregar rápidamente esto: podría volver a considerar su idea de que contener una funcionalidad limitada, digamos 1 método breve, dentro de una clase dedicada constituye una ingeniería excesiva. La clase, al menos en Java, es la unidad de cohesión. El exceso de ingeniería no se mide en métodos por clase o incluso recuento de clases. OE es completamente ortogonal a ambos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.