Здравствуйте, IT, Вы писали:
__>>правда, мне непонятно что делает эта ф-ия. упрощает выражения? обьясните на пальцах, пожалста
IT>Это типа визитора, только без создания сотен классов.
IT>Теперь всё же мне хочется получить ответ на предыдущий вопрос. Есть метод с хорошей архитектурой, который после устранения копипасты и добавления новых типов выражений составляет 250 строк. Как из него сделать хотя бы строк 10?
как я и говорю, мне непонятно, что конкретно он делает
если т.з. на этот метод звучит как "типа визитора, только без создания сотен классов" то я бы переписал его так:
public static void Visit(this Expression expr, Func<Expression,bool> func)
{
DontCreateHundredClasses();
}
это полностью удовлетворяют заданию и, как видите, можно и в одну строчку уложить. в принципе, я даже не уверен что и она нужна
вообще, обычно, чтобы убедиться что этот код д-но удовлетворяет т.з., люди сначала пишут тесты, а потом соотв-но запускают и проверяют. покажите мне тесты на этот класс, а я попробую догадаться, что он делает на самом деле
(добавил позже)
ааа, я, похоже начинаю догадываться. то есть мы хотим просто пройти по всем подвыражения одного выражения и вызывать лямбду? я прав?
ну это просто
public static void Visit(this Expression expr, Func<Expression,bool> func)
{
for_each(subexpr : expr.sub_expressions())
{
Visit(subexpr, func);
func(subexpr);
}
}
ну и имя тогда конечно попнятнее стоит дать, а то никогда не догадаешься, что Visit лезет в подвыражения, пока в метод не посмотришь. соотв-но, четче будет что-то в духе for_every_subexpression_do()