2

기본적으로 OCR 기능을 제공하는 시스템이 내 작업장에 있습니다. 프로세스는 캡처 된 화면을 표시하도록 타사 응용 프로그램을 구성하고 (OCR 프로세스 중에) 캡처 된 데이터가 올바른지 확인하는 PC에 사용자가 앉아 있다는 것입니다.추상화 계층을 만드는 TDD

이 캡처 단계에는 각 필드에 대한 유효성 검사가 있습니다. 예를 들어, 문서가 특정 고객의 송장 일 경우, 송장의 공급 업체는 참조 데이터에 대해 검증됩니다. 인증 코드는 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)에 대한 허용이 코드 (우려를 분리),

에서 제 3 자 인터페이스를 제거, 추상화 계층을 만드는 것입니다 나는 이러한 접근법에 익숙하지 않으며 잘못된 가정을 한 경우 사과드립니다. 코드로 어떻게 진행할 지에 대한 조언을 얻을 수 있는지 궁금합니다. 어느 시점에서 우리 회사 (회사)는 다른 제 3 자 OCR 응용 프로그램을 선택하기로했습니다. 사전

답변

1

당신이 수행 할 작업을 정의하는 인터페이스 쓰기에

감사합니다 - 클라이언트에서 (즉 코드)의 관점 - 타사 인터페이스, 세 번째의 주위에 얇은 래퍼 해당 인터페이스를 구현하는 타사 인터페이스. 그런 다음 유닛 테스트를 위해 인터페이스 대신 모의 객체를 제공 할 수 있으며, 실제 타사 구현을 분리하여 인터페이스를 구현하는 대체 씬 래퍼를 작성할 수 있습니다.

+0

+1 다른 대답은 YAGNI (항상 좋은 원칙)에 초점을 맞추는 반면 테스트 가능성을 활성화하는 것도 중요합니다. –

+0

죄송 합니다만, 현재 타사 OCR 도구에서 벗어나고 있습니다. – swissarmykirpan

+0

위 소스에서이 구현 예제를 얻을 수 있습니까? – swissarmykirpan

0

다른 OCR 시스템을 사용하기로 결정하기 전에는 걱정하지 않으셔도됩니다. 인터페이스에 코드를 이미 작성 했으므로 이미 단위 테스트를 분리했습니다 ('ITisClientServicesModule'및 'ITisFieldTableData'인터페이스에 대해 모조 또는 스텁을 만들 수 있음). 나는 순간에 아무것도을 할 수 있었다면

, 그것은 당신의 유틸리티 메소드 (ErrHanding.Initialise()와 Utils.GetFieldCount())에 접어 새로운 인터페이스를 유도하는 것, 그래서 코드 커플 링을 감소 더욱이.

우리가 할 수있다 어느 시점에서
+0

코드가 이미 작성되어 작동하더라도 Michael Feathers의 정의에 따라 ** 기존 코드 **가 될 수 있습니다. OP는 리팩토링 전에 기존 코드에 단위 테스트를 적용하고 ** Seams **를 도입하면 도움이 될 수 있습니다. –

+0

이미 경계선으로 코딩하는 것을 고려하지 않겠습니까? –

+0

"유틸리티 방법"은 타사 라이브러리의 일부이기도합니다 – swissarmykirpan

1

...

YAGNI 경고!

당신이 알고있는 물건에 초점을 맞춰야합니다. 오늘. TDD를 위해서 추상화 레이어를 만들어야한다는 규칙은 없습니다. 사실, 불필요한 추상화를 도입하면 코드에 해가 될 수도 있습니다 (코드 팽창). OCR 구현을 두 개 이상 지원해야하는 경우 하루가 지나면 그 추상화를 만들어야합니다.

테스트하기 어렵거나 데이터베이스와 같은 물건에 의존하는 타사 코드를 조롱 할 수 있습니다. 네트워크 테스트는 실제로 단위 테스트에 적합하지 않습니다.

+0

이것은 현재 코드를 모두 테스트 할 수있는 경우에만 해당됩니다. ** 솔기 **는 테스트 가능성을 활성화하고 솔기를 도입하면 앞으로 나아갈 수 있습니다. –

+0

사과, 우리는 분명히 멀리 이동할 것입니다. – swissarmykirpan