-1

在一个太长的方法中,它会滚动到屏幕外。只是为了让我在编程时更轻松,如果我想引用一个类的变量,我可以使用Meorthis对象,具体取决于我使用的语言。

eg. Me.var1 = "Hello"

是否有一个对象(如Me)可以轻松引用函数的参数?

eg. params.par1 = "World"
4

5 回答 5

6

语言中没有这样的功能。.NET 抖动对局部变量和方法参数进行了特殊处理,它们在运行时进行了大量优化。任何 .NET 会做的,或者你会做的,来捕获这些变量都会破坏这种优化。

一个非常简单的解决方案是使用 Window + Split,它为您的代码提供了两个视图。将顶部滚动到方法标题,在底部写入代码。您可以调整分离器以在底部窗口中为您提供更多空间。

利用 IntelliSense 将是另一种方式。用一个小字符串作为参数名称的前缀,例如“par”。然后在您的代码中键入“par”会自动在 IntelliSense 弹出窗口中为您提供参数名称列表。

然而,这些只是解决真正问题的创可贴。一旦您发现自己达到了这样的程度,您的第一个想法应该是拆分函数中的代码以使其更小。经过 30 年的编码,我发现了一些铁的事实:

  • 长方法有更多的错误。有一个度量标准,称为“圈复杂度”。数字越高,代码被破坏的可能性就越大。Visual Studio 的良好支持,这篇博文很有用。
  • 代码的缩进不应超过 3 级。到目前为止,发现圈复杂度的最简单方法是在不运行工具的情况下失控。
  • 方法永远不应该大于适合屏幕的内容。任何不适合的代码都是产生编译错误和错误的认知税。这有一个推论,拥有大显示器的程序员会产生更多的错误。我使用的硬性规则是受使用 DOS 编辑器的启发,一个方法不应超过 25 行代码。
  • 宽代码会产生一种特殊的错误,即您看不到的讨厌的错误。任何不在屏幕右侧的代码都是可能有错误的代码,可能需要很长时间才能发现。VB.NET 特别容易出现这种错误,因为它使用行尾作为语句终止符。顺便说一句,在 VS2010 中得到了很大改进,下划线现在在许多情况下是可选的。总是打破你的线路以避免这种错误。
  • 提前计划并编写可维护的代码。维护的代码永远不会小于原始代码。如果您已经在编写原始代码时遇到了麻烦,那么根据定义,您将无法维护它。你必须从小处着手。
  • 始终先设计,后编码。长方法是一个强有力的指标,表明在开始编码之前没有足够长地考虑代码。除了编写无法完成工作的正确代码之外,它本身就是一个强大的错误诱导器。
于 2013-05-23T10:32:03.730 回答
0

一种简单的方法是将您的参数封装在一个对象中,这样您就可以引用它,而智能型(或任何预测功能)将向您显示您有哪些可用的属性,而无需向上滚动。像这样

public class MyParamObject{
    public string FirstParam {get;set;}
    public string SecondParam {get;set;}
}

然后你可以改变你的方法

public void MyReallyOvergrownMethod(string firstParam, string secondParam){...

public void MyReallyOvergrownMethod(MyParamObject params){...

然后您可以在方法中使用这样的 params 参数

//Deep inside the method
if(params.FirstParam == "SomeValue"{//Do something

这是解决问题的最佳解决方案,最好通过重构您的方法来解决。查看循环和条件,并将它们放入单独的私有方法中,这些方法以它们的作用命名。如果你搜索 cleancoders,这上面有很多东西。

于 2013-05-23T09:33:46.083 回答
0

最简洁的答案是不。似乎您希望使用它来区分具有相同名称的函数参数和字段的参数范围和类范围,不幸的是您不能。使用不同的命名方案,或执行以下操作:

public class MyClass {
  private string myString;
  private int myInt;
  public MyClass(string myString) {
    this.myString = myString;
  }
  public int DoStuff(int myInt) {
    this.myInt += myInt;
    return this.myInt;
  }
}

要真正清楚并避免出现问题,您可以更改名称:

public class MyClass {
  private string m_myString;
  private int m_myInt;
  public MyClass(string myString) {
    m_myString = myString;
  }
  public int DoStuff(int myInt) {
    m_myInt += myInt;
    return m_myInt;
  }
}

你真的应该从在代码之前编写一个测试开始,然后你可以检查你没有在你的代码中意外地混淆了东西。

脚注

我将其包括在内,因为来到此问题标题的人可能正在寻找以下信息。

当你说

只是为了便于编程 - 如果我在一个函数中走得很远,我想看看有哪些参数而不必向上滚动

如果您出于其他原因真的想从代码内部查看参数,那么您需要反思。这很慢,它的典型用途是找到一种方法,然后在该方法中反映参数。有关非常全面的示例,请参阅MSDN - ParameterInfo 类。代码的相关部分是:

foreach (MemberInfo mi in typeof(MyClass).GetMembers() )
{
  // If the member is a method, display information about its parameters. 
  if (mi.MemberType==MemberTypes.Method)
  {
  foreach ( ParameterInfo pi in ((MethodInfo) mi).GetParameters() )
  {
    Console.WriteLine("Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name);
  }
}
于 2013-05-23T09:25:08.823 回答
0

您应该能够使用GetParameters()反射方法

MethodInfo barMI = bar.GetMethod("Foo");
ParameterInfo[] pars = barMI.GetParameters();
foreach (ParameterInfo p in pars) 
{
    Console.WriteLine(p.Name);
}

您可以在运行时使用它。但是为了您的目标,我会尝试重构函数的数量及其名称。我尝试将代码长度保持在每行 80 个符号以下,并将类中的行数保持在 100 以下。这并不总是可能的,但解耦并保持类简单是一个很好的目标。

于 2013-05-23T09:25:26.397 回答
0

根据您的评论“只是为了便于编程 - 如果我在函数中走得很远,我想看看有哪些参数而不必向上滚动”:在 Visual Studio 中,显示代码,就在滚动条上方有一点你可以抓住并拉下以拆分窗口。然后,您可以在一个窗格中显示您的函数声明,并在另一个窗格中尽可能多地滚动。或者您可以使用窗口菜单->拆分。

于 2013-05-23T09:52:56.637 回答