在正向路径方案中使用工作量计算器变量

本主题介绍了在转发路径方案中如何使用工作量计算器变量。本主题使用示例介绍如何使用这些功能。

关于努力计算器变量

工作量计算器估计修复目标平台的应用程序组合所涉及的成本和工作量(由 AppDNA 报告之一表示)。计算使用两种主要类型的变量:

  • 户定义的变量 — 这些值存储测试程序、修复程序和项目经理每天的成本、典型工作日的小时数、修复不同复杂性(简单、正常和复杂)的应用程序平均需要多长时间,同时考虑到补救措施的难度(简单、中等或硬度)。您可以为中的每个 AppDNA 报告单独设置这些变量努力计算器屏幕
  • 应用程序级别变量 — 这些变量来自 AppDNA 分析,包括应用程序的复杂性(这取决于应用程序具有的文件和注册表项),以及需要采取的操作的困难(或复杂性)来修复应用程序中的所选报告。

使用此信息努力计算器估计将整个应用程序组合迁移到新平台的预期成本。现在,您可以在转发路径方案中使用这些变量,例如,估算修复每个应用程序的成本。本主题提供了一个相对简单的例子来说明如何执行此操作。AppDNA 附带的示例场景之一提供了一个更复杂和复杂的示例。

有关工作量计算器变量及其使用方式的详细信息,请参阅努力计算器

检索用户定义的工作量计算器变量

您可以通过 EffortCalculatorSettings 对象访问用户定义的工作量计算器变量,您可以通过主机对象检索该对象。Host 对象隐式可用于整个方案脚本。以下是检索 Windows 7 报告的 EffortCalculatorSettings 对象的片段:

``` pre codeblock Private Dim vars As EffortCalculatorSettings

’ Get the Windows 7 Effort Calculator settings object. vars = Host.GetEffortCalculatorSettings(“Win7Module”)


请注意,我们已使用 Windows 7 内部报告标识符检索 Windows 7 的工作量计算器变量。有关报告标识符的列表,请参阅[创建指向修复报告视图的链接](/zh-cn/dna/current-release/configure/forward-path/dna-forward-path-remediation-links.html)。

您可以在[正向路径逻辑编辑器屏幕](/zh-cn/dna/current-release/configure/forward-path/dna-forward-path-logic-editor.html)右侧的属性资源管理器中查看 EffortCalculatorSettings 对象的所有属性。属性的名称与“努力计算器”屏幕中显示的变量的文本密切相关。例如,AppStagingHours 属性对应于工作量计算器屏幕的人员配置变量部分中的暂存时间变量。我们将在下面的示例中使用这个变量。

可以在您的场景中设置这些变量的值以便在该场景中使用,如下所示:

``` pre codeblock
vars.TesterStagerCostPerDay = 23

注意:这不会更改或覆盖努力计算器使用的变量。

关于示例

为了说明如何使用两种类型的努力计算器变量来计算正向路径方案中修复应用程序的估计成本,我们将介绍一个示例方案。我们将分阶段建立起来,以便使其易于理解。

以下是示例创建的输出的截图:

输出示例

注意:本主题中的示例使用下划线 (_) 表示法将长行分为两行或多行。这样,当包含在 PDF 中时,示例代码片段可以正确呈现。有关此符号 MSDN 库的更多信息,请参阅。

初始化变量

AppDNA 包含一个名为Initialize() 的前向路径方案函数。如果存在于该方案中,AppDNA 会在处理开始时自动调用该方案。我们将使用它来初始化我们稍后将在场景中使用的变量。有关 Initialize() 函数的更多信息,请参阅向前分组路径报告

在 Initialize() 函数之前,我们声明了一些我们将在整个脚本中使用的变量。

``` pre codeblock ‘ Declare variables for use throughout the script. Private Dim vars As EffortCalculatorSettings Private Dim testingPerHour As Decimal = 0 Private Dim remediationPerHour As Decimal = 0


这里是初始化()函数:

``` pre codeblock
Public Overrides Sub Initialize()

   ' Get the Windows 7 Effort Calculator settings object.
   vars = Host.GetEffortCalculatorSettings("Win7Module")

   ' Calculate the testing and remediation cost per hour.
   testingPerHour = vars.TesterStagerCostPerDay / _
      vars.NormalAppTestingHours
   remediationPerHour = vars.RemediatorCostPerDay / _
      vars.NormalAppTestingHours

   ' Sort the report in descending order of cost.
   Settings.ApplicationSortBy = "Cost"
   Settings.ApplicationSortDescending = true
