需要c#中特定类型应用的概念

时间:2011-06-15 07:56:22

标签: c# architecture

我开发了一个Windows应用程序,其中表单上有一个按钮,当单击按钮时,几个系列的函数将一个接一个地运行,如下面一个

Button_Click()

{

function1();

function2();

function3();

function4();

function5();

function6();

function7();

function8();

function9();

function101();

function1();

function12();

function13();

} 

每个功能都可以完成一些工作。所以我的应用程序工作正常,但我需要知道如何以更多的结构方式设计这种工作。所以请指导我如何一个接一个地调用所有功能的结构方式。如何经验丰富的&专家开发人员将处理这些工作或他们如何一个接一个地调用函数。感谢

4 个答案:

答案 0 :(得分:3)

  • 为您的权利提供有意义的名称
  • 为您的权利提供有意义的名称
  • 为您的权利提供有意义的名称
  • 为您的权利提供有意义的名称
  • 提取公共代码的功能
  • 可能是信号/插槽/听众/观察者概念适合您。

编辑:重构示例:

假设您的代码是:

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 orderPizzaButton_Click() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();        
    requestCheese();
    requestGroundMeat();
}    
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestCheese();
        requestGroundMeat();
    } else {
        requestSalamis();
        requestAnchovis();        
        requestShitake();
        requestCheese();
        requestGroundMeat();
    }
}

步骤11是在这些函数中查找公共文件,并提取一个新的可重用函数 来自他们:

void orderPizzaButton_Click() {
    requestStrangeIngredientCombination();
}    
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestCheese();
        requestGroundMeat();
    } else {
        requestStrangeIngredientCombination();
    }
}

void requestStrangeIngredientCombination() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();
    requestCheese();
    requestGroundMeat();
}

第12步是优化您对常用代码的搜索(将其视为一种规范化):

void orderPizzaButton_Click() {
    requestStrangeIngredientCombination();
}
void lasagnePervesityLevel_Changed(int newValue) {
    if (newValue <= 0) {
        requestStandardComponents();
    } else {
        requestStrangeIngredientCombination();
    }
}

void requestStandardComponents() {
    requestCheese();
    requestGroundMeat();
}
void requestStrangeIngredientCombination() {
    requestSalamis();
    requestAnchovis();        
    requestShitake();
    requestStandardComponents();
}   

虽然在这个示例中,您似乎没有保存代码,但实际上它通常。此外,保存代码行并不是重要的事情,事情是减少冗余,因为一旦你决定你的反常烤宽面条和奇怪的披萨也应该举行辣椒和西尔维斯特史泰龙的形象,你不仅会有代码重复,但工作重复;最重要的是,有可能忘记代码中某些地方的新功能。当然,这非常糟糕,甚至对业务至关重要。假设您的客户希望在他们的烤宽面条上有西尔维斯特史泰龙的形象,正如您的营销活动所承诺的那样,然后没有订购披萨的人能够获得这种形象,而只是那些订购烤宽面条的人。

根据实际代码,存在更多重构和设计。我真的 建议您购买以下书籍。此外,最重要的经验法则:一步一步。做一个小的重构,编译,测试。

  • 重构 - 改进现有代码的设计作者:Martin Fowler在Addison-Wesley
  • C ++编码标准:101规则,指南和最佳实践C ++ ,来自Addison-Wesley的Herb Sutter,Andrei Alexandrescu(C ++深度系列)
  • 设计模式:可重复使用的面向对象软件的元素由Gamma,Helm,Johnson,Vlissides(通常称为GoF,为Gang of Four),再次在Addison-Wesley

答案 1 :(得分:2)

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

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

如果需要特定订单:

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

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?
        }
     }
}

答案 2 :(得分:0)

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

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

所以,例如:

Button_Click()
{
   Print()
}

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

答案 3 :(得分:0)

您期望得到什么答案?在不知道这些功能如何相互关联的情况下,没有人可以回答这个问题。

这些功能是否相互依赖?下一个功能是否必须在之前的功能完成之前等待?或者他们可以并行运行?这些功能总是相同还是可以改变?也许你想配置它们,从而使按钮执行动态调用。甚至可能在运行时?

如果您没有任何要求,我认为您当前的代码没有问题。

你应该看一下设计模式,比如Command Pattern或Pipes&amp;过滤模式,也许这会对你有所帮助。