TDD, создающий слой абстракции - PullRequest
2 голосов
/ 28 июня 2010

По сути, на моем рабочем месте есть система, которая обеспечивает возможности оптического распознавания текста.Процесс заключается в том, что стороннее приложение сконфигурировано для отображения захваченного экрана (во время процесса 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 ]

1 голос
/ 28 июня 2010

В какой-то момент мы можем ...

ЯГНИ предупреждение!

Сосредоточьтесь на том, что, как вы знаете, необходимо сегодня.Ради TDD не существует правила, которое гласит, что вы должны создавать уровни абстракции.Фактически, введение ненужных абстракций может даже нанести ущерб коду (раздувание кода). Если придет день, когда вам потребуется поддержка более чем одной реализации OCR, только тогда вам нужно создать эту абстракцию.

Обратите внимание, что вы всегда можете смоделировать сторонний код, если его сложно протестировать и / или использовать такие вещи, как базы данных, доступ к сетевым файлам и файлам, который на самом деле не подходит для модульного тестирования.

1 голос
/ 28 июня 2010

Напишите интерфейс, который определяет операции, которые вы хотите выполнять - с точки зрения клиента (т.е. вашего кода) - на стороннем интерфейсе, и тонкую оболочку вокруг стороннего интерфейса, который реализует этот интерфейс.Затем вы можете предоставить фиктивный объект вместо интерфейса для целей модульного тестирования, и вы развязали фактическую стороннюю реализацию, так что его переключение становится вопросом написания альтернативной тонкой оболочки, реализующей ваш интерфейс.

0 голосов
/ 28 июня 2010

Я бы не стал беспокоиться об этом, пока вы не решите использовать другую систему распознавания текста. Вы уже написали код для интерфейса, поэтому у вас уже есть степень разделения для ваших модульных тестов (вы можете создавать макеты или заглушки для интерфейсов 'ITisClientServicesModule' и 'ITisFieldTableData').

Если бы я должен был сделать что-нибудь на данный момент, было бы получить новые интерфейсы, которые складываются в ваших служебных методах (ErrHanding.Initialise () и Utils.GetFieldCount ()), так что ваш код сцепление снижается дальше.

...