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

私がやりたいことは、抽象化のレイヤーを作成し、このコードからサードパーティのインターフェイスを削除して (懸念を分離して)、テスト (TDD) などを容易にすることです。

私はこれらのアプローチに不慣れであり、間違った仮定をした場合はお詫び申し上げます。コードを進める方法についてアドバイスをいただけないかと思っていました。ある時点で、私たち (会社) は、別のサードパーティの OCR アプリケーションを使用することを選択する場合があります。

前もって感謝します

4

3 に答える 3

1

ある時点で...

YAGNI警告!

今日必要とわかっていることに集中してください。TDD のために、抽象化のレイヤーを作成する必要があるというルールはありません。実際、不要な抽象化を導入すると、コードに悪影響を与えることさえあります (コードの肥大化)。複数の OCR 実装をサポートする必要がある日が来た場合にのみ、その抽象化を作成する必要があります

テストが難しい、および/またはデータベース、ネットワーク och ファイルアクセスなどの単体テストにあまり適していないものに依存している場合は、サードパーティのコードをいつでもモックできることに注意してください。

于 2010-06-28T08:24:18.423 に答える
1

クライアント (つまり、コード) の観点から、実行したい操作を定義するインターフェースをサードパーティ インターフェースで記述し、そのインターフェースを実装するサード パーティ インターフェースの薄いラッパーを記述します。次に、単体テストの目的でインターフェイスの代わりにモック オブジェクトを提供できます。また、実際のサード パーティの実装を切り離して、インターフェイスを実装する代替のシン ラッパーを作成するだけで済むようにします。

于 2010-06-28T08:06:46.017 に答える
0

別の OCR システムを使用することを決定するまで、これについて心配する必要はありません。既にコードをインターフェイスに記述しているため、単体テストをある程度分離できます (「ITisClientServicesModule」および「ITisFieldTableData」インターフェイスに対してモックまたはスタブを作成できます)。

現時点で何かを行うとしたら、ユーティリティ メソッド (ErrHanding.Initialise() および Utils.GetFieldCount()) を折りたたむ新しいインターフェイスを派生させて、コードの結合をさらに減らすことです。

于 2010-06-28T08:10:18.063 に答える