Як передавати значення у вложений проєкт ZennoPoster

Коли проєкт виростає до великих розмірів, буває важко в ньому орієнтуватись. Тому приходиться думати як приховати складність і мати можливість зосередитись саме на побудові логіки. Крім того, потрібно мати можливість швидко відтестувати частину проєкту незалежно, встановивши якісь конкретні вхідні дані. Тут і появляються проєкти в проєктах і плагіни. Плагіни мені не зайшли – не використовую, а от проєкт в проєкті – час від часу мені буває корисним.

Значить на форумі рекомендують використовувати внутрішні змінні, або об’єкт project.Context. Проте що робити, коли змінних багато? А сам project.Context веде себе не завжди так як хотілось би (наприклад при зміні коду дані з нього втрачаються, і приходиться заново заповнювати його даними).

Тому, я в таких випадках іду іншим шляхом – в головному проєкті я створюю змінну, в яку зберігаю у вигляді JSON всі необхідні значення. Так як змінні в ZennoPoster мають унікальні імена, і тим даних текст що для імен змінних, так і для значень – то мені підходить звичайний словарик.

Внутрішній проєкт, який буде визиватись може інколи у різних блоках встановлювати різні значення для однієї і тієї самої змінної. Тому, всі можливі варіанти я добавляю у звичайні текстові масиви рядків.

А дальше все це просто серіалізується у JSON і передається у внутрішній проєкт. Виглядати це може приблизно так:

string[] data1 = new[]{ "w1", "w4", "w7"};
string[] data2 = new[]{ "w2", "w5", "w8"};
string[] data3 = new[]{ "w3", "w6", "w9"};

var dic = new Dictionary<string, string[]>();
dic["v1"] = data1;
dic["v2"] = data2;
dic["v3"] = data3;

project.Variables["temp"].Value =Global.ZennoLab.Json.JsonConvert.SerializeObject(dic,  Global.ZennoLab.Json.Formatting.Indented);

Після чого перший набір параметрів виконується в самому першому блоці, з першим блоком значеннь:

var dic_item = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string, string[]>>(project.Variables["temp"].Value);
int i = 0;
project.Variables["v1"].Value = dic_item["v1"][i];
project.Variables["v2"].Value = dic_item["v2"][i];
project.Variables["v3"].Value = dic_item["v3"][i];

Якщо в якийсь момент часу необхідно кардинально змінити всі налаштування, береться просто інший набір параметрів для змінних, виконується такий фрагмент коду:

var dic_item = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string, string[]>>(project.Variables["temp"].Value);
int i = 1;
project.Variables["v1"].Value = dic_item["v1"][i];
project.Variables["v2"].Value = dic_item["v2"][i];
project.Variables["v3"].Value = dic_item["v3"][i];

І по цьому ж принципу виконується точно такий фрагмент коду, тільки із іншим значенням, щоб взяти наступний набір даних.

var dic_item = Global.ZennoLab.Json.JsonConvert.DeserializeObject<Dictionary<string, string[]>>(project.Variables["temp"].Value);
int i = 2;
project.Variables["v1"].Value = dic_item["v1"][i]; 
project.Variables["v2"].Value = dic_item["v2"][i];
project.Variables["v3"].Value = dic_item["v3"][i];

Звичайно, що все це можна обернути в якийсь метод Load(json, i), винести у загальний код, на вхід передавати тільки JSON і номер набору параметрів, але в даному випадку я просто попробував розказати логіку.

Цю саму реалізацію я рекомендував одному користувачу на форумі, побачив що він зустрівся з такою ж проблемою, яка була в мене коли я вивчав кінцеві автомати (власне тоді і потрібно було часто передавати багато параметрів у проєкт який визивався в залежності від умов).

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *