metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-11-22 02:15 pm

Ад со вшами жолтыми

С некоторых пор ничто так не бесит, как восход солнца вручную реализация систем типов и разного рода классов-объектов поверх уже существующих языков.

Вот к примеру, задача: есть система, в ней настройки. Настроек очень дохренища, настройки могут быть привязаны к 4 уровням иерархии(общие, подразделение, профиль пользователя, пользователь), и на каждом уровне переопределять предыдущий.

Формально настройки являются просто очень большим объектом с кучей полей разнообразных типов. Но из-за переопределения, к каждой сущности такой объект не привяжешь, или к каждому полю придется цеплять флаг "есть значение". Поэтому поля хранятся в словаре <имя_поля,значение_поля>. Уже цирк с конями.
Затем начинаются пляски с бубном "как бы это все аккуратно показать в GUI". Нарисовать руками редактор с закладками для 100 полей - увольте, я сдохну это поддерживать, если что-то добавится. Поэтому все поля показываются в гридах(ну типа как в мозиле, about:config, только по категориям разбит, чтобы юзеру проще мышой шароебиццо было). А часть настроек, сука, всякие массивы или списки типа "список подписей и расположения полей в отчетных гридах" или "список кастомных полей документа с подписями и типами". И все это при аккуратной реализации (чтобы было удобно юзеру и не требовало стояния на ушах при поддержке) настолько удалбывает - не передать.

Это еще хорошо, что 2/3 кода для этой пакости генерируется прямо из специальной базы данных, где вся эта модель конфигурации описана и редактируется культурно прямо в гриде, а не блин редактированием тысячестрочных исходников и SQL запросов.

[identity profile] permea-kra.livejournal.com 2009-11-22 03:03 pm (UTC)(link)
Ребе, а на чём это ? (язык)

[identity profile] metaclass.livejournal.com 2009-11-22 03:09 pm (UTC)(link)
Основная прога и веб-сервис - .NET, C#
Конфигурация веб-сервиса - sqlite
Основная база данных - mssql
База данных для модели конфигурации - Firebird (ни под что больше нормального GUI-клиента нету).
Кодогенератор из модели в разнообразные sql и C# - на дельфи.

[identity profile] freiksenet.livejournal.com 2009-11-22 03:44 pm (UTC)(link)
Это просто ад какойто :)

[identity profile] metaclass.livejournal.com 2009-11-22 03:49 pm (UTC)(link)
Я ж говорю, ад с вшами разных цветов. Практически вся палитра 2^24 степени.

[identity profile] freiksenet.livejournal.com 2009-11-22 03:59 pm (UTC)(link)
Не хватает Cobol-а или Visual Basic-а, на крайняк )

[identity profile] permea-kra.livejournal.com 2009-11-22 03:57 pm (UTC)(link)
Ребе, а вы не собираетесь это переделывать?

[identity profile] metaclass.livejournal.com 2009-11-22 04:23 pm (UTC)(link)
Я именно этим и занимаюсь.

До того было еще хуже - конфигурация частично в mssql, частично в 150 XML файлах, редактирование оных исключительно руками в notepad2, исходный код на C# превратился в тыкву за 4 года разработки в стиле "вот срочно нужна на завтра фича" и отсутствия четких требований. Т.е. ад троекратный :)

[identity profile] w00dy.livejournal.com 2009-11-22 05:00 pm (UTC)(link)
Если это всё переисывать, то я бы вынес в классы и атрибуты. Потом налету вытаскиваем всё это через reflection, запихиваем в грид, добавляем валидаторы (чтобы не запихнуть строку в число), где нужен хитрый редактор (это всё прописано в атрибутах, включая тип редактора) - показываем кнопку редактирования и создаём этот хитрый редактор при нажатии. В результате чтобы добавить новую настройку достаточно только добавить её в нужный класс и нормально прописать атрибуты, а дальше оно как-нить само.

PS Можно даже окно с редактором настроек генерировать автоматом, если все знания вынести в атрибуты. Сделать что-то аля Options в Visual Studio (слева дерево, справа всё остальное)

[identity profile] metaclass.livejournal.com 2009-11-22 05:09 pm (UTC)(link)
Уже делал так, и даже работает.
Нечитабельно в принципе. Редактированию поддается с трудом. Нет возможности проверки валидности на уровне БД(списки ключей - только в коде).

Я сейчас делаю наоборот: данные изначально в специальной базе данных, из нее генерируются скрипты заполнения основной базы, исходный код объекта с атрибутами, код загрузки-сохранения, и прочее. А от генератора гуи для редактора я отказался - там вылазят такие кошмары, если хочется сделать что-то сложнее редактора простых типов, что проще все таки пока с гридом работать. Да, и дерево там тоже есть.