Без обид, но есть пара запахов кода:
this.Blah = this.Blah.Resolve(...);
В частности, эта строка заставит меня начать процесс переосмысления.
Основные проблемы, с которыми у меня возникнут проблемы, - это тип возвращаемого объекта и присвоение свойства значению, возвращаемому путем вызова метода этого свойства. Они оба пахнут, как будто вы где-то испортили наследство, и в итоге вы получили систему с большим состоянием, которая одновременно является испытателем ошибок и болью в обслуживании.
Возможно, было бы лучше переосмыслить, а не пытаться использовать хитрости и уловки, чтобы обойти эту проблему: я обычно нахожу, что если я пытаюсь злоупотреблять языком с помощью функции, такой как макросы, мой дизайн нуждается в работе!
EDIT
Хорошо, так что с добавленной информацией, возможно, это не так сильно пахнет, но я все же рекомендую следующее:
class ExampleExpr{
StatefulData data ... // some variables that contain the state data
BladhyBlah Blah { get; set; }
object Function(params) {
this.Blah = this.Blah.Resolve(params);
....
}
}
Этот код вызывает беспокойство, поскольку он требует подхода, полностью основанного на состоянии, вывод зависит от того, что произошло заранее, и, следовательно, требует определенных шагов для репликации. Это боль, чтобы проверить. Кроме того, если вы дважды вызовете функцию (), нет никакой гарантии, что произойдет с Бла, не зная, в каком состоянии он был в первую очередь.
class ExampleExpr{
StatefulData data ... // some variables that contain the state data
object Function(params) {
BlahdyBlah blah = BlahdyBlah.Resolve(params, statefulData);
}
}
если вместо этого мы используем метод фабричного стиля, возвращая новый экземпляр с конкретной информацией всякий раз, когда нам предоставляют определенный набор параметров, мы исключили одно место, где используются данные с состоянием (т. Е. Экземпляр BladhyBlah теперь создается при каждом вызове с определенным набором параметров).
Это означает, что мы можем тиражировать любую функциональность при тестировании, просто вызывая функцию (параметры) с определенной функцией Setup () для создания statefulData и определенного набора параметров.
Теоретически это менее эффективно (так как новый BlahdyBlah создается при каждом вызове фабрики), но возможно кэшировать экземпляры BlahdyBlah с конкретными данными и делиться ими между вызовами фабрики (при условии, что у них нет других методов, которые влияют на их внутреннее состояние). Тем не менее, он НАМНОГО более дружественен к обслуживанию и с точки зрения тестирования полностью выводит из строя данные о состоянии.
Это также помогает устранить вашу исходную проблему, так как, когда мы не полагаемся на внутреннюю переменную экземпляра, мы все можем Разрешить (params, statefulData) извне из Function (params) и просто не вызывать Function (params), если любой бла == null или blah.SomeFlag == SomeFlag. Что угодно. Таким образом, перемещая это за пределы метода, нам больше не нужно беспокоиться о возвратах.
Надеюсь, что это где-то в правильном поле, трудно точно знать, что порекомендовать, учитывая небольшой пример, как это обычно бывает с трудными / абстрактными вопросами здесь.