2011-03-03 6 views
7

todos Tengo un problema con el código heredado en la aplicación ASP.NET MVC, en este código hay un servicio de clase en la capa de lógica de negocios. Esta clase tiene un método con 20 argumentos. Este método crea una instancia de objeto usando estos 20 argumentos. Cómo refactorizar este código, porque este es un problema cuando se modifican los objetos creados y es necesario cambiar los argumentos en el método. Esta clase de servicio se utiliza en la clase de controlador y en la prueba unitaria. Ayudame con refactorizar este código Gracias de antemano.Cómo refactorizar el método de clase con muchos argumentos?

EDITAR Información adicional:

puedo mostrar la firma del método

public Qualification CreateQualification(string achievableCode, string achievableTitle, 
     string accreditationRef, bool brandingPrefix, long brand, float guidedLearningHours, 
     int creditValue, long level, long type, long gradingType, long area, int subArea, 
     DateTime accreditationStartDate, DateTime accreditationEndDate, 
     DateTime lastCertDate, string nameOnCert, 
     long organisationId) 

creo que es necesario aplicar Kely y Chevex aproach, por ejemplo, puedo extraer algunas clases

uno será de parámetros:

long area, int subArea 

otra

bool brandingPrefix, long brand, 

Y después de clases extracto de sub puedo usar Introducir parámetros de objeto en lo correcto entendido?

+4

+1, pero ¿cuándo ASP.Net MVC se convierten legado :) –

+1

Tal vez significa que el legado de la misma manera Plumas Michael hace en su libro [trabajo efectivo con el código heredado (ver sección de interpretaciones modernas)] (http://en.wikipedia.org/wiki/Legacy_code). – Matt

+1

Dije código heredado me refiero a que el código fue escrito por otros desarrolladores hace mucho tiempo este código en la aplicación ASP.NET MVC – Serghei

Respuesta

14

Crea un objeto para mantener esos 20 argumentos y pasar ese objeto al método.

Por ejemplo:

public void MyMethod(MyArguments args) 
{ 
    // do stuff 
} 

EDITAR

Si bien este patrón puede ser útil para un refactor de una sola vez, si usted se encuentra con los mismos argumentos en múltiples métodos, considere Chevex's respuesta. Es el mejor enfoque.

+4

No, esto se conoce como [Introducir el objeto del parámetro] (http://www.refactoring.com /catalog/introduceParameterObject.html) refactorización. – Oded

+0

Me refería a agrupar los diferentes parámetros en un objeto separado, pero supongo que no hay garantía de que todos pertenezcan al mismo objeto desde una perspectiva de OO. –

+5

Esto es una tontería porque entonces tienes que establecer 20 parámetros en un objeto separado. Es lo mismo, simplemente se abstrae un poco para que el trabajo esté en un objeto diferente del original. En lugar de agruparlos a todos en un solo bloque, considere mi respuesta de identificar los valores relacionados y factorizarlos. OMI que es mejor que simplemente incluir todos los argumentos en un objeto argumento. Escoja datos que potencialmente podrían ir juntos y los factorice en sus propios objetos individualmente. – Chev

13

Puede tratar de identificar los datos relacionados en los argumentos y factorizarlos en sus propios objetos personalizados. Por ejemplo, fingir que tiene este objeto:

public class Person 
{ 
    public Person(string firstName, string lastName, int age, 
     string streetAddress, string city, string state, int zipCode) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
     this.Age = age; 
     this.StreetAddress = streetAddress; 
     this.City = city; 
     this.State = state; 
     this.ZipCode = zipCode; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public string StreetAddress { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public int ZipCode { get; set; } 
} 

Trate refactorización que se trata de dos clases, la extracción de la información de direcciones asociada a su propia clase y luego añadiendo ese objeto como una propiedad del objeto original:

public class Person 
{ 
    public Person(string firstName, string lastName, int age, Address address) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
     this.Age = age; 
     this.Address = address; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public Address Address { get; set; } 
} 

public class Address 
{ 
    public Address(string streetAddress, string city, string state, int zipCode) 
    { 
     this.StreetAddress = streetAddress; 
     this.City = city; 
     this.State = state; 
     this.ZipCode = zipCode; 
    } 

    public string StreetAddress { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public int ZipCode { get; set; } 
} 

Sin más información, diría que este es su mejor enfoque.

+0

Chevex- Gracias, esta es una buena idea para extraer subclases, pero el problema es que no sé exactamente cómo agrupar los parámetros en diferentes clases. – Serghei

+0

De nada. Y supongo que sería una pregunta que tendría que responder a través de la experiencia y la comunicación con el experto de dominio en el proyecto. – Chev

1

utilizar el patrón Builder

QualificationBuilder builder = new QualificationBuilder(); 
builder.setAchievableCode(achievableCode) 
     .setAchievableTitle(achievableTitle)... 
Qualification = builder.build(); 
+0

Este es un buen enfoque, pero a partir de 20 parámetros, 8 son campos obligatorios para crear un objeto de Calificación. ¿Cómo funciona esto con el constructor? – Serghei

Cuestiones relacionadas