End Sub

请注意,我们正在计算每小时测试和修复成本。我们通过将表示测试程序或补救程序每天成本的变量中存储的值除以日变量中正常工作小时数中存储的值。

在 Initialize() 函数结束时,我们将排序顺序设置为成本列中值的降序。在此列中,我们将显示修复应用程序并为 UT 暂存应用程序的计算成本。

主要功能

这里是主要的 ForwardPath(). AppDNA 会自动为您运行报告时选择的每个应用程序调用一次。解释性说明遵循示例。

``` pre codeblock Public Function ForwardPath(ByVal currentApplication _ As Application) As Output

Dim result As New Output()

’ We will use three custom columns. result.CustomField1.Name = “Application Complexity” result.CustomField2.Name = “Action RAG” result.CustomField2.Value = _ currentApplication.Modules.Windows7.ActionRAG result.CustomField3.Name = “Action Complexity”

’ Set the culture on the Cost column to US English, ‘ so that the US dollar currency symbol is used. result.Display.Cost.Culture = “en-US”

’ Test the application’s main RAG status, because ‘ the remediation depends on this. Select Case currentApplication.Modules.Windows7.RAG

  Case Rag.Green

     ' The RAG is green, so no remediation is necessary
     ' and the application can be staged for UAT.
     result.Outcome = "Stage UAT"
     result.RAG = RAG.Green

     ' No remediation is required, so the cost is of
     ' the staging only.
     result.Cost = testingPerHour * vars.AppStagingHours
     result.CustomField3.Value = "--"

     ' Convert the unfriendly application complexity
     ' "RAG" to a text.
     Select Case currentApplication.Complexity
        Case RAG.Red
           result.CustomField1.Value = "Complex"
        Case RAG.Amber
           result.CustomField1.Value = "Medium"
        Case RAG.Green
           result.CustomField1.Value = "Simple"
     End Select

  Case Rag.Amber

     ' The RAG is amber, so the application needs
     ' remediation.
     result.RAG = RAG.Amber
     result.Outcome = "Remediate"

     ' The cost calculation is more complicated,
     ' so we will do it in a separate "GetCost()"
     ' function.
     result.Cost = GetCost(currentApplication, result)

  Case Rag.Red

     ' The RAG is red - we need to check the action
     ' RAG to see if remdiation is possible.
     result.RAG = RAG.Red

     ' If the action RAG is red, the application
     ' cannot be remediated.
     If (currentApplication.Modules.Windows7.ActionRAG = _
        RAG.Red) Then

        result.Outcome = "Redevelop"
        result.CustomField3.Value = "Hard"

        ' Convert the unfriendly application complexity
        ' "RAG" to a text and set an arbitrary
        ' replacement/redevelopment cost.
        Select Case currentApplication.Complexity
           Case RAG.Red
              result.CustomField1.Value = "Complex"
              result.Cost = 3000
           Case RAG.Amber
              result.CustomField1.Value = "Medium"
              result.Cost = 2000
           Case RAG.Green
              result.CustomField1.Value = "Simple"
              result.Cost = 1000
        End Select

     ' The action RAG is not red, so remediation is
     ' possible.
     Else
        result.Outcome = "Remediate"
        result.Cost = GetCost(currentApplication, result)
     End If

  Case Else

     ' Catch all for applications that have not been
     ' analyzed or that are locked.
     result.Outcome = "Unknown"
     result.RAG = RAG.Unknown
     result.CustomField1.Value = "--"
     result.CustomField3.Value = "--"
     result.Cost = 0

End Select

result.Display.SourcePath.Visible = false

ForwardPath = result

End Function


请注意,此函数首先设置三个自定义列(称为 CustomFieldn)-这些是上面输出屏幕截图中最右侧的三个列。我们使用这些如下:

| 列  | 显示器 |
| ---| --- |
| CustomField1 | 应用程序的复杂性。“转发路径”将其存储为红/安培/绿色“RAG”。我们将这些值转换为脚本中的复杂/中/简单文本。 |
| CustomField2 | 应用程序的操作 RAG。我们使用 Application.Modules.Windows7.ActionRAG 属性获取值。|
| CustomField3 | 应用程序修复行动的复杂性/难度。我们将在脚本稍后检索此列的值。  |

“成本”列以货币格式自动显示。默认情况下,“转发路径”使用用户计算机上的区域设置的货币符号。在国际环境中,这意味着货币符号可能会因查看报告的人的设备上的设置而异。(例如,它可能显示法国用户的欧元符号、英格兰用户的英镑符号和美国用户的美元符号。) 因此,在此示例中,我们将指定美元符号,以便无论用户的区域设置如何,都会始终显示该符号。为此,我们将“成本”列上的“文化”属性设置为“en-US”,表示美国。

函数的主体由一个选择案例语句组成,该语句测试应用程序的 Windows 7 RAG 状态,并根据该状态提供不同的处理。让我们来看看我们如何处理每个值:

-  **绿色抹布** — 应用程序可以直接进入 UAC。因此,我们计算过渡应用程序的成本,方法是将每小时的测试成本(我们在 Initialize()中计算出的)乘以存储应用程序进行测试所需的小时数的努力计算器变量。我们将操作复杂度设置为“—”,因为没有必要进行补救,我们使用另一个 Select Case 语句来测试应用程序的复杂性,并将不友好的“RAG”值转换为文本。
-  **琥珀抹布** — 应用程序需要修复。我们调用 GetCost() 函数来计算修复成本。我们很快就会看看这个问题。
-  **红色抹布** — 我们首先测试操作 RAG。如果它为红色,则表示无法修复应用程序,需要重新开发或替换。然后,我们使用 Select Case 语句来测试应用程序的复杂性,就像我们对绿色 RAG 所做的那样。但是,这次我们根据应用程序的复杂性设置任意替换成本。对于可以修复的应用程序(即其操作 RAG 为绿色或琥珀色),我们调用 GetCost() 函数来计算修复成本。
-  **其他 RAG 值** — 我们使用案例其他语句处理所有其他 RAG 值。这将处理尚未分析的应用程序和已锁定(未经许可)的应用程序。

## 计算修复成本

这里是 GetCost() 函数,我们在主函数中调用它来计算琥珀应用程序和红色应用程序的修复成本。解释性说明遵循示例。

``` pre codeblock
Private Function GetCost(app As Application, _
   cols As Output) As Decimal

   Dim remediationCost As Decimal = 0
   Dim testingCost As Decimal = 0

   ' 1. Using the triggered algorithms, get the
   ' algorithm with the hardest action. We will use this
   ' in our calculations.
   Dim maxAlgorithm As TriggeredRule = _
      (From r in app.TriggeredRules _
      Where r.ModuleIdentifier = "Win7Module" _
      Where r.Action.Complexity = ActionComplexity.Hard Or _
      r.Action.Complexity = ActionComplexity.Medium Or _
      r.Action.Complexity = ActionComplexity.Easy _
      Order By r.Action.Complexity Descending _
      Select r).FirstOrDefault()

   ' 2. Display the algorithm's action complexity.
   cols.CustomField3.Value = maxAlgorithm.Action.Complexity

   ' 3. The remediation cost depends on the application
   ' complexity.
   Select Case app.Complexity

      ' A complex application.
      Case RAG.Red

         cols.CustomField1.Value = "Complex"

         ' The remediation cost also depends on
         ' the complexity of the action. So we will
         ' calculate the time based on the number of
         ' hours held in the Effort Calculator matrix.
         Select Case maxAlgorithm.Action.Complexity
            Case ActionComplexity.Easy
               remediationCost = remediationPerHour * _
                  vars.ComplexAppEasyRemediationHours
            Case ActionComplexity.Medium
               remediationCost = remediationPerHour * _
                  vars.ComplexAppMediumRemediationHours
            Case ActionComplexity.Hard
               remediationCost = remediationPerHour * _
                  vars.ComplexAppHardRemediationHours
            Case Else
               remediationCost = remediationPerHour * _
                  vars.ComplexAppMediumRemediationHours
         End Select

         If app.Modules.Windows7.ActionRAG = RAG.Amber Then

            ' Add the additional post-remediation testing
            ' because the application has an amber action RAG.
            testingCost = testingPerHour * _
               vars.ComplexAppTestingHours

         End If

      ' A medium-complexity application.
      Case RAG.Amber

         cols.CustomField1.Value = "Medium"

         Select Case maxAlgorithm.Action.Complexity
            Case ActionComplexity.Easy
               remediationCost = remediationPerHour * _
                  vars.NormalAppEasyRemediationHours
            Case ActionComplexity.Medium
               remediationCost = remediationPerHour * _
                  vars.NormalAppMediumRemediationHours
            Case ActionComplexity.Hard
               remediationCost = remediationPerHour * _
                  vars.NormalAppHardRemediationHours
            Case Else
               remediationCost = remediationPerHour * _
                  vars.NormalAppMediumRemediationHours
         End Select

         If app.Modules.Windows7.ActionRAG = RAG.Amber Then

            ' Add the additional post-remediation testing
            ' because the application has an amber action RAG.
            testingCost = testingPerHour * _
               vars.NormalAppTestingHours

         End If

      ' A simple application.
      Case RAG.Green

         cols.CustomField1.Value = "Simple"

         Select Case maxAlgorithm.Action.Complexity
            Case ActionComplexity.Easy
               remediationCost = remediationPerHour * _
                  vars.SimpleAppEasyRemediationHours
            Case ActionComplexity.Medium
               remediationCost = remediationPerHour * _
                  vars.SimpleAppMediumRemediationHours
            Case ActionComplexity.Hard
               remediationCost = remediationPerHour * _
                  vars.SimpleAppHardRemediationHours
            Case Else
               remediationCost = remediationPerHour * _
                  vars.SimpleAppMediumRemediationHours
         End Select

         If app.Modules.Windows7.ActionRAG = RAG.Amber Then

            ' Add the additional post-remediation testing
            ' because the application has an amber action RAG.
            testingCost = testingPerHour * _
               vars.SimpleAppTestingHours

         End If

   End Select

   ' 4. Add the remediation and testing costs,
   ' and the cost of staging for UAT.
   GetCost = remediationCost + testingCost + _
      (testingPerHour * vars.AppStagingHours)

End Function

以下注释与上例中的注释中的数字有关:

1. 我们使用当前应用程序的 Windows 7 TriggeredRules 属性。此属性是 TriggeRedrule 对象的集合,它表示应用程序在分析 Windows 7 期间触发的所有算法。从这个集合中,我们得到了具有最难修复操作的算法。我们将使用它来计算修复应用程序的成本。

2. 我们在 CustomField3 中显示算法修复操作的复杂性(难度)。

3. 然后,我们再次使用 Select Case 语句来测试应用程序的复杂性。我们将为每个复杂性提供不同的处理。让我们来看看我们如何处理复杂的应用程序:

  • 首先,我们使用另一个 Select Case 语句来测试与我们在步骤 1 中检索到的算法相关的操作的复杂性(难度)。然后,对于每个可能的操作复杂性,我们通过将每小时的修复成本(在 Inititialize() 中计算)乘以代表修复相应操作复杂性的复杂应用程序所花费的时间来计算修复成本。
  • 然后,我们检查操作 RAG 是否为琥珀色-因为这意味着应用程序在实施修复后需要额外的测试。如果操作 RAG 是琥珀色的,我们计算测试成本的方法是将每小时的测试成本(在 Inititialize() 中计算)乘以代表测试复杂应用程序所需时间的工作计算器变量。

中等复杂程序和简单应用程序的代码反映了复杂应用程序的代码,但是每次我们分别为中等和简单应用程序选择努力计算器变量时。

4. 最后,我们将计算出的修复和测试成本添加到转储 UT 应用程序的成本中,并将其设置为返回值。

有关通过考虑与应用程序触发的所有算法相关的操作来计算修复成本的示例,请参阅 AppDNA 附带的示例方案。

在正向路径方案中使用工作量计算器变量