基本上,我的工作场所有一个提供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应用程序。
提前致谢
答案 0 :(得分:1)
编写一个接口,定义您要执行的操作 - 从客户端(即您的代码)的角度 - 在第三方接口上,以及围绕实现该接口的第三方接口的瘦包装器。然后,您可以提供一个模拟对象来代替接口以进行单元测试,并且您已经将实际的第三方实现分离,以便将其切换成编写实现您的接口的替代瘦包装的问题。
答案 1 :(得分:1)
在某些时候我们可能......
YAGNI警告!
专注于您认识所需的东西今天。为了TDD,没有规则说你必须创建抽象层。实际上,引入不需要的抽象甚至可能对代码有害(代码膨胀)。 如果当您需要支持多个OCR实现时,那么您才需要创建该抽象。
请注意,如果难以测试和/或依赖数据库,网络och文件访问等不太适合单元测试的内容,您可以随时模拟第三方代码。
答案 2 :(得分:0)
在您决定使用其他OCR系统之前,我不会担心这一点。 您已经将代码编写到接口,因此您已经对单元测试进行了一定程度的分离(您可以针对'ITisClientServicesModule'和'ITisFieldTableData'接口创建模拟或存根)。
如果我现在要做任何,那么可以派生出在你的实用程序方法中折叠的新接口(ErrHanding.Initialise()和Utils.GetFieldCount()),这样你的代码耦合进一步减少。