Каждый отдел выполняет 3 действия. Класс RuleEvent
определяет какую печать поставить, какую зачеркнуть и в какой отдел отправить Васю.
Следующий код создаст событие, которе поставит печать C, зачеркнёт печать A и отправит Васю в отдел PhpStorm:
var event = new RuleEvent("C","A","PhpStorm");
За представление отдела органзации отвечает класс Department
.
Создание отдела PyCharm с безусловным правилом:
var dep1 = new Department("PyCharm", new RuleEvent("C","A","PhpStorm"));
Создание отдела PhpStorm с условным правилом в зависимости от наличия печати D:
var dep2 = new Department("PhpStorm","D", new RuleEvent("G","A","DataGrid"), new RuleEvent("A","B","Rider"))
Хранит конфигурацию организации, а именно:
- Отдел с которого Вася начнёт обход
- Отдел на котором Вася закончит обход
- Список всех отделов
Пример создания конфигурации:
Шаг 1 Создаём коллекцию отедлов
List<Department> departments = new List<Department>()
{
new Department("CLion", new RuleEvent("A","B","PyCharm")),
new Department("PyCharm", new RuleEvent("C","A","PhpStorm")),
new Department("PhpStorm","D", new RuleEvent("G","A","DataGrid"), new RuleEvent("A","B","Rider")),
new Department("Rider", new RuleEvent("D","B","PhpStorm")),
new Department("DataGrid", new RuleEvent("K","B","PhpStorm"))
};
Шаг 2 Устанавливаем CLion стартовым отделом, а DataGrid конечным.
var configuration = new OrganizationConfiguration("CLion","DataGrid",departments);
Все предыдущие классы нужны были для создания конфигурации организации. Класс Organization
служит для получения ответа на запрос поставленный в задаче.
Organization organization = new Organization(configuration);
Создадим example.json по следующему шаблону:
{
"departments": [
{
"rule": {
"event": {
"putStampId": "A",
"crossStampId": "B",
"nextDepartmentId": "PyCharm"
}
},
"id": "CLion"
},
{
"rule": {
"event": {
"putStampId": "C",
"crossStampId": "A",
"nextDepartmentId": "PhpStorm"
}
},
"id": "PyCharm"
},
{
"rule": {
"conditionalStamp": "D",
"event1": {
"putStampId": "A",
"crossStampId": "B",
"nextDepartmentId": "DataGrid"
},
"event2": {
"putStampId": "A",
"crossStampId": "B",
"nextDepartmentId": "Rider"
}
},
"id": "PhpStorm"
},
{
"rule": {
"event": {
"putStampId": "D",
"crossStampId": "B",
"nextDepartmentId": "PhpStorm"
}
},
"id": "Rider"
},
{
"rule": {
"event": {
"putStampId": "D",
"crossStampId": "B",
"nextDepartmentId": "PhpStorm"
}
},
"id": "DataGrid"
}
],
"startDepartment": "CLion",
"endDepartment": "PhpStorm"
}
Создадим организацию:
Organization organization;
using (StreamReader file = File.OpenText(yourpath + "example.json")
{
organization = new Organization(file.ReadToEnd());
}
Также можно сменить конфигурацию вызвав метод Configure() у organization
organization.Configure(anotherConfiguration);
organization.Configure(jsonConfiguration);
После задания конфигурации, можно послать запрос вида "какие незачеркнутые (в том числе - зачеркнутые) печати есть в обходном листе Васи, когда он в ходе путешествия выходит из отдела Q". Метод GetResult возвращает BypassResult, который хранит все состояния обходного листа (снапшоты), когда Вася выходил из отдела Q, или сообщение об ошибке.
BypassResult result = await organization.GetResultAsync("CLion");
if(result.Successful)
{
var sheetSnapshots = result.BypassSheetSnapshots;
foreach(var snapshot in sheetSnapshots)
{
foreach(var stamp in snapshot.Stamps)
Console.WriteLine($"Печать {stamp.Id} - {stamp.State}");
Console.WriteLine();
}
}
else
{
Console.WriteLine(result.Exception.Message);
}
//Или в формате JSON
Console.WriteLine(result.ToJson());
Пример ответа при успешном запросе:
{
"successful": "true",
"snapshots": [
{
"stamps": [
{
"id": "A",
"state": "Putted"
},
{
"id": "C",
"state": "Putted"
}
]
},
{
"stamps": [
{
"id": "A",
"state": "Crossed"
},
{
"id": "C",
"state": "Putted"
},
{
"id": "D",
"state": "Putted"
},
{
"id": "G",
"state": "Putted"
}
]
}
],
"isLooping": false
}