方法调用不良做法的分配?

Jav*_*ive 7 c# methods side-effects assignment-operator

这是我对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); 
   } 
} 
Run Code Online (Sandbox Code Playgroud)

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

我已经在网上搜索了我可以构建的关于这个问题的每一个短语,但是我已经空手而归了.我确实看到了罗伯特·C·马丁的一本名为"清洁代码"的书,我并不拥有.

我与学生的关系有点像父母的关系.除非我能用独立的资料证明,否则他们有时候不会把大量的股票放在我所说的内容中.如果我可以指出一个关于在一个方法调用中放置任务的明确声明,我的学生将更倾向于停止这种烦人的习惯.

这种用法是否会困扰其他人?我是否希望他改变他一直做事的方式?他已经15岁了,但在他前面有一个充满希望的未来.他是那些只是"得到它"的学生之一.我不希望他发展不良做法.

感谢您的时间和意见.

InB*_*een 4

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

  1. 始终如一

    为什么没有电话Recur(n1, n2 =- 1, n3 *= n1)?为何受到n3不同对待?这可能会在审查/维护代码时引起混乱。

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

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

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

尽管如此,我还是避免使用这些模式,因为我的记忆力真的很差:

var i = 0;
Foo(i += 1);
Bar(i);
Run Code Online (Sandbox Code Playgroud)

传入什么Foo?是01?我从来不记得,每次我都要查一下。任何检查此代码的人都可能遇到同样的问题。这些巧妙的技巧并不会让代码运行得更快或更好,而且它避免了总共一行代码……不值得。