Page tree
Skip to end of metadata
Go to start of metadata

在当前页:

介绍

测量软件功能大小时考虑两个方面:应用边界以及在整个应用生命周期中对功能所做的更改。确保测量过程尽可能精确,然后控制测量过程,并验证源代码、应用边界、配置和最终结果,这一点非常重要。

测量过程的控制可通过以下四个步骤实现:

  • 第一种方法是将源代码交付与分析设置中的源代码选择进行比较。如有必要,应用智能管理员可以在CAST交付管理器工具(DMT)包设置中进行调整。
  • 下一步是将已分析的源代码与分析服务中的结果对象进行比较。可在CAST Management Studio中实现定制化,以考虑特定的技术或编码。
  • 第三步是检查应用模块的内容。模块用于计算应用特定部分的指标,因此,重要的是,要证明所有对象的排除都是合理的。
  • 最后一步是检查与应用智能管理员设置的配置有关的空事务列表。空事务可以被视为从度量结果中排除,因此必须对其进行验证。


检查应用边界一致性

 因为应用边界是组成应用的所有组件的聚合,所以应该考虑提供给应用智能中心的所有源代码。因此,比较已交付的同一代码与在各种CAST仪表盘中可见的代码非常重要。

根据架构审查,您应该对应用用于与其他应用和终端用户通信的不同技术和接口有一个很好的概述。有几种机制可以通过特定的编码在整个加载流程中调整应用边界,而这些特定编码需要额外代码段,且应用团队不必维持这些代码段。

应用边界可以分几个步骤进行细化:

    1. 在CAST交付管理器工具(DMT)中检查源代码交付:用作应用分析输入的源代码应该与您认为是应用边界的源代码相同。在这种情况下,通过DMT包交付的所有源代码都应该在分析服务和部分应用事务中。
    2. 调整CAST Management Studio(CMS)中的分析设置:如果在DMT包中没有对源代码边界进行优化,则还可以对在CMS中创建的相应分析单元进行微调。
    3. 调整模块内容:如果在应用分析期间仍然需要保留一些元素,但不希望在结果中考虑它们,那么应该在CMS中改进模块定义。

    4. 在事务配置中心(TCC)中配置事务: 最后,如果必须保留应用的一些模块来显示质量度量,且不希望长袍马褂功能大小上考虑它们,那么可以考虑CAST事务配置中心(TCC)中的排除选项。

DMT包输入和DMT包输出之间的一致性

确保所有交付的源代码将被CAST应用智能平台“消耗”是至关重要的。不能作为应用分析一部分的源代码片段必须记录为从应用边界中排除。通过执行以下Windows批处理命令获取包含应用源代码的文件列表:

dir /a:a/s/b/o:n >listFiles.csv

用Excel之类的工具打开生成的CSV文件。在A列中,您会看到每个文件一行。将以下公式应用于B列,以获取文件扩展名的实际列表:

=RIGHT($A2,LEN($A2)-FIND("|",SUBSTITUTE($A2,".","|",LEN($A2)-LEN(SUBSTITUTE($A2,".","")))))

选择工作表,并创建一个以扩展名为行,相应文件数为值的透视表:

点击放大:

下图显示结果透视表:

点击放大:

然后,您可以通过将此列表与CAST交付管理器工具“包内容”选项卡中显示的实际列表进行比较来搜索缺少的文件:

应用分析输入和应用分析输出之间的一致性

CAST交付管理器工具包内容将作为应用分析的输入。CAST交付管理器工具“包内容”选项卡显示已发现的各种文件扩展名:

您可以将此列表与“源设置”选项卡中CAST Management Studio中指定的文件扩展名进行比较。在下面的示例中,在CAST交付管理器工具包中发现了文件扩展名“PGM”,但它不在分析单元“源设置”文件扩展名列表中。这意味着只有文件扩展名为“CBL”的COBOL程序才会被分析,而那些文件扩展名为“PGM”的COBOL程序(13个程序)则不会被分析。要考虑这些文件,必须在分析单元“源设置”中添加缺少的文件扩展名:

一旦文件扩展名在CAST交付管理器工具包和CAST Management Studio分析单元中保持一致,那么您现在应该期望分析完成后在分析服务架构中获得相同数量的文件。要查看这一点,您可以查询分析服务以获取已分析的源文件数量,并将其与CAST交付管理器工具“包内容”选项卡中显示的数量进行比较。您应该对分析服务架构执行以下SQL查询,以获取分析期间已考虑的文件扩展名的文件数:

set search_path=<prefix>_local;
select substring(p.path from '\.([a-z]+)$') ext, count(*)
from (select distinct path from RefPath) p
group by ext;

下图显示了查询返回的结果。它们表明,在应用分析过程中没有考虑扩展名为“PGM的文件:

