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