逻辑分组方法

Grouping methods logically

基本上我有一个带有私有方法的 class 和许多调用此私有方法的 public 方法。我想在逻辑上对这些 public 方法进行分组(最好是分隔文件),以便组织起来,更易于使用和维护。

public class MainClass
{
    private void Process(string message)
    {
        // ...
    }

    public void MethodA1(string text)
    {
        string msg = "aaa" + text;
        Process(msg);
    }
    public void MethodA2(int no)
    {
        string msg = "aaaaa" + no;
        Process(msg);
    }

    public void MethodB(string text)
    {
        string msg = "bb" + text;
        Process(msg);
    }

    // lots of similar methods here
}

现在我这样称呼他们:

MainClass myMainClass = new MainClass();
myMainClass.MethodA1("x");
myMainClass.MethodA2(5);
myMainClass.MethodB("y");

我希望能够这样称呼他们:

myMainClass.A.Method1("x");
myMainClass.A.Method2(5);
myMainClass.B.Method("y");

如何实现?可能有一种我不知道的简单方法。

您可以使用嵌套 classes:

public class MainClass
{
    // private method here

    public class A
    {
        // methods for A go here
    }

    public class B
    {
        // methods for B go here
    }
}

如果您希望它们在不同的文件中,您可以对 MainClass

使用部分 class
// file 1
public partial class MainClass
{
    public class A { }
}

// file 2
public partial class MainClass
{
    public class B { }
}

您正在寻找 object composition

In computer science, object composition (not to be confused with function composition) is a way to combine simple objects or data types into more complex ones.

顺便说一句,你不应该认为这样的重构逻辑分组方法:只是你需要用一个清除 separation of concerns:

In computer science, separation of concerns (SoC) is a design principle for separating a computer program into distinct sections, such that each section addresses a separate concern.

实际例子:

public class A
{
    // B is associated with A
    public B B { get; set; }
}

public class B
{
     public void DoStuff() 
     {
     }
}

A a = new A();
a.B = new B();
a.B.DoStuff();

您可以移动方法来分隔 类。 类 可能是新的 类,依赖于 MainClass,使用 public/internal Process 方法,嵌套在 MainClass 中或继承自 MainClass。继承示例:

public class MainClass
{
   protected void Process(string message)
   {
    // ...
   }
}

public class A: MainClass
{
    // methods for A go here
}

public class B: MainClass
{
    // methods for B go here
}