Skip to content

MrVonny/BureaucraticOrganization

Repository files navigation

BureaucraticOrganization

Инициализация

RuleEvent

Каждый отдел выполняет 3 действия. Класс RuleEvent определяет какую печать поставить, какую зачеркнуть и в какой отдел отправить Васю.

Следующий код создаст событие, которе поставит печать C, зачеркнёт печать A и отправит Васю в отдел PhpStorm:

var event = new RuleEvent("C","A","PhpStorm");

Department

За представление отдела органзации отвечает класс 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"))

OrganizationConfiguration

Хранит конфигурацию организации, а именно:

  • Отдел с которого Вася начнёт обход
  • Отдел на котором Вася закончит обход
  • Список всех отделов

Пример создания конфигурации:

Шаг 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 organization = new Organization(configuration);

Инициализаия через JSON

Создадим 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
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages