【问题标题】:Mixed Classes/Objects and Functions: Code Smell?混合类/对象和函数:代码异味?
【发布时间】:2019-09-02 18:47:20
【问题描述】:

我正在考虑重构以迁移到 OOP,因为我已为所有用户强制使用 PS5,并且我的代码中有些东西可以真正受益于继承。我的脚本有很多在不同地方使用的实用功能。其中一些在我的类中创建辅助方法是有意义的,但有些将不仅仅用于一个类。那么,将它们保留为函数是否合适,或者这真的是一个小代码,所有东西都应该转换为类和对象?如果一个效用函数被转换为 OOP,那么在其他类之间共享它的机制是什么?您是否使用全局变量,是否创建局部变量并通过一些方法获取需要它的对象?

【问题讨论】:

    标签: function powershell class


    【解决方案1】:

    我花了很多时间编写 PowerShell 类,只是为了在我的日常工作中探索什么/如何/为什么,并且在此过程中我开始问自己以下问题:

    1. 我要创建这个东西的多个实例吗?
    2. 我是否需要它始终具有这些特定的属性和方法?
    3. 这会使我的脚本以后更难理解吗?

    对于第一个问题,这将有助于防止在您将只创建一个实例的类上产生额外的复杂性,而它可以很容易地成为其自己的 .ps1 脚本中包含的一系列函数和变量

    对于问题二,您可以通过消除根本不需要严格定义的类来进一步过滤掉不必要的复杂性。如果您有两个函数用于内部包含结构化数据的单个字符串数组,则最好花时间确保函数本身简洁且有据可查,而不是尝试将其转换为类定义。

    最后,对于问题 3,如果您正在编写的脚本目前或将来可能会转交给其他人,您需要询问这种生活质量调整是否会使您的脚本的意图更难实现理解。这通常不是问题,但如果您使用 OOP 概念解决固有的程序/功能问题,您只会混淆实际的解决方案。

    最后,为了解决您对类之间共享信息的担忧,只需将您的类属性公开(如果它们需要在实例或函数之间共享)并在创建实例的范围内引用这些值。

    例如,假设我有想从脚本函数访问的带有属性 Bar 的 Foo 类:

    Class Foo {
        [Int] $Bar = 0
        Foo () { $Bar = 5 }
    }
    
    $MyVar = [Foo]::New()
    
    Function GetBar() {
        return $Script:MyVar.Bar
    }
    
    Write-Host GetBar
    

    【讨论】:

    • 我的脚本有一系列“任务”,它们有一些共同的属性和验证,以及独特的东西,所以类和继承真的会改善一些事情。我还在两个不同的上下文中使用任务,用户和机器,所以我有两个 PS1,每个上下文一个,我还有用于任务和辅助函数的单独模块文件。因此,函数脚本范围仅限于单个模块中的内容,因此任务无法访问实用程序函数而无需跳过一些环节。但我的理解是类和函数是不同的。
    • 我已经找到了一些关于这些问题的资源,所以我真正关注的是,混合类/对象和函数是否合适,或者我应该重构以使所有东西都成为一个类?看来你是说固定的方法没问题?
    • 从设计的角度来看,混合函数和类是好的。根据您的描述,我个人会通过在他们自己的文件中定义我的类、函数等来实现这一点,然后有一个主文件来提取这些定义并专门用于纯粹执行任务。这样,您可以确保所有内容都存在于单个脚本的范围内,而不是试图兼顾多个不同的范围。
    • 类的点采购不起作用。您最终需要做的要么是花费大量时间查看围绕创建具有嵌套模块以动态加载所有必需依赖项的脚本模块的文档,要么(我个人首选的解决方案)添加几个using共享/主脚本顶部的语句指向类脚本定义的路径,例如using module $PSScriptRoot\Bin\MyClassDefinition.psm1
    • 是的,使用关键字看起来是迄今为止最好的方法。我现在有一些工作测试代码。我如何与 Functions 集成将在稍后确定。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2010-11-04
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多