gpt4 book ai didi

c# - 如何在一个带有被动重载的大方法和一堆小的重载之间做出选择,每个方法都做少量的工作?

转载 作者:太空狗 更新时间:2023-10-29 20:32:14 24 4
gpt4 key购买 nike

有两种实现重载的方法。第一个是在一个方法/构造函数中执行所有操作并从其他重载调用它,这会导致更长的方法体。第二个是在每个重载中做最少的事情,因此有时代码难以导航并且理解哪个重载做了什么。

例如,如果类 Cat 的两个重载是:

public Cat(string name, int? weight, Color mainColor);
public Cat(string name);

有两种实现方式:

第一种类型

public Cat(string name, int? weight, Color mainColor)
{
// Initialize everything.
this.name = name;
if (weight.HasValue) this.weight = weight.Value;

// There is a bug here (see the anwer of @Timwi): mainColor can be null.
this.colors = new List<Colors>(new[] { mainColor });
}

public Cat(string name)
: this(name, null, null)
{
// Nothing else to do: everything is done in the overload.
}

第二种

public Cat(string name)
{
// Initialize the minimum.
this.name = name;
this.colors = new List<Colors>();
}

public Cat(string name, int? weight, Color mainColor)
: this(name)
{
// Do the remaining work, not done in the overload.
if (weight.HasValue) this.weight = weight.Value;
this.colors.Add(mainColor);
}

问题

  1. 如何称呼这两种类型的重载(以便能够在互联网或书籍中查找更多信息)?
  2. 在这些类型之间进行选择时,必须考虑的主要问题/因素是什么?

注意:由于 C# 4.0 允许您指定可选参数,为避免歧义,假设我只讨论 C# 3.0。

最佳答案

我认为这是另一个例子,其中没有一个单一的、教条的答案可以合理地涵盖所有情况。我总是会查看个案并根据所有可用因素做出决定。

一个因素是第一个有很多如果。您的代码也有一个错误:您将在颜色列表中添加一个 null 值;为了修复那个错误,你需要更多的ifs。这样的构造函数很容易变得困惑。无数的 if 表明有几种情况的逻辑大不相同,因此为每种情况使用单独的构造函数是非常有意义的。

然而,在没有那么多 if 的情况下,所有逻辑都是相同的,所以现在调用一个构造函数来执行那个逻辑并且做得很好是有意义的。然后只有一个地方可以维护它。

另一个因素是,在您的示例中,第一个未初始化 weight这不一定是坏事,因为幸运的是 C# 中的默认初始化是可预测的;但如果 weight 的字段声明将其初始化为非零值并且只有一些构造函数用另一个值覆盖该默认值,我会认为它是错误的形式。构造函数参数和/或 this(...) 调用是记录该字段默认值的更好位置。 (最好是构造函数参数,因为那样即使客户端程序员也能看到默认值,但显然这需要 C# 4。)当然,也可以初始化所有使用字段初始化器的字段并将构造函数留空,如果您只有一个没有参数的构造函数,这是一种合理的策略。

是的,正如您所说,您不希望方法体变得太长,但您也不希望代码变得太难以导航,因此您需要在两者之间取得平衡给定的情况。

关于c# - 如何在一个带有被动重载的大方法和一堆小的重载之间做出选择,每个方法都做少量的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com