Skip to content

Mejora: Aplicar patrón de diseño Adapter en AbsHandler para desacoplar frameworks de red #117

Description

@pepinxd28-glitch

Hola @jzyong,

Continuando con nuestro análisis académico de arquitectura de software, hemos identificado una oportunidad de mejora significativa en la clase com.jzy.game.engine.handler.AbsHandler.

La Situación Actual
La clase abstracta AbsHandler presenta un acoplamiento fuerte con múltiples frameworks de red externos. Actualmente, la clase depende simultáneamente de org.apache.mina.core.session.IoSession y io.netty.channel.Channel. Esto viola el Principio de Inversión de Dependencias, ya que el núcleo lógico del juego depende de detalles de implementación de bajo nivel de librerías de terceros. Además, esto complica el mantenimiento si se desea cambiar o añadir un nuevo framework de comunicaciones.

Solución Propuesta

Sugerimos aplicar el patrón estructural Adapter. El objetivo es aislar la lógica del juego de las librerías de red mediante una interfaz unificada.

1. Interfaz unificada (ISessionAdapter):

public interface ISessionAdapter {
    void write(Object message);
    void close();
    boolean isOpen();
}


public class NettySessionAdapter implements ISessionAdapter {
    private final io.netty.channel.Channel channel;
    public NettySessionAdapter(io.netty.channel.Channel channel) { this.channel = channel; }
    
    @Override public void write(Object msg) { channel.writeAndFlush(msg); }
    @Override public void close() { channel.close(); }
    @Override public boolean isOpen() { return channel.isActive(); }
}

public class MinaSessionAdapter implements ISessionAdapter {
    private final org.apache.mina.core.session.IoSession session;
    public MinaSessionAdapter(org.apache.mina.core.session.IoSession session) { this.session = session; }
    
    @Override public void write(Object msg) { session.write(msg); }
    @Override public void close() { session.closeOnFlush(); }
    @Override public boolean isOpen() { return session.isConnected(); }
}

public abstract class AbsHandler implements IHandler {
    protected ISessionAdapter sessionAdapter; 
    protected long createTime;

    public ISessionAdapter getSessionAdapter() {
        return sessionAdapter;
    }

    public void setSessionAdapter(ISessionAdapter sessionAdapter) {
        this.sessionAdapter = sessionAdapter;
    }
}

Beneficios
Esta refactorización permite que AbsHandler sea totalmente independiente de la infraestructura de red. Facilita el mantenimiento, mejora la capacidad de realizar pruebas unitarias (al poder usar objetos simulados de la sesión) y permite futuras migraciones de framework sin modificar la lógica central del juego.

Esperamos que esta sugerencia sea de valor para el proyecto.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions