TDD,创建抽象层

时间:2010-06-28 08:02:40

标签: c# dependency-injection interface ioc-container separation-of-concerns

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

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

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

#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

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

我是这些方法的新手,如果我做了任何错误的假设,我会道歉。我只是想知道我是否可以就如何推进代码获得一些建议。在某些时候,我们(公司)可能选择使用不同的第三方OCR应用程序。

提前致谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

YAGNI警告!

专注于您认识所需的东西今天。为了TDD,没有规则说你必须创建抽象层。实际上,引入不需要的抽象甚至可能对代码有害(代码膨胀)。 如果当您需要支持多个OCR实现时,那么您才需要创建该抽象。

请注意,如果难以测试和/或依赖数据库,网络och文件访问等不太适合单元测试的内容,您可以随时模拟第三方代码。

答案 2 :(得分:0)

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

如果我现在要做任何,那么可以派生出在你的实用程序方法中折叠的新接口(ErrHanding.Initialise()和Utils.GetFieldCount()),这样你的代码耦合进一步减少。