Лінощі, рефлексія, атрибути, динамічні зборки
Невеликий досвід, отриманий завдяки лінощі
Років зо три тому, працював я на одну фірму. Було нас 4 програмісти. Один писав бізнес логіки програми. Описував її за допомогою інтерфейсів (interface). Логічні зв'язки, залежності і т. д. Наше завдання було реалізувати ці інтерфейси і пов'язати з GUI. Основною проблемою у цій системі були постійні зміни структури зв'язків та параметрів. Тобто нам доводилося постійно займатися правкою та рефакторингом.
Я людина досить лінива. Тому прийшла думка — невже не можна, як це автоматизувати. І я сів за книжки.
Перша ідея була достатньо явна і проста. Інтерфейси містяться в окремих файлах — тож чому б не розпарсувати їх і створити текстовий файл зі згенерованим класом. Так було зроблено.
Начебто проблема вирішена. Але роботи ще багато залишалося: перенесення файлів, рефакторинг. Та ще у хлопців нічого не змінилося. Вони займалися створенням UI та прив'язкою його до об'єктної моделі.
Продовжуючи пошуки в мережі я натрапив на опис класу Type, зацікавившись, я почитав про нього докладніше. Є багато цікавих функцій цього класу. Фактично завдяки йому можна отримати всю інформацію по класу. Конструктор, реалізовані інтерфейси, характеристики, змінні, функції ... Повну інформацію. І я почав експериментувати з ним, і в результаті отримав:
То був прорив. Було створено обгортку, яка займалася біндингом даних до GUI за тестовими структурами. Швидкість розробки значно збільшилась. В принципі, можна було б заспокоїтися.Але ж я лінивий.
Клас ILGeneratorВдома, почитавши інформацію з цього класу, я зрозумів — це воно.
Кручу-верчу, що хочу те і ворочу
Зібравши в купу всюінформацію, я приступив до справи.
Трохи почухавши ріпу, я створив клас з генерації динамічних об'єктів на базі переданих: базового класу (будь-якого) і списку інтерфейсів:
Трохи опишу проект
Формування властивостей об'єкта:
З поточних можливостей:
Формування динамічних класів-об'єктів на базі переданих: базового класу та списку інтерфейсів, можливість зберегти ці об'єкти в окрему бібліотеку(dll), через BuilderClassesPropertyAttribyte спадкоємця Attribute можна ставити у вбудованих параметрів-об'єктів різне успадкування та поведінку. Формування та ініціалізація об'єктів-класів проводитися з безліччю вкладених об'єктів.
Планую в майбутньому:
Дати можливість формувати об'єкти від декількох класів та інтерфейсів. Дуже мені вже не вистачало після цього С++.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»