Pregunta

Yo tenía una clase que había un montón de métodos:

public class MyClass {
    public bool checkConditions() {
        return checkCondition1() &&
               checkCondition2() &&
               checkCondition3();
    }

...conditions methods

    public void DoProcess() {
        FirstPartOfProcess();
        SecondPartOfProcess();
        ThirdPartOfProcess();
    }

...process methods
}

Me he identificado dos "vital" áreas de trabajo, y decidió extraer dichos métodos a las clases de su propio:

public class MyClass {
    private readonly MyClassConditions _conditions = new ...;
    private readonly MyClassProcessExecution = new ...;

    public bool checkConditions() {
        return _conditions.checkConditions();
    }

    public void DoProcess() {
        _process.DoProcess();
    }
}

En Java, me gustaría definir MyClassConditions y MyClassProcessExecution como package protected, pero no puedo hacerlo en C#.


¿Cómo usted va sobre hacer esto en C#?

La configuración de ambos, como en las clases de las clases internas de Miclase?

Tengo 2 opciones:Yo tampoco definir dentro de MyClass, tener todo en el mismo archivo, lo que se ve confuso y feo, o puedo definir MyClass como partial class, tener un archivo para MyClass, otros para MyClassConditions y otros para MyClassProcessExecution.

Los define como interna?

No me gusta que gran parte de la interna del modificador, como no me parece que estas clases de añadir ningún valor en absoluto por el resto de mi programa/asamblea, y me gustaría ocultar ellos si es posible.No es como que va a ser útil o reutilizable en cualquier otra parte del programa.

Mantenerlos como público?

Yo no puedo ver por qué, pero me he permitido esta opción aquí.

Cualquier otro?

El nombre!

Gracias

¿Fue útil?

Solución

Su mejor opción es probablemente usar clases parciales y poner los tres grupos de código en archivos separados que se suman a la misma clase. Luego puede hacer que el código condicional y de proceso sea privado para que solo la clase en sí pueda acceder a ellos.

Otros consejos

Para clases de tipo "auxiliar" que no se utilizarán fuera del ensamblaje actual, Internal es el camino a seguir si los métodos serán utilizados por varias clases.

Para los métodos que solo serán utilizados por una sola clase, los haría privados para la clase o usaría clases internas si en realidad es una clase que no se usa en ningún otro lugar. También puede tener en cuenta el código en métodos estáticos si el código no depende de ningún miembro (no estático) de su clase.

Puedo definir MyClass como una clase parcial, tener un archivo para MyClass, otro para MyClassConditions y otros para MyClassProcessExecution.

Tal vez sea mi fondo C ++, pero este es mi enfoque estándar, aunque agrupo pequeñas clases de ayuda en un solo archivo.

Así, en uno de mis proyectos actuales, el Product La clase se divide entre Product.cs y ProductPrivate.cs

Yo voy por algo más en la cuestión de lo público / protegido / privado no puede ser resuelto específicamente por esto, pero creo que se presta mucho mejor de mantenimiento, a continuación, un montón de anidado, clases internas.

Ya que parece que has conseguido un conjunto de pasos de un algoritmo secuencial, donde la ejecución de un paso puede o no puede ser dependiente de la ejecución del paso anterior.Este tipo de secuencia de paso de procesamiento puede utilizar a veces la La cadena de Responsabilidad Patrón, aunque es transformado un poco de su intención original.Centrarse únicamente en su "método de procesamiento", por ejemplo, a partir de algo como la siguiente:

class LargeClass
{
public void DoProcess()
{
  if (DoProcess1())
  {
    if (DoProcess2())
    {
      DoProcess3();
    }
  }
}

protected bool DoProcess1()
{
...
}

protected bool DoProcess2()
{
...
}

protected bool DoProcess3()
{
...
}

}

El uso de de la Cadena de Responsabilidad, esto podría ser descompuesto en un conjunto de clases concretas para cada paso, que heredan de algunos abstractos paso de la clase.El resumen del paso de la clase es más responsable de asegurarse de que el siguiente paso es que se llama, si las condiciones previas necesarias para que se cumplan.

public class AbstractStep
{
    public AbstractStep NextStep { get; set; }

    public virtual bool ExecuteStep
    {
       if (NextStep != null)
       {
         return NextStep.ExecuteStep();
       }
    }  
}

public class ConcreteStep1 : AbstractStep
{
    public bool ExecuteStep
    {
       // execute DoProcess1 stuff
       // call base
       return base.ExecuteStep();
    }
}

...

public class ConcreteStep3 : AbstractStep
{
     public bool ExecuteStep
     { 
        // Execute DoProcess3 stuff
        // call base
        return true; // or false?
      }
}

Para ello, usted, en alguna parte del código, haga lo siguiente:

var stepOne = new ConcreteStep1();
var stepTwo = new ConcreteStep2();
var stepThree = new ConcreteStep3();
stepOne.NextStep = stepTwo;
stepTwo.NextStep = stepThree;

bool success = stepOne.ExecuteStep();

Esto puede ayudar a limpiar el código de la hinchazón que tiene en su única clase - lo he utilizado para un par de tipo secuencial de los algoritmos en el pasado y su ayudó a aislar cada paso muy bien.Que obviamente podría aplicar la misma idea a su condición de comprobación (o construir en cada paso, si es que aplica).Usted puede también hacer alguna variación de esta en términos de pasar de estado entre los pasos por tener la ExecuteStep método de tomar un parámetro con un estado objeto de algún tipo.

Por supuesto, si lo que verdaderamente te preocupa en este post es simplemente ocultar los diversos pasos, entonces sí, podría hacer que cada uno de sus pasos que se enuncian a una clase protegida dentro de su clase que crea los pasos.A menos que usted está exponiendo su biblioteca a los clientes de una forma o de moda, sin embargo, y usted no quiere tener ningún tipo de visibilidad en sus pasos de ejecución, esto parece ser una pequeña preocupación, a continuación, haciendo que el código sea fácil de mantener.

Cree las clases con el mismo modificador de acceso que los métodos que ha refactorizado. Las clases parciales solo son realmente útiles cuando tiene varias personas o el código Automat5ed que generan herramientas que frecuentemente modifican las mismas clases. Realmente evitan que la fuente fusione el infierno donde su control de origen combina su código porque no puede fusionar múltiples ediciones al mismo archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top