2013-03-29 2 views
2

Общепринятая практика - связать логику потоков с бизнес-логикой? Я задаю вопросы, связанные с тестированием, задаваясь вопросом, есть ли преимущества/недостатки для тестирования бизнес-аналитики, привязанного к логике потоков. Рассмотрим следующий,Развязка логики потоков из бизнес-логики?

class Thread { ... } 
class FooThread : public Thread { 
    /* business intelligence coupled to threading */ 
} 

или,

class Thread { ... } 
class Foo { 
    ... 
    /* once again coupled */ 
    Thread th; 
} 

Эти подходы, кажется, идут несколько против пытается абстрагироваться от зависимостей при тестировании классов. Было бы возможно/приемлемо вместо этого создать класс, который может быть полностью исключен из потоковой обработки, возможно, с использованием шаблонов?

template<class SomeFooClass> 
class Thread { ... } 

class Foo { 
    /* this class can be tested separately */ 
} 

typedef Thread<Foo> FooThread; 

Будут ли какие-либо выгоды/недостатки? Можно ли использовать этот же подход для отладки бизнес-логики от других общих шаблонов проектирования?

ответ

1

Нити и другие вычислительные эффекты, как правило, дают авторам экспериментального теста головную боль. Если можно, держите управление потоком инкапсулированным от вашей бизнес-логики под контролем.

Если вы ищете идеи о том, как это сделать, рассмотрите вопрос о создании типа, представляющего работу, которую может выполнять поток (этот тип может быть Functor, полномасштабным классом или, возможно, просто указателем функции.)

Поместите свою «чистую» бизнес-логику в экземпляр этого «runnable» типа и протестируйте его в этом интерфейсе. Затем вы можете реализовать многоразовый пул потоков, который (скажем) принимает эти runnables в очереди и выполняет каждый. Возможны многие вариации этого шаблона; Я предлагаю искать в библиотеках boost для поиска существующих реализаций.

Что такое разделение вообще не избавление от бремени синхронизации, которое обычно является сквозной проблемой. Замки имеют способ проскользнуть в экологически чистую бизнес-логику. Вы можете либо попытаться справиться с ними, высмеивая их, либо попытаться полностью исключить блокировку (в каждом конкретном случае) путем сериализации доступа, например. с выделенным потоком «брокера» и очередью runnables.

+0

Не будет ли смысл отделять потоки от бизнес-логики, чтобы протестировать чистую бизнес-логику? Зачем тестировать интерфейс «runnable» или как он отличается от класса, связанного с его поточной обработкой? – jwalk

+0

Интерфейс runnable будет простым/чистым кодом. Вы, конечно, можете протестировать под ним, если хотите. Если вы пытаетесь доказать, что рабочий поток выполняет правильную последовательность шагов (в отличие от проверки того, что объекты, с которыми они манипулируют, сами по себе являются правильными), то runnable действует как чистый контейнер для действий, которые должен предпринять рабочий. – phs

+0

Итак, Runnable будет в основном обычным интерфейсом для типов, которые могут быть переданы и выполнены отдельным объектом потока? – jwalk