А как правильно группировать набор из методов?
От: -n1l-  
Дата: 26.01.15 08:45
Оценка:
Интересный вопрос возник у меня недавно.
Хотелось бы услышать мнение более опытных коллег.
У вас есть методы, эти методы логически малосвязанны между собой, но комбинируя их вызовы вы получите разного рода поведение программы.
Пока что я не нашел никакого лучше выхода кроме как засунуть разные комбинации вызовов методов в другие методы.

К примеру, есть у нас вот аткие методы:


void Foo()
string Bar()
void Baz(int a, int b)
int Quux(string a)


Комбинируя вызовы этих методов можно получить:


void RunProcessOne()
{
  Baz(a,b);
  Foo();
  Bar();
  Quux(c)    
}


void RunProcessTwo()
{
  Quux(c)
  Baz(a,b);
  Foo();
  Bar();    
}

void RunProcessFree()
{
  Baz(a,b);
  Foo();
  Quux(c)
  Bar();    
}



Может быть есть способ сделать более лучшее архитектурное решение?
Re: А как правильно группировать набор из методов?
От: Nikolay_Ch Россия  
Дата: 26.01.15 10:04
Оценка: 6 (1) +3
Здравствуйте, -n1l-, Вы писали:

N>Пока что я не нашел никакого лучше выхода кроме как засунуть разные комбинации вызовов методов в другие методы.

N>Может быть есть способ сделать более лучшее архитектурное решение?
Может паттерн Template Method?
Re: А как правильно группировать набор из методов?
От: vrr  
Дата: 26.01.15 10:54
Оценка: 6 (1) +1
Здравствуйте, -n1l-, Вы писали:

N>Может быть есть способ сделать более лучшее архитектурное решение?


Общее общие переменные, доступные этим методам, есть?
Комбинаций может быть только 3? Или потенциально — произвольное количество?
Если комбинаций только 3, то имеющееся решение вполне себе, не стал бы ничего придумывать.
Если произвольное количество комбинаций, то очень похоже на паттерн Builder, см., например, StringBuilder. Общее состояние — результирующая строка + произвольный вызов ряда предопределенных методов (Append, AppendLine, AppendFormat etc). Работа может выглядеть так (если fluent interface, как у StringBuilder'a, забабахать):
Baz(a,b).Foo().Bar().Quux(c);
Quux(c).Baz(a,b).Foo().Bar();
Re: А как правильно группировать набор из методов?
От: catbert  
Дата: 26.01.15 11:42
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Может быть есть способ сделать более лучшее архитектурное решение?


Майкрософт для этого специальный фреймворк сделали: https://msdn.microsoft.com/en-us/vstudio/jj684582.aspx
http://nemerle.org/banners/?t=%20catbert%20
Re[2]: А как правильно группировать набор из методов?
От: -n1l-  
Дата: 26.01.15 12:42
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Здравствуйте, -n1l-, Вы писали:


N>>Пока что я не нашел никакого лучше выхода кроме как засунуть разные комбинации вызовов методов в другие методы.

N>>Может быть есть способ сделать более лучшее архитектурное решение?
N_C>Может паттерн Template Method?


Заинтересовало!
Re[2]: А как правильно группировать набор из методов?
От: -n1l-  
Дата: 26.01.15 12:55
Оценка:
Здравствуйте, vrr, Вы писали:

vrr>Здравствуйте, -n1l-, Вы писали:


N>>Может быть есть способ сделать более лучшее архитектурное решение?


vrr>Общее общие переменные, доступные этим методам, есть?

Есть, но не всегда.

vrr>Комбинаций может быть только 3? Или потенциально — произвольное количество?

Произвольное кол-во.
Сейчас комбинаций 4.

vrr>Если произвольное количество комбинаций, то очень похоже на паттерн Builder, см., например, StringBuilder. Общее состояние — результирующая строка + произвольный вызов ряда предопределенных методов (Append, AppendLine, AppendFormat etc). Работа может выглядеть так (если fluent interface, как у StringBuilder'a, забабахать):

vrr>
vrr>Baz(a,b).Foo().Bar().Quux(c);
vrr>Quux(c).Baz(a,b).Foo().Bar();   
vrr>


Результирующего варианта нет, только работа программы.
Сначала я думал о простом конечном автомате, но он получается слишком громоздким и неуклюжим. Тем более нужно смотреть за текущим состоянием, а оно у меня линейно, без ветвлений.

Вот флюент меня очень заинтересовал! Спасибо!
Re[2]: А как правильно группировать набор из методов?
От: -n1l-  
Дата: 26.01.15 12:58
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, -n1l-, Вы писали:


N>>Может быть есть способ сделать более лучшее архитектурное решение?


C>Майкрософт для этого специальный фреймворк сделали: https://msdn.microsoft.com/en-us/vstudio/jj684582.aspx

Ну да, но для меня это излишне.
Re[3]: А как правильно группировать набор из методов?
От: vrr  
Дата: 27.01.15 09:35
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Вот флюент меня очень заинтересовал! Спасибо!

Пожалуйста! Но fluent по сути синтаксический сахар, от метода с вызовами методов не отличается особо, он работать начинает когда есть общее состояние в объекте, у которого реализован fluent interface. Но смотрится интересно, особенно в первый раз.
На таком уровне детализации описания архитектуры идей интереснее у меня нет.
Re[4]: А как правильно группировать набор из методов?
От: -n1l-  
Дата: 28.01.15 07:43
Оценка:
Описание архитектуры может быть любым.
Вдаваясь в подробности, сейчас я делаю библиотеку для автотестеров, что бы они могли легко работать с проектом, быстро писать автотесты.
Но я сталкивался с этой задачей и раньше, например при разработке приложения по работе с анкетными данными нужно было их обработать в правильном порядке.
И эти этапы отличались для разных групп пользователей.
Re: А как правильно группировать набор из методов?
От: andyag  
Дата: 07.02.15 10:02
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Интересный вопрос возник у меня недавно.

...
N>Комбинируя вызовы этих методов можно получить:

N>
N>void RunProcessOne()
N>{
N>  Baz(a,b);
N>  Foo();
N>  Bar();
N>  Quux(c)    
N>}
N>


Не уверен что понял. У вас есть N методов и нужно сделать все вызовы всех перестановок? Возьмите, например, https://www.nuget.org/packages/Combinatorics/ и сделайте как-то так:
var actions = new List<Action> { 
  () => Foo(), 
  () => Bar(), 
  () => Omg() 
};

var scenarios = new Permutations<Action>(actions);
foreach(var scenario in scenarios) {  
  // в scenario будет, например, Bar-Foo-Omg
  foreach(var action in scenario) { // выполняем эти шаги по одному
    action();
  }
}

Я иногда такой подход использую для параметризованных тестов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.