2

基本上,我的工作场所有一个提供 OCR 功能的系统。该过程是,第三方应用程序被配置为显示捕获的屏幕(在 OCR 过程中),并且用户坐在 pc 上确保捕获的数据是正确的。

此捕获阶段对每个字段进行验证。例如,如果文件是特定客户的发票,则根据参考数据验证发票的供应商。验证码是我自己从Visual Studio 2008解决方案生成的编译后的.net dll的形式。

第三方接口用于捕获表单和我编写的代码之间的通信。一个例子是;

#region GetLinesTotal
/// <summary>
/// Gets the total for e.g. all VAT lines from the table
/// </summary>
/// <param name="oCSM">ITisClientServicesModule</param>
/// <param name="oTab">field table object</param>
/// <param name="fieldName">partial fieldname of table field (without the $XXXX)/param>
/// <returns>total as a string, empty string if all values empty</returns>
public static string GetLinesTotal(ITisClientServicesModule oCSM,ITisFieldTableData oTab, string fieldName )
{
    string sLineTot = string.Empty;
    ErrHandling.TryInit(oCSM);
    string sFunction = "GetLinesTotal";
    try
    {
        decimal dTot = 0m;              
        string sTemp = string.Empty;
        for (int i = 0; i< oTab.NumberOfRepetitions;i++)
        {
            sTemp = Utils.GetFieldCont(oTab.ParentForm,fieldName + "$" + i.ToString("X").PadLeft(4,'0')).Trim();
            if (sTemp != string.Empty)
            {
                dTot += Convert.ToDecimal(sTemp);
                sLineTot = dTot.ToString();
            }
        }

    }
    catch (Exception ex)
    {
        ErrHandling.errHandler.LogMsg(ex.ToString(),sFunction,CLASS_NAME,TIS_SEVERITY.TIS_ERROR);
        sLineTot = "INVALID";
    }
    return sLineTot;
}
#endregion GetLinesTotal

我希望做的是创建一个抽象层,从该代码中删除第 3 方接口(分离关注点),这将允许更轻松的测试(TDD)等。

我对这些方法不熟悉,如果我做出任何错误的假设,我深表歉意。我只是想知道是否可以就如何继续编写代码获得一些建议。在某些时候,我们(公司)可能会选择使用不同的第 3 方 OCR 应用程序。

提前致谢

4

3 回答 3

1

编写一个接口,定义您想要执行的操作 - 从客户端(即您的代码)的角度 - 在第三方接口上,以及实现该接口的第三方接口周围的瘦包装器。然后,您可以提供一个模拟对象来代替接口用于单元测试目的,并且您已经解耦了实际的第三方实现,以便将其切换为编写实现接口的替代瘦包装器的问题。

于 2010-06-28T08:06:46.017 回答
1

在某些时候,我们可能...

雅尼警告!

专注于你知道今天需要的东西。对于 TDD,没有规定必须创建抽象层。事实上,引入不必要的抽象甚至可能对代码有害(代码膨胀)。如果有一天您需要支持多个 OCR 实现,那么您才需要创建该抽象。

请注意,如果第 3 方代码难以测试和/或依赖于数据库、网络 och 文件访问等并不适合单元测试的内容,则您始终可以模拟第 3 方代码。

于 2010-06-28T08:24:18.423 回答
0

在您决定使用另一个 OCR 系统之前,我不会担心这一点。您已经将代码写入接口,因此您的单元测试已经有了一定程度的分离(您可以针对“ITisClientServicesModule”和“ITisFieldTableData”接口创建模拟或存根)。

如果我现在要做任何事情,那就是派生新的接口,这些接口包含在您的实用程序方法(ErrHanding.Initialise() 和 Utils.GetFieldCount())中,以便进一步减少代码耦合。

于 2010-06-28T08:10:18.063 回答