Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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#_Coding Style - Fatal编程技术网

C# 做一件事——这条规则要走多远?

C# 做一件事——这条规则要走多远?,c#,coding-style,C#,Coding Style,所以在“干净的代码”一书中有“做一件事”的规则。 但我们到底要走多远呢 例如,以下语句: Settings.Default.BaudRate = baudRate; Settings.Default.COMPort = port; Settings.Default.DataBits = dataBits; Settings.Default.Handshake = handshake; Settings.Default.Parity = parity; Settings.Default.ReadT

所以在“干净的代码”一书中有“做一件事”的规则。 但我们到底要走多远呢

例如,以下语句:

Settings.Default.BaudRate = baudRate;
Settings.Default.COMPort = port;
Settings.Default.DataBits = dataBits;
Settings.Default.Handshake = handshake;
Settings.Default.Parity = parity;
Settings.Default.ReadTimeout = readTimeout;
Settings.Default.WriteTimeout = writeTimeout;
Settings.Default.CommunicationTimeout = communicationTimeout;
Settings.Default.Save(); 
好的,当然这里有不止一种说法, 但我觉得他们只是在做一件事。 保存设置

我有一个单一的功能。你真的要这件衣服吗 每个设置都有一个单一的方法


你什么时候遵守这个规则,什么时候不遵守?

我会把它们都放在一个
SaveSettings()
函数中——如果你把它们分别放在各自的函数中,你仍然需要从另一个函数调用所有这些函数。

对我来说似乎完全有效。该代码的明显方法名称是
SaveSettings
,这表明该方法只做一件事。没什么好担心的。

我假设这条规则引用了何时将函数划分为多个子函数

你有正确的想法-保存设置是“一件事”,可以在自己的功能。将每个设置放在其自己的函数中是过分的


我听到的另一条准则可能有助于你理解“一件事”的概念:如果函数超过一到两页,那么最好将其内容划分为多个子函数。

本书的下一节,每个函数的一个抽象级别,对回答这个问题有很大帮助。所有这些语句都处于同一抽象级别,因此此函数已经在做一件事,即保存设置。

是的,每个方法都应该只做一件事。但有一件事是什么

这取决于方法所处的抽象级别。保存单个设置的方法(属性)是一个相当低的抽象。下一个更高的抽象将是提议的
SaveSettings
方法


在顶部,您有一个单一的方法/函数
main
,它也只做一件事:整个程序…

在我们的团队中,我们尝试为每个函数遵循一个目的指导原则。为了帮助开发人员,我们向我们的标准添加了一个建议,如果函数超过25行,他们会考虑重构。因此,如果您有100行代码设置属性,您可能会考虑按SaveUserSettings、SaveNetworkSettings等类别划分它们。p>
最终目标是使代码更具可读性。如果您使用您的方法并将其分成20个调用,每个调用设置一个属性,我认为遵循和支持该方法将更加耗时。

孤立地查看您的代码,很难说。你可以说你的函数做了两件事——更新设置,然后保存更改。另外,您如何填充这些值,它们是作为参数传递给您的函数(更可取)还是您的函数本身获取这些值(执行其他操作)

我将遵循以下原则,总结如下:

一个类改变的原因不应该超过一个


也同样适用于方法。在您的示例中,是否有理由更新设置,但不保存它们?

示例代码将更好地回答以下问题:何时使用属性以及何时使用构造函数或方法上的参数来设置对象状态。我知道在中有一节讨论了这一点,其中讨论了组件基本模式(许多属性和组件内部状态在第一次和最后一次赋值之间可能无效)与其他模式(很多构造函数参数和方法参数以及对象的内部状态在每行代码执行后都是有效的。

我没有读过那本书,但是关于概念

“一件事”并不意味着“一行代码”。“一件事”意味着函数中的所有内容都应该在逻辑上相关

我会反驳之前的一些海报,说“保存设置”是“一件事”。也许这只是措辞上的疏忽,但我会借此机会指出潜在的陷阱。在你的情况下,它更像是“保存通信设置”,我认为这很容易符合“一件事”的定义。如果你添加“Settings.Default.customerRoyaltyDiscount=…”对于该列表,我认为您可能处于危险的境地,因为您现在将通信设置与定价计算设置混为一谈


在现实生活中,决定什么是合理的内聚不是一个公式,而是一个需要运用智慧的判断调用。计算订单总额的函数是否应该包括销售税计算?可以说这是两件事:订单上所有项目的总价和计算销售税。但你也可以这样说它只有一个:找到订单的总价格,不管涉及到什么。实际上,我经常根据逻辑的复杂性做出决定。如果计算订单总价格所需的只是一个简单的循环,通过所有项目将其价格相加,然后从表中获取销售税率并相乘,那么我可能会继续做这一切如果有更多的事情要做的话——比如我现在正在工作的系统,计算定价涉及股票与定制订单,查找各种可能的折扣,增加担保等等。我们真的需要打破它。

< P>如果你想拆分你的方法,我会考虑断开价值的映射。从对象的实际保存中删除。可以说,值的映射是一个单独的抽象级别。因此,您可以:

public void save(){
    mapSettings();
    Settings.Default.Save();
}

private void mapSettings(){
    Settings.Default.BaudRate = baudRate;
    Settings.Default.COMPort = port;
    Settings.Default.DataBits = dataBits;
    Settings.Default.Handshake = handshake;
    Settings.Default.Parity = parity;
    Settings.Default.ReadTimeout = readTimeout;
    Settings.Default.WriteTimeout = writeTimeout;
    Settings.Default.CommunicationTimeout = communicationTimeout;
}
看起来映射可能会在其他地方重复使用,或者您可能希望重复使用。此外,如果数字设置增加,它们可能会按类别进一步细分

在这种情况下,我不会说这是值得的,我是否这样做将取决于我的情绪或天空中的云量。但是,是的,从技术上讲,这是有必要的
public function buildPage() {
   $page = header();
   $page .= body();
   $page .= footer();
   return $page;
}
public function sendMail() {
   $user = $this->getUser();
   $this->mailer->content("send this message!")
       ->to($user->email)->send();
}
public function sendMail($email,$message) {
   $this->mailer->content($message)->to($email)->send();
}