这可以通过在分析单元“源设置”选项卡中添加“PGM”文件扩展名来解决:

再次分析应用,然后执行SQL查询。您应该在结果集合中查看预期的“PGM”文件:

应用分析输出与模块内容之间的一致性

使用以下SQL查询检查与应用关联的模块内容:


set search_path=<prefix>_local;

SELECT ps.MODULE_NAME, SUBSTRING(cob.OBJECT_FULLNAME FROM '\.([a-z]+)$') as extension, count(*)
FROM <prefix_local>.PMC_SUBSET_OBJECTS pso
 JOIN (SELECT ps.SUBSET_ID as MODULE_ID,
 pm.OBJECT_NAME as MODULE_NAME
 FROM (SELECT pm.OBJECT_ID,
 pm.OBJECT_NAME
 FROM <prefix_mngt>.CMS_PORTF_MODULE pm) pm
 JOIN <prefix.local>.PMC_SUBSETS ps
 ON ps.SUBSET_NAME LIKE 'CMS_MOD__' || pm.OBJECT_ID || '_Preparation2'
 ) ps
 ON pso.SUBSET_ID = ps.MODULE_ID
 JOIN <prefix_local>.CDT_OBJECTS cob
 ON cob.object_id = pso.object_id
 AND cob.OBJECT_TYPE_STR LIKE '%File'
GROUP BY MODULE_NAME, extension, cob.OBJECT_TYPE_STR
ORDER BY 1 ASC, 2 ASC;

结果应该如下所示:

确保一个文件没有分配给多个模块是很重要的。可以通过对分析服务方案执行以下SQL查询来检查这一点:

set search_path=<prefix>_local;

SELECT pso.OBJECT_ID, count(*) 
FROM <prefix_local>.PMC_SUBSET_OBJECTS pso
JOIN (SELECT ps.SUBSET_ID as MODULE_ID,
pm.OBJECT_NAME as MODULE_NAME
FROM (SELECT pm.OBJECT_ID_ID,
pm.OBJECT_NAME
FROM <prefix_mngt>.CMS_PORTF_MODULE pm ) pm
JOIN <prefix_local>.PMC_SUBSETS ps
on ps.SUBSET_NAME like 'CMS_MOD__' || pm.OBJECT_ID || '_Preparation2'
) ps
on pso.SUBSET_ID = ps.MODULE_ID
GROUP BY OBJECT_ID 
HAVING count(*) >1;

结果应为空:

模块内容与事务图之间的一致性

一旦到达这个步骤,就可以确定事务构建引擎的输入(几乎)是正确的。现在必须检查并验证生成的事务调用图。应检查以下几点。

在调查CAST应用智能平台发现的事务之前,您可能需要调整事务入口点列表 — 参见事务配置

参与事务的对象

以下SQL查询将提取属于事务的对象类型。下面示例中用COBOL说明了这一点,但是查询可以适应于其他对象类型:

set search_path=<prefix>_local;
select object_type_str,object_language_name,count(1)
from CDT_OBJECTS where object_id not in (
    select distinct objc.object_id
    from dss_transaction dt, dss_transactiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
    where dt.form_id =  obj.object_id
    and objc.object_id = dtd.child_id
    and dt.object_id = dtd.object_id
  union all
    select distinct objc.object_id
    from dss_datafunction dt, dss_datafunctiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
    where dt.maintable_id =  obj.object_id
    and objc.object_id = dtd.table_id
    and dt.object_id = dtd.object_id
)
and object_fullname not like '[Unknown%'
and object_language_name != '<N/A>'
and object_language_name != 'N/A'
and object_type_str not like  '%Project'
and object_type_str not like  '%Directory'
and object_type_str not like  '%Folder'
and object_type_str not in ('Cobol Paragraph','Cobol Section','Cobol CopyBook','Cobol Data Link','Cobol Entry Point')
 group by 1,2
 order by 2,1;

结果应该如下所示:

不参与任何事务的对象

以下SQL查询将提取不在任何事务中的对象类型。下面示例中用COBOL说明了这一点,但是查询可以适应于其他对象类型:

set search_path=<prefix>_local;

select object_id, object_name, object_fullname, object_type_str,object_language_name
from CDT_OBJECTS where object_id not in (
    select distinct objc.object_id
    from dss_transaction dt, dss_transactiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
    where dt.form_id =  obj.object_id
    and objc.object_id = dtd.child_id
    and dt.object_id = dtd.object_id
  union all
    select distinct objc.object_id
    from dss_datafunction dt, dss_datafunctiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
    where dt.maintable_id =  obj.object_id
    and objc.object_id = dtd.table_id
    and dt.object_id = dtd.object_id
)
and object_fullname not like '[Unknown%'
and object_language_name != '<N/A>'
and object_language_name != 'N/A'
and object_type_str not like  '%Project'
and object_type_str not like  '%Directory'
and object_type_str not like  '%Folder'
and object_type_str not in ('Cobol Paragraph','Cobol Section','Cobol CopyBook','Cobol Data Link','Cobol Entry Point')
 order by 2,1;
 

