metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-05-07 08:18 am

Пятничный спор.

В общем, изучение ФП и около того окончательно привело к тому, что я не могу нормально занятся решением прикладных задач.

Сидим с ребе [livejournal.com profile] belnetmon и пытаемся решить, как правильно реализовать своими силами очередную распределенную опердень и не сойти с ума.
Вроде бы сошлись на том что ежики, кактус пишем на .NET 3.5, т.к. в наших виндовых палестинах это более-менее мейнстрим.
Насчет базы данных уже не так ясно - то ли Firebird, то ли Postgresql, но первоначальная идея, что на конкретную базу завязываться не стоит. Но тут уже всплывает первая проблема - распределенность опердени означает синхронизацию баз, а синхронизация баз означает наличие логов изменения всего чего только можно в базе и накатывание этих логов на другие базы(или же наличие для базы родных средств репликации). Т.е. немелкий кусок функциональных требований оказывается в базе и влияет на ее выбор.
Потом начинается следующая хрень: есть две вариации этой опердени - глобальная с трехзвенкой (ну тупо пустить всю работу по HTTP более удобно чем лезть напрямую в базу клиентом) и локальная двухзвенная (поднимать IIS на компе с ограниченным функционалом и сертифицируемым софтом совершенно нет желания). Но базы данных должны быть идентичны, и клиентская часть в плане GUI желательно должна быть реализована на одной и той же основе, потому что нужны одни и те же функции работы с db-centric приложениями (отчеты, печать, фильтры, сортировка, итд).


А вот дальше начинается спор на тему: как лучше делать?

Мне проще закатить солнце вручную наклепать (вернее оно уже частично сделано для других проектов) некий DSL для моделей и генерации из них кода, потом запилить всю предметную область в модель и из нее сгенерировать следующее:

1) Схему БД(таблицы, view на них, таблица логов изменений, запросы, итд)
2) ORM-маппинги (то ли руками, то ли используя NHibernate или тому подобное)
3) Метаданные для GUI (подписи полей, справочники, форматы полей ввода

Для сложных расчетных алгоритмов использовать до кучи LINQ и F# как наиболее лаконичный способ выражать всякую безумную логику. Кодогенератор тоже сделан на F#.


Альтернативный вариант: все по максимуму делать на "готовых" технологиях: Entity Framework, LINQ, чисто C#, т.е. условно говоря, пытаться следовать в мейнстриме. Я примерно представляю, зачем это нужно - на готовые технологии потом проще найти людей на поддержку.
Но у меня при работе с .NET по жизни получается такая хрень: использование "готовых" технологий постоянно упирается в какие-то тупики в силу того, что эти высокоуровневые библиотеки разработаны какими-то не совсем вменяемыми индусами в микрософте, да еще сверху ими командуют вообще невменяемые маркетологи и менеджеры. И приходится городить костыли, сидеть в рефлекторе, копаться в исходниках, итд.

И второе, что меня в этом варианте напрягает - готовые варианты создания моделей предметной области покрывают только малую часть требуемых функций, например "только ORM и запросы к объектам". А мне нужны еще поддержка физической и логической версионности объектов, метаданные для GUI и сериализации объектов и в итоге получается, что даже объекты предметной области или превращаются в кошмар типа "одна проперть и 20 строк атрибутов для разных аспектов использования" и работать с этим невозможно, или объект приходится дублировать N раз, наследуя от базового интерфейса и делая типа "объект для работы в GUI, объект для загрузки из БД, объект для сериализации и таскания объекта по HTTP" и так далее.

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



PS: Вот еще что бесит в "готовых" технологиях. Книжка по каждому частному случаю частного фреймворка - 1000 страниц разливания воды, стандартно. Без теории, что характерно, исключительно "частные решения частных проблем". А потом это все дело забросят (как CORBA, ActiveX, COM, итп), и прочитанный бред окажется бесполезным. Я предпочитаю изучать и работать "от первых принципов", т.е. от теории, потому что 1000 страниц частных случаев бреда сводится к 50 страницам теоретического обоснования, из которого все остальное выводится элементарно.

[identity profile] norguhtar.livejournal.com 2010-05-07 08:51 am (UTC)(link)
Вы таки не пробовали Spring?

[identity profile] metaclass.livejournal.com 2010-05-07 08:53 am (UTC)(link)
А что из Spring тут мне поможет?

[identity profile] norguhtar.livejournal.com 2010-05-07 10:28 am (UTC)(link)
Он упростит связывания всего вместе. Этакая универсальная веревка.

[identity profile] metaclass.livejournal.com 2010-05-07 10:34 am (UTC)(link)
IOC контейнер мне не то, чтобы сильно нужен :)

