C# c语言中特定类型应用程序的需求概念#

C# c语言中特定类型应用程序的需求概念#,c#,architecture,C#,Architecture,我开发了一个Windows应用程序,其中表单上有一个按钮,当单击按钮时,很少有一系列函数会像下面这样一个接一个地运行 Button_Click() { function1(); function2(); function3(); function4(); function5(); function6(); function7(); function8(); function9(); function101(); function1(); function12(); f

我开发了一个Windows应用程序,其中表单上有一个按钮,当单击按钮时,很少有一系列函数会像下面这样一个接一个地运行

Button_Click()

{

function1();

function2();

function3();

function4();

function5();

function6();

function7();

function8();

function9();

function101();

function1();

function12();

function13();

} 
每个函数都做一些工作。因此,我的应用程序运行良好,但我需要知道如何以更结构化的方式设计此类工作。所以请指导我如何一个接一个地调用所有函数。一个经验丰富的专家开发人员将如何处理这些工作,或者他们如何一个接一个地调用函数。谢谢

  • 给你的实体起一个有意义的名字
  • 给你的实体起一个有意义的名字
  • 给你的实体起一个有意义的名字
  • 给你的实体起一个有意义的名字
  • 为公共代码提取函数
  • 信号/插槽/侦听器/观察者概念可能适合您
编辑:重构示例:

假设您的代码是:

void Button1_Click() {
    function1();
    function2();
    function3();
    function4();
    function5();
}    
void Button2_Checked(int variable0) {
    if (variable0) {
        function1();
        function2();
    } else {
        function1();
        function2();
        function3();     
        function4();
        function5();
    }
}
步骤0-10是为所有按钮、功能、, 变量、参数(一次只重命名一个实体;为了发布,我跳过了这个):

void order pizzabutton\u Click(){
请求salamis();
凤尾鱼();
requestShitake();
请求奶酪();
肉糜();
}    
void lasagnePervesityLevel_已更改(int newValue){

如果(newValue如果您正在创建的功能需要按该顺序执行这些函数,那么为什么不将这些调用封装在一个方法中?这将给您提供更高级别的封装,并且意味着可以在其他地方调用此函数,例如从菜单工具栏调用,而不必担心是否所有函数都是ca按正确的顺序排列

为函数指定更有意义的名称也是值得的,但我确信您只是出于示例目的将它们命名为functionX()

例如:

Button_Click()
{
   Print()
}

private void Print()
{
  function1();
  function2();
  function3();
  function4();
  function5();
  function6();
  function7();
  function8();
  function9();
  function10();
  function11();
  function12();
  function13();
}

这完全取决于函数是否需要按特定顺序调用

如果不是:使用发布/订阅模式

如果需要特定订单:

不要使用函数,将函数添加到类中并使用如下管道

public interface IPipeline
{
    void AddLast(IPipelineHandler handler);
    void AddFirst(IPipelineHandler handler);

    void Invoke(IPipelineContext context);
}

public interface IPipelineContext
{
   Form SourceForm {get; }

   // The result that the pipeline should produce.  (change from object to a specific type)
   object Result {get; }

   //and other properties that each handler will need.
}

public interface IPipelineHandler
{
    string Name {get; }
    void Process(IPipelineContext context);
}
在管道实现中,使用相同的上下文调用每个处理程序:

public void Invoke(IPipelineContext context)
{
     foreach (handler in _handlers)
     {
        try
        {
             handler.Process(context);
        }
        catch (Exception err)
        {
            //abort or continue with the next handler?
        }
     }
}

你期望得到什么样的答案?如果不知道函数之间是如何相互关联的,没有人能回答这个问题

这些函数是否相互依赖?下一个函数是否必须在前一个函数完成之前等待?或者它们可能并行运行?这些函数是否总是相同的,或者它们是否可以更改?也许您希望对它们进行配置,从而使按钮执行的调用是动态的。甚至可能在运行时也可以

如果您没有这些要求,我认为您当前的代码没有问题


您应该看看设计模式,如命令模式或管道与过滤器模式,也许这对您有所帮助。

和更高级别的抽象,这可以提高代码的可读性。如果此功能在其他地方执行,那么您只需进行一次调用,而不是14次。这也可以通过模拟进行更好的单元测试。--编辑--Hmm,似乎我正在回复的人删除了他们的评论。可能是Button_Click已经封装了这些函数?所以你写了同样的东西。当然,这是真的。对于这样的示例代码,很难知道完整的域。Button_Click()向我指示了.NET Click处理模式,因此响应。因此,如果Button_Click()是一个封装级别,那么我对更有意义的函数名的评论就更具相关性了。感谢您指出这一点!这里我给您提供了pesudo代码,这就是为什么我没有指定有意义的名称。我想情况就是这样:)希望我的回答能有所帮助!我应该遵循哪种设计模式来处理这种情况。你能展示一下处理这种情况的示例代码吗?我不确定这是否真的值得一个设计模式。程序员通常会有意义地命名事物,并将重复的内容放入单独的、可重用的实体中。我将给出一个示例。我我只是想知道如何使用正确的设计模式来处理我的情况。函数之间并不相互依赖。是的,下一个函数将等待上一个函数完成。函数将始终相同。因此,现在用小代码告诉我如何使用正确的设计模式来实现这种情况。谢谢。在这种情况下,您当前的代码很好。您是否有g你的代码有什么问题,是什么让你认为你的代码错了?你的代码很好,但我无法理解如何在我的场景中使用它。基本上,我不是很高级的用户。如果你能给我完整的代码,我的所有函数1(),函数2()就更好了等等将被调用一个接一个与您的上述代码。谢谢。我只需要看看我的功能可以被调用与您的实现。plzz帮助我。谢谢
Button_Click()
{
   Print()
}

private void Print()
{
  function1();
  function2();
  function3();
  function4();
  function5();
  function6();
  function7();
  function8();
  function9();
  function10();
  function11();
  function12();
  function13();
}
public interface IPipeline
{
    void AddLast(IPipelineHandler handler);
    void AddFirst(IPipelineHandler handler);

    void Invoke(IPipelineContext context);
}

public interface IPipelineContext
{
   Form SourceForm {get; }

   // The result that the pipeline should produce.  (change from object to a specific type)
   object Result {get; }

   //and other properties that each handler will need.
}

public interface IPipelineHandler
{
    string Name {get; }
    void Process(IPipelineContext context);
}
public void Invoke(IPipelineContext context)
{
     foreach (handler in _handlers)
     {
        try
        {
             handler.Process(context);
        }
        catch (Exception err)
        {
            //abort or continue with the next handler?
        }
     }
}