【问题标题】:Powershell class: property vs argument namingPowershell 类:属性与参数命名
【发布时间】:2020-07-06 23:28:26
【问题描述】:

this 旧 Microsoft 文档 Richard Siddaway 中声明

我使用让人联想到属性名称的变量名称。这些 变量是任意的,你可以使用任何合法的变量名—— 避免使用属性的名称!

这导致构造函数看起来像这样

RStimezone(
   [int]$idx,
   [string]$desc,
   [string]$tmzn,
   [bool]$crnt
   ){
   $this.Index = $idx
   $this.Description = $desc
   $this.Timezone = $tmzn
   $this.Current = $crnt
}

但没有解释为什么建议使用这种命名约定。据我所知,没有范围问题,因此使用与类属性同名的参数不会引起问题。在我看来,这是一种更具可读性的方法。

RStimezone(
   [int]$index,
   [string]$description,
   [string]$timezone,
   [bool]$current
   ){
   $this.Index = $index
   $this.Description = $description
   $this.Timezone = $timezone
   $this.Current = $current
}

我错过了什么吗?

【问题讨论】:

  • 我也会选择更具描述性/可读性的变量名称。只要您不(误)使用Automatic variable 名称,应该没有问题。
  • @Theo,我有点想知道这是否基本上是 C# 的最佳实践或成语,类似于它们自己的行上的花括号。很高兴知道我终于对 PowerShell 有了一些直觉。 :)

标签: powershell class properties arguments


【解决方案1】:

注意:我个人更喜欢描述性参数名称,即使它们碰巧与属性名称冲突 - 但这不是这里的问题 :)

我显然不能代表 Richard,因为我可以想到有人决定避免方法参数名称与属性名称冲突的两个原因:

避免未来的重构“陷阱!”

有问题的文章写于 2016 年 9 月!

大约在那个时候,Visual Studio Code 仍处于起步阶段 - LSP(语言服务器协议)几乎没有标准化。

这意味着在许多编辑器中——包括 PowerShell ISE,也许还有 SAPIEN PowerShell Studio——PowerShell 的适当和上下文“语言支持”是纯粹语法的,并且在许多情况下基于伪劣的基于正则表达式标记器。

基于 .NET 的编辑器可以利用 PowerShell 3.0 中引入的新 Parser/AST API,但这是一项艰巨的任务,因为 3.0 后的语言也为隐式属性参数、文字数组处理等。

所以到 5.0 出现时,语言的唯一重大变化是引入了 classenum 类型定义语句,很少有编辑器能够快速实现对这些新的完全支持(并且略微复杂)功能 - 因为语言的其余部分几乎相同,并且许多句法分析器分类工作。

你说这与命名方法参数和类属性有什么关系?

好吧,想象一下语法分析器尝试对下面(有效)构造函数中的$myString 参数进行变量重命名操作:

class MyClass
{
    [string]
    $myString

    MyClass([string]$myString)
    {
        $this.myString = $myString
    }
}

一个简单的重构工具会给你留下这个(无效的)构造函数:

class MyClass
{
    [string]
    $renamedString

    MyClass([string]$renamedString)
    {
        $this.myString = $renamedString
    }
}

货物培养

正如文章旁注所述,Richard 已于 2016 年在 IT 领域拥有超过 25 年的经验,我可以向您保证,他的职业生涯中大部分时间都在使用 C#。

如果我向您展示 C# 中的等效模式,从可读性的角度来看,为什么不鼓励这种特定类型的命名冲突/重叠可能会变得很明显:

class MyClass
{
  private string myString;

  MyClass(string myString)
  {
    this.myString = myString.Substring(Math.Min(1, myString.Length));
  }

  string SomeMethod()
  {
    return myString;
  }
}

在上面的类中,裸标记 myString 现在代表两个不同的值,具体取决于您正在查看的方法主体。如果您认为“这并不奇怪,我可以很好地阅读它”,请进行图灵测试,因为您可能是编译器;-)

【讨论】:

  • @mathias-r-jessen,随着我对类重构的深入研究,我正在重新审视这一点,并且我已经开始走上一条可能有也可能没有陷阱的道路。基本上,我不想拥有名称相同的属性和参数,但从可读性的角度来看,我也不喜欢 Richard Siddaway 缩写的参数名称。我倾向于使用参数前缀方法,但想知道是否有一个陷阱在等着我?因此,公共属性为[Int] $Index,私有属性为hidden [Int] $index,参数为[int] $_index
  • @mathias-r-jessen 在我看来,下划线很好地标识了参数,它始终是小写的,因为它始终是方法的本地,如果它用于设置属性的值,那么 @987654331 @ 对我来说似乎清晰易读。到目前为止,它似乎没有问题,并且至少有助于提高我的可读性。只是想知道在使用该方法的几千行代码之后我是否会后悔? :)
  • 啊,有趣的想法。在这种情况下,我是用户,因为该产品是一个独立的程序,不打算用于其他用途。但我不相信这将永远是真的。但是我想知道,调用方法参数有什么区别,因为对于类,您将所有内容都视为位置参数而不是命名,因此使用我的类的任何人都不需要直接引用方法参数名称,对吗?如果不出意外,很高兴知道如果我继续沿着这条路走下去,没有惊喜等着我。
  • 语言引擎绝对不关心——你可以在一个属性声明为$Gordon的类中拥有一个名为$Gordon的方法参数,没问题。帮自己一个忙,并在您的应用程序中保持一致:) 我不使用 _ 前缀的原因是方法参数是类的公共 API 表面的一部分,您不应该显示奇怪的内部名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多