[identity profile] norguhtar.livejournal.com 2010-05-07 10:48 am (UTC)(link)
Зря :) Ну еще там есть всякие вкусные приблуды для создания веб-сервисов и связывания их с базой. Ну и за счет использования IoC это очень хорошо крутится ;)

[identity profile] ex-vdom.livejournal.com 2010-05-07 08:54 am (UTC)(link)
Дотнетовский? Вот уж где шаг в сторону карается расстрелом. Я его как-то взял из-за двухстороннего биндинга, в итоге почти весь выкинул, включая и этот биндинг.

[identity profile] norguhtar.livejournal.com 2010-05-07 10:29 am (UTC)(link)
А шо дотнетовский сильно хуже жавовоского?

[identity profile] ex-vdom.livejournal.com 2010-05-11 10:08 am (UTC)(link)
Не знаком с жавой, к сожалению или счастью. Но, судя по комментариям на stackoverflow и форуму, пока они не дотягивают до жавовского и не располагают такими ресурсами.

[identity profile] ex-vdom.livejournal.com 2010-05-07 08:52 am (UTC)(link)
Касательно базы, для полноты ощущений можно попробовать свежую бету 9 постргреса с поддержкой репликации.

[identity profile] norguhtar.livejournal.com 2010-05-07 10:29 am (UTC)(link)
Там только master-slave и на его движке что-то другое надо нехотеть.

[identity profile] denisioru.livejournal.com 2010-05-07 08:56 am (UTC)(link)
Для полноценного велосипеда можно использовать метатаблицы - хранить все данные как записи нескольких табличках - атрибуты/сущности. Но гемороя хлебнуть тоже придется достаточно с логикой.

[identity profile] metaclass.livejournal.com 2010-05-07 09:08 am (UTC)(link)
Нет, производительность в общем дохнет, внешние ключи базой не поддержать, итд.
Цель - строгая типизация в том числе и на уровне БД.

[identity profile] norguhtar.livejournal.com 2010-05-07 10:49 am (UTC)(link)
Это очень круто, но работоспособно на определенном круге задач, да и сопровождение этой херни тот еще зоопарк.

[identity profile] mr-aleph.livejournal.com 2010-05-07 08:57 am (UTC)(link)
просверли функциональщика перфоратором

спаси невинные души!
(deleted comment)

[identity profile] metaclass.livejournal.com 2010-05-07 09:10 am (UTC)(link)
По-моему, времени и ресурсов требует как раз второй вариант. Первый требует интенсивной работы мозгом, а второй - тупого набивания кода, массового хреново автоматизируемого тестирования (невозможно доказать валидность вручную написанного кода).
(deleted comment)

[identity profile] metaclass.livejournal.com 2010-05-07 09:54 am (UTC)(link)
Угу, в первом R&D массовый, там со сроками может быть что угодно.
Другое дело, что я этот вариант уже где-то на треть реализовал и в продакшен старый сунул, и у меня практически всегда разработка "как мне удобнее", а не "как предсказуемее по срокам" получается быстрее и качественнее.
(deleted comment)

[identity profile] metaclass.livejournal.com 2010-05-07 10:33 am (UTC)(link)
Да, я примерно так же и делаю, единственное что модель у меня в виде таблиц в специальной БД, я очень с трудом воспринимаю UML с картинками в PowerDesigner. Хотя наверно возможно диаграммы из моих моделей генерировать.

[identity profile] nivanych.livejournal.com 2010-05-07 11:39 am (UTC)(link)
> означает синхронизацию баз

Вроде, Slony под PostgreSQL уже умеют мастер-мастер-репликацию.

[identity profile] nivanych.livejournal.com 2010-05-08 04:31 am (UTC)(link)
Скорее, с PGCluster перепутал.
Ну да, я больше про то, что есть такое, и уже вполне продакшн (?)

[identity profile] ennor.livejournal.com 2010-05-07 03:45 pm (UTC)(link)
Насчет 1К страниц воды в книжках.

Мне кажется, основная часть целевой аудитории, для которой они пишутся, просто неспособна усвоить 50 страниц теоретического обоснования. Это те самые индусы, которые задают тупейшие вопросы на девелоперских форумах микрософта и которые не способны воспринять полученный ответ, если только он не соответствует в точности их потребностям (имена объектов, переменных и т.д.).

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