Como lidiar con una larga lista de parametros que cambia sutilmente en la cadena de llamadas.

Tengo un método que tiene una lista de parámetros que ya se volvió ridícula y para variar le tengo que poner un parámetro más. Estoy pensando en aplicar "extract parameter object" pero sucede que el método solo cambia sutilmente la lista para pasarsela a otro objeto que hace lo mismo.

Digamos que es un fronend controller asi:

    class FrontEndController {
        void search( String name, String tags, String site, String id, String other ) {
            //some stuff here
            Tag[] tagsArray = fromString( tags );
            Site  siteObj   = fromString( site );
            ID    idObj     = fromString( id );
            Result r = businessObject.search( name, tagsArray, siteObj, idObj, other );
            display( r );
        }
      }
    ....
    class BusinessObject {
        ...
        Result search( String name, Tag[] tags, Site site, ID id, String other ) {
            Other [] somethingElse = dao.fetch( other );
            DbResult r = dao.search( name, tags, site, id, somethingElse );
            return transform( r );
        }
    }
    class SomeDao {
        DbResult search( String name, Tag[] tags, Site site, ID id, Other [] other ) {
        ...
        }
    }

Como se ve, hay una sutil transformación en la cadena de llamadas.

Una cosa que estoy intentando es crear un command object que contenga todo:

      class ParameterObject {
           String name;
           String tags;
           String site;
           String id;
           String other;
 
           String name;
           Tag[] tagsArray;
           Site siteObj;
           ID idObj;
           Other [] otherArray;
           // getters / setters
     }

Y hacer el cambio.

      class FrontEndController {
          void search( ParameterObject parameter ) {
              parameter.setTagsArray(fromString(parameter.getTags()))
              parameter.setSiteObj(fromString(parameter.getSite()))
              parameter.setIdObj(fromString(parameter.getId()))
              Result r = businessObject.search( parameter );
              display( r );
        }
      }
    ....
    class BusinessObject {
        ...
        Result search(ParameterObject parameter ) {
            parameter.setSomething( dao.fetch( parameter.getOther() ))
            DbResult r = dao.search( parameter  );
            return transform( r );
        }
    }
    class SomeDao {
        DbResult search( ParameterObject parameter ) {
        ...
        }
    }

Pero al final se ve un tanto extraño y me pregunto si en realidad estoy mejorando el código. También el nombre duplicado (site vs siteObj ) se me hace raro.

Opiniones

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Flexible vs Inflexible

Hola Oscar, la lógica se ve bien. Veo que tendrías que tomar algunas decisiones.

La primer decisión respecto a la complejidad es si esa clase va a quedar Genérica o Especifica. Si decides hacerla especifica en lugar de ser ParameterObject tendría que ser ParameterParaUnaClase, si es especifica te recomendaría asignarle una interfaz.

El caso cuando algo queda genérico no es malo aunque se vuelve un poco complejo, mi recomendación es que quede bien documentada, si te es posible mantener el desarrollo para este componente por un solo responsable mejor.

Saludos

Imagen de julgo

si se ve bien también podrias

si se ve bien también podrias crear tres clases con una mas general de las cuales extiendan las otras
y al tener el command object no seria mejor usar los setters antes y ya no en el método?:

void search( ParameterObject parameter ) {
              parameter.setTagsArray(fromString(parameter.getTags()))
              parameter.setSiteObj(fromString(parameter.getSite()))
              parameter.setIdObj(fromString(parameter.getId()))
              Result r = businessObject.search( parameter );
              display( r );
        }