结果应如下所示:

不参与任何事务且不被其他对象调用的对象

以下SQL查询将提取不属于任何事务的对象。下面示例中用COBOL说明了这一点,但是查询可以适应于其他对象类型:

set search_path=<prefix>_local;

select obj.object_id,obj.object_name,obj.object_fullname
from CDT_OBJECTS obj
where obj.object_type_str = 'Cobol Program'
and object_fullname not like '[Unknown%'
and obj.object_id not in (     --- reduce the list to the program which are not part of a transaction
select distinct objc.object_id
from dss_transaction dt, dss_transactiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
where dt.form_id =  obj.object_id
and objc.object_id = dtd.child_id
and dt.object_id = dtd.object_id
union
select distinct objc.object_id
from dss_datafunction dt, dss_datafunctiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
where dt.maintable_id =  obj.object_id
and objc.object_id = dtd.table_id
and dt.object_id = dtd.object_id)
and obj.object_id not in (--- reduce the list to the program which are not called by something else
select obj.object_id
from ctv_links cl,CDT_OBJECTS obj
where cl.called_id = obj.object_id
and obj.object_type_str = 'Cobol Program'
and object_fullname not like '[Unknown%'
)
order by 3;

下图显示了查询返回的结果集合:

调查这个清单很重要。具有关联链接的对象可以在CAST Enlighten中可视化,如下所示:

点击放大:

一个调查的好方法是查看源代码中插入的注释,并与SME讨论:

在上面的源代码提取中,我们可以看到程序是属于另一个应用的接口 — 因此它可以被视为事务终点。

添加新事务入口点

使用CAST事务配置中心中的自由定义规则,选择应被视为事务入口点的对象(更多信息,请参见事务配置 )。以下示例使用COBOL程序,但也可以适应于其他类型的对象:

点击放大:

这里的目标是在有限数量的操作中,添加新的程序名到上面规则设置的正规表达式中。首先要做的是收集想要添加到正规表达式中的程序名。可以通过执行以下SQL查询来生成此列表:

set search_path=<Prefix>_local;
 
select '<value>'||obj.object_name||'</value>' as text
from CDT_OBJECTS obj
where obj.object_type_str = 'Cobol Program'
and object_fullname not like '[Unknown%'
and obj.object_id not in ( --- reduce the list to the program which are not part of a transaction
select distinct objc.object_id
from dss_transaction dt, dss_transactiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
where dt.form_id = obj.object_id
and objc.object_id = dtd.child_id
and dt.object_id = dtd.object_id
union
select distinct objc.object_id
from dss_datafunction dt, dss_datafunctiondetails dtd, CDT_OBJECTS obj, cdt_objects objc
where dt.maintable_id = obj.object_id
and objc.object_id = dtd.table_id
and dt.object_id = dtd.object_id)
and obj.object_id not in (--- reduce the list to the program which are not called by something else
select obj.object_id
from ctv_links cl,CDT_OBJECTS obj
where cl.called_id = obj.object_id
and obj.object_type_str = 'Cobol Program'
and object_fullname not like '[Unknown%'
);

结果应如下所示:


其次是创建一个空事务入口点规则并保存它。例如,您可以将其称为“公开程序”。

第三个操作是通过执行以下SQL查询来替换管理服务规则中使用的正规表达式:

set search_path=<Prefix>_mngt;
 
update cal_objsetdef set setdefinition = '<set>
  <selection-criteria subobjects="no" externalobjects="yes">
   <property name = "name" operator = "eq" >
    <value>GND0130</value>
    <value>M3194262</value>
    <value>M3109CCV</value>
    <value>M3194734</value>
    <value>M3194734</value>
    <value>M3109CGU</value>
    <value>M3109UM2</value>
    <value>M3109CGX</value>
    <value>GNDC920</value>
    <value>M3194480</value>
    <value>M3194480</value>
    <value>GND0307</value>
    <value>M3109CGX</value>
    <value>GND0301</value>
    <value>M3109CCV</value>
    <value>M319473X</value>
    <value>M3109UM2</value>
    <value>M3194T20</value>
    <value>M3194263</value>
    <value>M3194BDS</value>
    <value>M3194T20</value>
    <value>M3194871</value>
    <value>M3194BDS</value>
    <value>M319473X</value>
    <value>M3109CGU</value>
    <value>M3194262</value>
    <value>GNDCONV</value>
    <value>M3194263</value>
    <value>M3194871</value>
   </property>
   <property name = "type" operator = "eq" >
    <value>CAST_COBOL_SavedProgram</value>
   </property>
  </selection-criteria>
