Коли проєкт виростає до великих розмірів, буває важко в ньому орієнтуватись. Тому приходиться думати як приховати складність і мати можливість зосередитись саме на побудові логіки. Крім того, потрібно мати можливість швидко відтестувати частину проєкту незалежно, встановивши якісь конкретні вхідні дані. Тут і появляються проєкти в проєктах і плагіни. Плагіни мені не зайшли – не використовую, а от проєкт в проєкті – час від часу мені буває корисним.
Значить на форумі рекомендують використовувати внутрішні змінні, або об’єкт 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 і номер набору параметрів, але в даному випадку я просто попробував розказати логіку.
Цю саму реалізацію я рекомендував одному користувачу на форумі, побачив що він зустрівся з такою ж проблемою, яка була в мене коли я вивчав кінцеві автомати (власне тоді і потрібно було часто передавати багато параметрів у проєкт який визивався в залежності від умов).