Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在使用事件处理程序作为;“可重用代码”;坏习惯? 形势_C#_.net_Oop - Fatal编程技术网

C# 正在使用事件处理程序作为;“可重用代码”;坏习惯? 形势

C# 正在使用事件处理程序作为;“可重用代码”;坏习惯? 形势,c#,.net,oop,C#,.net,Oop,这是一个概念性的问题,我将尽可能地澄清。如果你对概念性问题不感兴趣,就不要读这个问题 好的,我正在编写一些预先编写的代码,在这些代码中,它们将事件处理程序作为某种形式的OOP重用 以下是一些事件处理程序的示例: protected void btnSomeButton_Click(object sender, Eventargs e) { //SOME LOGIC } “重用”上述事件处理程序的示例: protected void btnSomeButton_Click(object

这是一个概念性的问题,我将尽可能地澄清。如果你对概念性问题不感兴趣,就不要读这个问题

好的,我正在编写一些预先编写的代码,在这些代码中,它们将事件处理程序作为某种形式的OOP重用

以下是一些事件处理程序的示例:

protected void btnSomeButton_Click(object sender, Eventargs e)
{
    //SOME LOGIC
}
“重用”上述事件处理程序的示例:

protected void btnSomeButton_Click(object sender, Eventargs e)
{
    //SOME LOGIC
}
注意:这是在Web应用程序中的任意点调用的,其目的是重用//SOME逻辑部分

为了清晰起见,请给出一些要点

  • 上述方法有效
  • 事件处理程序在其正常意义下工作
我认为应该做的事 根据我的推理,正确的方法是创建一个单独的方法,并在尝试重用代码时调用此方法。(请随意纠正我)

要重用代码,请执行以下操作:

{
    somefunction()
}
方法如下:

void somefunction()
{
    //SOME LOGIC
}
问题是我的问题 我希望能够告诉我的上级我为什么要更改此代码。他们所看到的只是这段代码“很棒”,但看着这段代码风格会伤到我的眼睛


没有按照第一个示例的编码方式进行编码的概念原因是什么?或者这是可以接受的,我应该离开它吗?

事件处理程序是松散耦合的,即触发事件的代码不知道其调用的方法,直到后者被注册

如果然后从代码中的其他地方调用该方法,通过将其作为
操作传入,然后以这种方式调用,则调用代码在注入之前仍然不知道该方法,因此它仍然是松散耦合的

通过直接调用事件处理程序将事件处理程序与调用代码紧密耦合。如果您想稍后更改事件处理程序,那么可能会中断该代码,并且必须首先检查对它的所有引用(这些引用可能会在整个代码中传播)。测试也变得更加困难,因为紧密耦合的代码本质上更难分离成单元,因此测试变得更加复杂,需要更多的模拟,并且更加脆弱


事件处理程序应该是私有的,并且只能通过“告诉,不要问”(例如针对事件注册)暴露于代码的其他部分。

我同意您将代码放入单独函数的推理。
在处理这类重用时,我遇到的主要问题是,人们通常不希望某个看起来像框架事件处理程序的东西被框架以外的东西调用。
示例中的参数说明了一个非常重要的点:现在不使用它们,但将来可能会发生变化。框架通常为参数提供某些保证,例如,它们永远不会为
null
:编辑代码时,可能会说“为什么我不应该信任框架?”并忽略任何
null
检查。对于仅通过
null
的非框架代码,这将失败
我经常遇到的另一个问题是,在“手动”调用的情况下,处理程序稍后可能会使用不可取甚至有害的代码进行扩展。我想到的一个简单示例是记录类似“用户单击按钮”的内容,而实际上用户没有这样做


我更喜欢将在框架处理程序中执行的每个操作放入自己的函数中,该函数有一个明确的名称,可以自己调用。

概念上的原因是什么:对称性和一致性(一个处理程序向前,另一个不向前)。但这也意味着一个事件处理程序的变化会影响另一个事件处理程序。调用另一个方法是共享代码的指示符。然而:这是一个非常主观的方面。我同意btnSomeButton_Click(null,null)是一个快速而肮脏的编码,即使我有时使用它。但很难找到强有力的论据来证明(小规模)再生成的合理性。“上级”总是有一个非常不同的观点,一个开发人员花时间进行风格改变而不是进行冲刺,在他们有用的活动列表中永远排在第二位。当您有其他理由更改源代码文件时,只需进行更改。对于那些投票以基于意见的方式结束此问题的人,请正确阅读选择该问题作为结束原因的指南:许多好的问题都会根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于观点,而不是事实、参考资料或具体的专业知识。这个问题很可能基于专家经验有一定程度的观点,但它们是基于事实、参考资料或特定的专业知识。所以它不应该关闭。这是有道理的。使测试和调试变得非常复杂。因此,我有权建议删除对这些事件处理程序的重用?我不建议简单地切换到
somefunction()
选项,因为您仍然在耦合。相反,你应该(至少从长远来看)考虑使用依赖注入,或者将
somefunction()
(或者更可能是它的类)传递给需要调用它的代码的其他部分在理解代码的过程中,不仅仅是代码“起作用”,而且质量同样重要,那么我完全支持:)这两个答案都很好,但您给出了一个实际示例,这正是我所需要的。谢谢
void somefunction()
{
    //SOME LOGIC
}