</set>
' where setname = 'Exposed Program';

在TCC中可以看到如下结果:

然后可以再次进行功能点计算,并应显示预期的事务:

您可以重复以检查是否有其他对象不是事务的一部分:

检查已排除的数据库表

一些数据库表通过应用一组专用规则自动从功能点计算过程中排除。排除的数据库表在删除、忽略或保留的数据函数中不可见,因此验证列表以避免意外排除是很重要的。目前,获取此列表的唯一方法是从CAST事务配置中心的“内置参数”视图生成对象集合:

点击放大:

可以使用以下SQL查询提取排除规则列表:

set search_path=<prefix>_mngt;
select * from cal_ignoredtable;

结果应如下所示:

在CAST事务配置中心生成对象集合时,排除规则选择的数据库表可见:

还可以通过应用以下SQL查询列出这些数据库表:

set search_path=<prefix>_local;
 
Select obj.object_id, obj.object_name, obj.object_fullname, obj.object_type_str, fplt.appli_id
from fp_lookup_tables fplt, cdt_objects obj
where obj.object_id = fplt.object_id;

结果应如下所示:

附录A:检查调用图中的链接

高扇出对象

其目的是识别功能点计数中由于这些链接而产生的错误链接或副作用。此处显示的SQL查询标识具有高扇出(调用大量其他对象的对象)的对象,且必须对分析服务执行。你可以通过snapshot_id、application_id和其他类型对象来自定义它(在本例中,考虑了"C# Method",但也可在Java应用中搜索“Java Method”)

set search_path=<prefix>_local;
 
select count(L.caller_id), L.caller_id  , O.object_name, O.object_fullname
from ctv_links L, ctv_guid_objects O
where L.caller_id = O.object_id
and O.object_type_str = 'C# Method' --Java Method
group by L.caller_id,O.object_name,O.object_fullname
order by 1 desc
limit 100;

结果应如下所示:

 在CAST Enlighten中,这些对象可以生成这种类型的图形视图:


高扇入对象

其目的是在FP计数中识别由于这些链接而导致的错误链接或副作用。此处显示的SQL查询标识具有高扇入(许多其他对象调用的对象)的对象,必须对分析服务执行。你可以通过snapshot_id、application_id和其他类型对象来自定义它(在本例中,考虑了"C# Method",但也可在Java应用中搜索“Java Method”)

set search_path=<prefix>_local;
 
select count(O.object_id),O.object_id, O.object_name, O.object_fullname
from ctv_links L, ctv_guid_objects O
where L.called_id = O.object_id
and O.object_type_str = 'C# Method' --Java Method
group by L.called_id,O.object_id, O.object_name,O.object_fullname
order by 1 desc
limit 100;

结果应如下所示:

在CAST Enlighten中,这些对象可以生成这种类型的图形视图:

附录B:搜索潜在事务入口点

目的是识别丢失的链接。此处显示的SQL查询标识未调用的对象(例如:未引用的方法),且必须对分析服务执行。它可以用其他类型的对象进行自定义(例如:“Java方法”):

set search_path=<prefix>_local;
 
select *
from ctv_guid_objects O
where O.object_id not in (select l.called_id from ctv_links L)
and O.object_type_str = 'C# Method'
limit 100;

此列表必须由SME和应用团队验证,然后必须相应地调整事务配置。

附录C:寻找潜在事务终点

目的是识别丢失的链接。此处显示的SQL查询标识不调用任何其他对象的对象。例如,如果分析了一个DAO对象,并且在应用边界中没有相应的数据库,则可能发生这种情况。这个对象可以被看作是一个接口,且它应该被看作是促成事务的事务终点。

此SQL查询必须对分析服务执行,并且可以用其他类型的对象(例如“Java 方法”)进行自定义:

set search_path=<prefix>_local;
 
select *
from ctv_guid_objects O
where O.object_id not in (select l.caller_id from ctv_links L)
and O.object_type_str = 'C# Method'
limit 100;

此列表必须由SME和应用团队验证,并且必须相应地调整事务配置。

附录D:事务终点清单

以下SQL查询搜索所有已标识为事务终点的对象。它必须对分析服务执行。

set search_path=<prefix>_local;
 
select count(1) as used, dtd.child_id, obj.object_name, obj.object_fullname, obj.object_type_str, obj.object_language_name
from dss_transactiondetails dtd, cdt_objects obj
where dtd.childtype in (5, 6 ,7)
and dtd.child_id = obj.object_id
group by 2,3,4,5,6
order by 1 desc,2 asc ,3 asc;

结果应如下所示:

点击放大:

此列表必须由SME和应用团队验证。

  • No labels