Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
S>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?
Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
S>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?
Всё зависит от того, есть ли какие-то закономерности. Если во всех 9 случаях нужен уникальный код, то, возможно, удобнее будет сделать плоский switch по (state1, state2) с девятью кейзами.
Если обработка state2 "почти всегда" одинакова, но для некоторых значений из state1 нужны исключения, то может оказаться удобнее ООП подход, где state1 — это классы в некоторой иерархии, а state2 — методы этих классов.
Универсального способа не существует.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>>>А если не просто значение нужно вернуть — а вызвать некие методы? S>>Ну значит хранить там лямбды. Правда по памяти дороговато.
S>Ну оно же все равно не наглядно будет. Ничем не лучше вложенных switch.
Тебе не угодить. Сделай хоть как-нибудь, а то так и будешь месяц размышлять, а тебя за это время уволят
Re[7]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>А если еще и контекст нужно захватить и методов сильно больше двух, так что "верстка" таблицы посыпется?
Если вёрстка таблицы "посыпется", то надо просто пойти по стандартному пути — дать анонимным методам имена. S>Это явно решение имеет наглядность только для простых случаев.
Ну так случаи-то все разные. Конкретно ваш делается так.
Будет другой случай — будет другое решение. Например — полиморфизм.
Или вот такое тоже вполне себе прилично будет смотреться:
using System;
public class C
{
enum GradeOfMen
{
Black,
Mandarin,
Aryan
}
public static void Main(string[] args)
{
TransformAMan(GradeOfMen.Mandarin, GradeOfMen.Black);
}
static void TransformAMan(GradeOfMen fromMan, GradeOfMen toMan)
{
switch ((fromMan, toMan))
{
case (GradeOfMen.Black, GradeOfMen.Mandarin):
Wash(); GlueEyes(); break;
case (GradeOfMen.Mandarin, GradeOfMen.Black):
Soot(); Scare(); break;
case (GradeOfMen.Aryan, GradeOfMen.Black):
Soot(); break;
case(GradeOfMen.Aryan, GradeOfMen.Mandarin):
GlueEyes(); break;
case (var x, var y) when x==y:
break;
default: throw new InvalidOperationException();
}
}
static void Scare() => Console.WriteLine("Пугаем (глаза увеличиваются)");
static void Wash() => Console.WriteLine("Отмываем");
static void Soot() => Console.WriteLine("Посыпаем сажей");
static void GlueEyes() => Console.WriteLine("Клеим глаза");
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Danchik, Вы писали:
D>>Я так понял вы пишете FSM (Finite State Machine). D>>Ну выбирайте, что посвежее https://stackoverflow.com/questions/632391/state-machine-frameworks-for-net
S>Да, оно таки. Вот помню что что-то какое встречал, но даже забыл как называется.
S>Но ничего годного так и не нашлось, к сожалению Самые популярные Automatonymous и stateless. Последнее толком не поддерживается. Для первого толком нет документации и нормальных примеров.
S>Оно же еще и умеет сохранять свое состояние.
S>Как часто все это дело используют вообще?
Ну вот когда надо такое трекать, например протокол обмена данными, состояние конекта, авторизации, пересылки. Если приходит ивент который никак не обрабатывается текущим состоянием — сбрасываем на реконект состояние и тд. Есть еще куча, просто гуглите. Сам себе такие клепал.
Re[5]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, удусекшл, Вы писали:
У>>Значит, хранить в матрице методы
S>Там же не указаны названия столбцов и строк.
Где там?
S>Нет выравнивания по ширине.
1)хранятся указатели, т.е. int64(int32);
2)выравнивание по ширине это что в данном контексте? оно сильно нужно?
S>Притом методов может быть несколько а так же просто установка состояния сущности базы.
Все содержимое соотв. case в лямбду. Не понимаю сути проблемы.
M[st1,st2](dbcontext, other state params);
Кодом людям нужно помогать!
Re: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
НС>>Вложенные то зачем? Pattern matching и positional pattern справятся без вложений. S>Но все равно 9 значений выбора получится, можно сказать одним длинным списком.
И? То ты жалуешься на вложенность, а когда предложили без вложености тебе сразу вложеность стала мила.
S>По-моему со вложенными switch более наглядно, чем просто плоским списком?
Наглядность — понятие субъективное.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2.
сама постановка задачи некорректна. state может быть либо 1 либо 2.
параметры это уже другое.
но в общем как я сказал, проще всего описать множество состояний в виде алгебраического типа. тогда каждое состояние будет обработано своим обработчиком.
ну или еще наверно можно через битовые маски.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Так нужно же 2 значения — state1 и state 2. Делать одним длинным списком?
Вы точно знакомы с языками программирования? Хеш таблицы, типы данных?
State = {state1,state2,...}
Re[4]: Таблица из двух параметров - как лучше записать?
Здравствуйте, kov_serg, Вы писали:
S>>Так нужно же 2 значения — state1 и state 2. Делать одним длинным списком? _>Вы точно знакомы с языками программирования? Хеш таблицы, типы данных? _>State = {state1,state2,...}
По условиям задачи каждый из state (и state1 и state2) имеет 3 варианта значений.
Re[3]: Таблица из двух параметров - как лучше записать?
public class C {
public static Func<int, String>[,] _handlers = new Func<int, String>[,]{
{A1, B1, C1},
{A2, B2, C2},
{A3, B3, C3}
};
public void M(int state1, int state2, int value) {
Console.WriteLine(_handlers[state1, state2](value));
}
public static string A1(int a) => a.ToString();
public static string B1(int a) => (2*a).ToString();
public static string C1(int a) => (3*a).ToString();
public static string A2(int a) => (a+1).ToString();
public static string B2(int a) => (2*a+1).ToString();
public static string C2(int a) => (3*a+1).ToString();
public static string A3(int a) => (a-1).ToString();
public static string B3(int a) => (2*a-1).ToString();
public static string C3(int a) => (3*a-1).ToString();
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?
Добавляю пример для ясности:
Скрытый текст
using System;
namespace ConsoleApp36
{
class Program
{
enum GradeOfMen
{
Black,
Mandarin,
Aryan
}
static void Main(string[] args)
{
TransformAMan(GradeOfMen.Mandarin, GradeOfMen.Black);
}
static void TransformAMan(GradeOfMen fromMan, GradeOfMen toMan)
{
switch (fromMan)
{
case GradeOfMen.Black:
switch (toMan)
{
case GradeOfMen.Black:
// do nothingbreak;
case GradeOfMen.Mandarin:
Wash();
GlueEyes();
break;
case GradeOfMen.Aryan:
throw new InvalidOperationException(); // impossibledefault:
throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
}
break;
case GradeOfMen.Mandarin:
switch (toMan)
{
case GradeOfMen.Black:
Soot();
Scare();
break;
case GradeOfMen.Mandarin:
// do nothingbreak;
case GradeOfMen.Aryan:
throw new InvalidOperationException(); // impossibledefault:
throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
}
break;
case GradeOfMen.Aryan:
switch (toMan)
{
case GradeOfMen.Black:
Soot();
break;
case GradeOfMen.Mandarin:
GlueEyes();
break;
case GradeOfMen.Aryan:
// do nothingbreak;
default:
throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(fromMan), fromMan, null);
}
}
static void Scare() => Console.WriteLine("Пугаем (глаза увеличиваются)");
static void Wash() => Console.WriteLine("Отмываем");
static void Soot() => Console.WriteLine("Посыпаем сажей");
static void GlueEyes() => Console.WriteLine("Клеим глаза");
}
}
Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
S>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?
Для 2-х можно матрицу, т.е. индексами будут state1, state2 или соотв. им целые значения. Для большего кол-ва
состояний тоже матрица, токмо многомерная M[state1,state2,state3,...].
Кодом людям нужно помогать!
Re[2]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Sharov, Вы писали:
S>Для 2-х можно матрицу, т.е. индексами будут state1, state2 или соотв. им целые значения. Для большего кол-ва S>состояний тоже матрица, токмо многомерная M[state1,state2,state3,...].
А если не просто значение нужно вернуть — а вызвать некие методы?
Re[3]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>>Для 2-х можно матрицу, т.е. индексами будут state1, state2 или соотв. им целые значения. Для большего кол-ва S>>состояний тоже матрица, токмо многомерная M[state1,state2,state3,...].
S>А если не просто значение нужно вернуть — а вызвать некие методы?
Значит, хранить в матрице методы
Re[4]: Таблица из двух параметров - как лучше записать?
Здравствуйте, удусекшл, Вы писали:
У>Значит, хранить в матрице методы
Ну оно же как-то не наглядно получается. Там же не указаны названия столбцов и строк. Нет выравнивания по ширине. Притом методов может быть несколько а так же просто установка состояния сущности базы.
Re[3]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Sharov, Вы писали:
S>>Для 2-х можно матрицу, т.е. индексами будут state1, state2 или соотв. им целые значения. Для большего кол-ва S>>состояний тоже матрица, токмо многомерная M[state1,state2,state3,...].
S>А если не просто значение нужно вернуть — а вызвать некие методы?
Ну значит хранить там лямбды. Правда по памяти дороговато.
Кодом людям нужно помогать!
Re[4]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Sharov, Вы писали:
S>>А если не просто значение нужно вернуть — а вызвать некие методы? S>Ну значит хранить там лямбды. Правда по памяти дороговато.
Ну оно же все равно не наглядно будет. Ничем не лучше вложенных switch.
Re[2]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Вложенные то зачем? Pattern matching и positional pattern справятся без вложений.
Но все равно 9 значений выбора получится, можно сказать одним длинным списком. По-моему со вложенными switch более наглядно, чем просто плоским списком?
Re: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
S>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?
C#:
1) record(union types)+switch express
2) ad-hoc polymorphism with dynamic
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).
S>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch.
???? S>Есть ли что более красивое?
Dictionary<State,Action>
Re[2]: Таблица из двух параметров - как лучше записать?
Здравствуйте, kov_serg, Вы писали:
S>>Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch.
switch (state1)
case State1.One:
switch (state2)
...
break;
...
S>>Есть ли что более красивое? _>Dictionary<State,Action>
Так нужно же 2 значения — state1 и state 2. Делать одним длинным списком?
Re[4]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>>Вложенные то зачем? Pattern matching и positional pattern справятся без вложений. S>>Но все равно 9 значений выбора получится, можно сказать одним длинным списком.
НС>И? То ты жалуешься на вложенность, а когда предложили без вложености тебе сразу вложеность стала мила.
Самое наглядное — это таблица. Вот представьте таблицу — разве будет удобно, если ее представить в виде плоского теста и каждый раз дублировать названия столбцов и строк?
Но и вложенные switch не на много удобнее.
Re[3]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Самое наглядное — это таблица.
Таблицу тебе тоже уже предложили в виде Dictionary<State, Action>, но и она тебе тоже не мила.
S> Вот представьте таблицу — разве будет удобно, если ее представить в виде плоского теста и каждый раз дублировать названия столбцов и строк?
Зачем в PM дублировать названия столбцов? Кортежи никто пока не отменял.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Таблица из двух параметров - как лучше записать?
Да, оно таки. Вот помню что что-то какое встречал, но даже забыл как называется.
Но ничего годного так и не нашлось, к сожалению Самые популярные Automatonymous и stateless. Последнее толком не поддерживается. Для первого толком нет документации и нормальных примеров.
Оно же еще и умеет сохранять свое состояние.
Как часто все это дело используют вообще?
Re[6]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Sinclair, Вы писали:
S>Ну, и в чём проблема?
А если еще и контекст нужно захватить и методов сильно больше двух, так что "верстка" таблицы посыпется? Это явно решение имеет наглядность только для простых случаев.
Re[9]: Таблица из двух параметров - как лучше записать?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Sinclair, Вы писали:
S>>Или вот такое тоже вполне себе прилично будет смотреться:
S>Все же на первый взгляд не ясно — все ли случаи перебраны, ничего ли не упустили.
S>Наверное более подходящее решение — применить https://rsdn.org/forum/dotnet/8133614.flat