gpt4 book ai didi

c# - 方法调用中的分配不好的做法?

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

这是我向 Stackoverflow 提出的第一个问题,尽管我已经成为消费者多年。如果我违反规则,请原谅我。那当然不是我的意图。我已经认真审查了规则,并相信我在可接受的范围内。但是,我希望您能指出使用错误(如果存在),以便我将来能够更加合规。

我教高中生编程。这个学期我们在做C#。上周我们在学习递归。我分配了几个可以用递归解决的经典问题,其中之一是求幂。

我的一个学生提交了以下代码作为使用递归求幂的解决方案(他允许我在此处发布)。方法调用中的作业让我胆战心惊,但当我告诉他这是不好的做法时,他抗议说“它有效”,对他来说“有意义”,而且他“一直都这样做” ".

static void Recur(int n1, int n2, int n3) 
{
if (n2 > 0)
{
Recur(n1, n2 - 1, n3 *= n1); // this is the line in question
}
else
{
Console.WriteLine("The number calculated recursively is: {0}", n3);
}
}

我很难想出一些具体的东西来告诉我的学生为什么在方法调用中进行赋值通常是不好的做法,除了 1) 意外副作用的可能性,以及 2)维护。

我已经在网上搜索了关于这个问题的每一个我能构造的短语,但是却一无所获。我确实看到了对 Robert C. Martin 的一本名为“整洁代码”的书的引用,但我没有。

我与学生的关系有点像 parent 的关系。除非我可以通过独立消息来源证实,否则他们有时不会对我所说的话给予太多支持。如果我能指出关于在方法调用中分配作业的明确声明,我的学生会更倾向于改掉这种烦人的习惯。

这种用法会打扰其他人吗?我是否期望他改变他做事的方式?他才 15 岁,但前途一片光明。他是那些刚刚“明白”的学生之一。我不希望他养成不良习惯。

感谢您的宝贵时间和意见。

最佳答案

发布的代码中有很多地方可以改进:

  1. 保持一致

    为什么调用Recur(n1, n2 =- 1, n3 *= n1)?为什么 n3 受到不同对待?这可能会在审查/维护代码时造成困惑。

  2. 不要做不必要或多余的工作

    Recur(n1, n2 - 1, n3 *= n1) 之后是否使用过 n3?不?那为什么要浪费时间分配一个从未使用过的值呢?

  3. 不改变方法参数被认为是一种很好的做法(当然,除非它们是通过引用传递的)。为什么?因为它使调试和理解代码的工作方式变得更加困难;随着方法的执行,初始条件发生变化,这使得跟踪可能的错误、优化、改进等变得更加困难。

总而言之,我避免使用这些模式,因为我的内存力真的很差:

var i = 0;
Foo(i += 1);
Bar(i);

传递给 Foo 的是什么?它是 0 还是 1?我从来不记得,我每次都得查一下。审查此代码的人很可能会遇到同样的问题。这些巧妙的技巧不会使代码运行得更快或更好,而且它避免了总共一行代码……不值得。

关于c# - 方法调用中的分配不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977143/

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