Статья про АОП
От: Miem Россия  
Дата: 14.01.04 09:50
Оценка: 160 (18)
Не знаю, была ли уже на нее ссылка, я не нашел.
Анализ вариантов применения аспектно-ориентированного подхода при разработке программных систем.

много... но фундаментально и позновательно ... про сквозную функциональность систем (логирование, аутентификиция и авторизация и т.д.). Описано что такое сквозная функциональность и как ее выделять в отдельные модули используя аспектную декомпозицию и языки, позволяющие это делать. Доказывается, что применение данного подхода имеет смысл (скромно сказано)

Статья произвела на меня хорошее впечатление. Одна из немногих основательных статей по этой теме.
... << RSDN@Home 1.1.2 beta 1 >>
ICQ: 446240
Re[9]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 01:35
Оценка: 108 (10) +2 :)
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>Небольшие изменения тут, небольшие там и вот перед нами каша из логики и вспомогательного кода.

ГВ>Ну, Игорь, это уже отдаёт пионерством: "эта дорога неверна, мы срочно побежим другой". А чтобы не было каши надо чаще думать, чем работать. Помогает, проверено.

Думать и работать — это аргументы в пользу бедных, будешь эту лапшу своему начальству вешать. Расскажешь ему, что вот там на RSDN есть такой дурачёк IT, нифига в этой жизни не понимает, а вот я, Геннадий Васильев, фишку очень даже секу
В техническом же форуме всё это называется одним ёмким словом — демагогия.

ГВ>А если без ёрничанья, то перспектива получения каши если не из БЛ+вспомогатльный код, то уж внутри вспомогательного кода или внутри самой БЛ — по любому остаётся.


Okey, хоть ты и не любишь песнь про большие проекты, но всё же, позволь, я тебе её спою, т.к. из всей нашей предыдущей дискуссии, я делаю вполне очевидный вывод, что ты слабо представляешь себе что это такое.

Для начала давай разберёмся, что такое большой проект. Если ты думаешь, что это объём написанного кода, то это правда только отчасти. Это всё равно что определять сексуальную ориентацию человека по вторичным половым признакам. Так вот, размер проекта вовсе не измеряется числом строк, он измеряется числом амбиций, прямопропорционально зависящим от количества девелоперов помноженное на их амбициозность. Если учесть, что на серьёзные проекты приглашают серьёзное количество серьёзных ребят, то можешь себе представить что это такое. Например, представь что бы получилось, если бы кому-нибудь взбрело в голову поднять такой проект силами Top100 RSDN.ru

У каждого из нас свои предпочтения, свой опыт и свои накатанные решения. Они все правильные, но разные. Сегодня может оказаться весомее мнение того, кто красноречивее, завтра того, у кого больше орденов, послезавтра окажется, что лучше было бы делать немного по-другому. А потом у PM'ов созреет новое видение функционирования продукта, маркетинг обнаружит новую нишу на рынке и тут найдётся кто-то, кто предложит ещё более подходящее в данной ситуации архитектурное решение. А проект тем временем идёт, люди пишут код, QA не сидит без дела. И тут ты в не самый подходящий момент заявляешь, что надо бы сделать небольшой рефакторинг во всех классах бизнеслогики. Всего-то делов на 3 часа и все изменения ты сделаешь сам. Правда на эти 3 часа лучше всем пойти покурить, т.к. тебе понадобится весь проект. Допустим средний рейт каждого из 50 девелоперов на этом проекте равен $150/h, то $150 * 3h * 50 = $22500. Столько стоит трёх-часовой простой на таком проекте. Что бы этого избежать используется более мягкий переход, в коде начинают одновременно соседствовать два-три решения, появляются рудименты и атавизмы предыдущих архитектур. Код становится всё более и более запутанным.

Бороться с этим бесполезно. Так же бесполезно как и с тем, что в политику идут не совсем чистоплотные товарищи и очень часто выигрывают. Человеческий фактор, ничего не поделаешь Рассуждать о правильном дизайне мы все мастаки, более того, каждый из нас может похвастаться удачными реализациями удачных решений в небольших проектах. Но большой проект — это часто наука психология + теория компромиссов. Единственный способ поднять такой проект — это не бороться со всем этим бардаком, а суметь его (бардак) организовать (не в смысле устроить, а в смысле взять под контроль). Это умение построить не наиболее удачный дизайн с точки зрения какой-либо привычной характеристики типа быстродействие, масштабируемость, переносимость, а сделать его индифферентным к будущим изменениям, которые неизбежно будут возникать, причём периодичеки.

AOP — это один из путей в светлое будущее. Прежде всего потому, что позволяет разнести, в общем-то, слабо связанные друг с другом сущности, полностью отжать бизнес логику от сквозного кода. С одной стороны, чем короче код бизнес объектов, тем дешевле заказчику обойдётся проект. Продположим, каждый бизнес метод имеет в среднем по 10 строчек, ты сумел убрать одну, экономия 10%. На 10 лимонах это уже 1 миллион. С другой, разрабатывать, реюзать, отлаживать, модифицировать и сопровождать такой код легче, а значит быстрее и дешевле. Где может сбойнуть следующий код:

int Sum(int a, int b)
{
    return a + b;
}


Только в логике. А этот?

HRESULT SomeClass::getSomeValue(LONG *retVal, LONG a, LONG b)
{
    COM_CALL_TRACE_TMDEF(TraceMode<Logged>, SomeClass, getSomeValue)

    *retVal = a + b;

    return S_OK;
}


Ошибка может быть в вызове макроса (кстати, почитай что о макросах думает Страуструп), в самой логике, в коде возврата. Т.е. твой код потенциально в три раза менее надёжный. Теперь помнож это на те амбиции, которыми определяется размер проекта и в результате ты вылетишь с него со свистом, как вылетают те многие, которые всего этого не понимают.

Поэтому, отвечая на твой пост:

ГВ>

А если без ёрничанья, то перспектива получения каши если не из БЛ+вспомогатльный код, то уж внутри вспомогательного кода или внутри самой БЛ — по любому остаётся.


Дело не в наличии каши как таковой, дело в её размерах. Каша в БЛ — это каша в БЛ, каша в сквозном коде — это каша в сквозном коде. Если ты их соединяешь вместе, то ты их не складываешь, ты их помножаешь. Согласен, что в маленьком проекте это вполне допустимо, практически без разницы, но в большом... увы.

Хорошая архитектура в данном смысле — это не та архитектура, которая красиво смотрится в коде, это та, которую не видно вообще. А AOP — это как раз один из путей для нас увидеть всё это счастье ещё в этой жизни
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Ответ
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 09:10
Оценка: 17 (2) :))) :))) :))
Здравствуйте, IT, Вы писали:

IT>А если я забуду воткнуть твои строки в вызываемые методы? А если мне захочется добавить ещё немножко аспектов? А вдруг заказчик одумается и решит отключить всё это нафиг? Каждый раз контекстный поиск замена?


IT, что бы убедить людей у которых догмы уже вросли в мозжечке нужно использовать их же терминологию. Ну, примерно так:

Пьеса о создании супер рэплэйсилке

Да! Ты прав! Это тот самый подход который был всем нужен, и которого все ждали. Но есть пара проблем. Поменять несколько тысяч методов даже один раз сложно. Нужно как-то автоматизировать этот процесс. Нам нужен тулз для рефакторинга. Согласись — это будет удобно!

Так что же должен уметь наш тулз? Ну, предположим замена по контксту. Но могут возникнуть проблемы. При замене по контексту может оказаться так, что имена методов совпадут с чем-нибудь, что трогать не надо. Или имена переменных перепутаются. Геморроя конечно меньше, чем при ручной замене. Но все же макросы и регекспы не совершенны. Так чего же им не хватает?

О! Идея! Им не хватает контекстности! Наш реплэйс должен уметь не просто находить текст, а прасить исходник и заменять и позволять отделять имена методы и их параметры не только по именам, но и по контексту языка. Таким образом наш тулз должен быть интеллектуальным реплэйсом учитывающим синтаксис языка.

Можно ли реализовать такую фичу в лоб? Несомненно, но есть одна проблемка. Создание примитивного парсера — это уже сложная задача. Так что делать такой парсер для локальной задачи очень расточительно. Но можно же сделать его универсальным! И тогда его можно будет подключить к макросам VS и использовать там где надо.

Эврика! Мы упростили себе работы на два порядка. Теперь такая контекстная замена делает в 5-10 нажатий мыши. Но... Но после некоторых замен мы теряем информацию. Что же делать? Наши замены оказывается необратимы! При некоторых из них мы обязаны брать информацию извне, а при других уничтожать лишнюю (на этот момент) информацию.

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

Конгениально! Мы не будем вообще ломать исхоники, а будем делать замену по контексту (мы же не забыли, что она теперь очень точная, почти интеллектуальная!) в отдельный каталог... прямо перед компиляцией. Ура!!! Вот она мечта копи-пэст-реплэйсера!!!

Ой, а что же у меня получилось? Макросы?! Вроде очень похоже, но с другой стороны нет. Макросы не контекстны, а наш супер реплэйсер контекст держит как тузик грелку. А! Точно у нас синтаксически управляемые макросы! Во!!!

Здорово. Но осталась одна проблема. При появлении новых задач по замене приходится писать код замены. А может и это автоматизировать? Точно! Как? А мы будем парсить код в синтаксическое дерево, и создавать процедуры, модифицирующие это дерево через универсальный АПИ. Тогда скоро мы наберем библиотеку и сможем применять нужные замены в нужных местах и комбинациях. Но как нам все же пометить куски кода для замены? О! Мы их пометим атрибутами!!!

Ну, все кажется идея супер реплэйса доведена до идеала. Ну, и на фиг нам ваш АОП?

Как это он и есть? Мы же делали систему реплэйсов по контексту? А это оно и есть. Просто реализованное по человечески. Ну, так бы сразу и сказал...

Занавес...

... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.01.04 13:29
Оценка: 107 (9)
Здравствуйте, Miem, Вы писали:

M>много... но фундаментально и позновательно ... про сквозную функциональность систем (логирование, аутентификиция и авторизация и т.д.). Описано что такое сквозная функциональность и как ее выделять в отдельные модули используя аспектную декомпозицию и языки, позволяющие это делать. Доказывается, что применение данного подхода имеет смысл (скромно сказано)


Парадоксально но факт: ничего принципиально нового там нет, всё, что сказано — становилось понятно любому проектировщику ОО-систем ещё эдак лет 10 назад. Правда, справедливости ради, стоит заметить, что всегда было очень трудно доказать очевидные истины окружающим. Зато теперь в спорах появится возможность сослаться на ещё один русскоязычный авторитет и это хорошо. Ситуация — один в один, как и с паттернами.

M>Статья произвела на меня хорошее впечатление. Одна из немногих основательных статей по этой теме.


Она хороша как минимум тем, что в ней сформулированы проблемы и следствия их тривиальных (читай — непродуманных) решений. Эх, вот не появилось в Java шаблонов вовремя — много она всё-таки потеряла. Да и множественного наследования — ой как не хватает.

Павлов указывает недостатки, которые мне кажутся перефразом очень давно сформулированных тезисов:

Плохое прослеживание назначения модуля: Одновременная реализация нескольких требований в одной модульной единице делает неясным соответствие между отдельным требованием и его реализацией, в результате затруднительно понять, что реализует конкретный модуль.

Это можно отнести к любой программе — безотносительно её А- или О- ориентации.

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

Решалось и решается на уровне проектирования, вернее — декомпозиции. Аспекты, как и объекты — не сами по себе родятся, а только как следствие работы мысли проектировщика.

Большая вероятность ошибок: Запутанность кода влечет за собой код с множеством скрытых проблем. (Вот удивили-то! — ГВ.) Более того, реализация нескольких ортогональных требований в одном модуле может привести к тому что ни одно из них не получит достаточного внимания разработчика.

Проблемы совмещения реализаций аспектов тоже ещё не исследованы и не известны, что отмечает и автор статьи. Кроме того — это же ставилось в вину процедурному подходу.

Трудность в сопровождении: Появление дополнительных требований в будущем потребует переработки текущей реализации, и это может затронуть большинство существующих модулей. (Курсив мой — ГВ.) Модификация каждой отдельной подсистемы в отдельности под новые требования может привести к несовместимости

Именно это ставилось в вину "старому" подходу: структурному проектированию. Не, коллеги, проблема не в ярлыке, который вешается на "методологию", проблема в ДНК проектировщиков.

Проделайте маленький фокус.

Возьмите, например, вот эту цитату:

Аспектно-ориентированная декомпозиция на этапе анализа и проектирования позволяет выделить сквозную функциональность на разных уровнях абстракции и локализовать ее в отдельных модулях-аспектах.


И замените в ней слова "Аспект" на "Объект". Что получили? Гы. Теперь делаем второй трюк: меняем "Аспект" на "Процедура". Ох и любят же апологеты технологий игру словами. Как и я, впрочем. Только я этой игры не скрываю.

Собственно, подобный трюк можно проделать со всей статьёй. А раздел "Варианты применения АОП на разных этапах ЖЦ" напичкан демагогией по самые уши. Например, совершенно непонятно, как именно снимались метрики. Забавно, кстати, уже то, что про метрики неожиданно вспомнили — их довольно долго подвергали жестоким насмешкам. И потом... Halstead Effort 10^4 — это очень простые программы. Сия метрика для реальных модулей представляется 6-9-значным числом и кроме того, зависимость между временем разработки и HEff — нелинейная величина. И потом — она нерепрезантивна, если в реализации системы использовано много идиом на шаблонах (растёт словарь, но сложность восприятия растёт гораздо медленнее). Примерно то же самое можно сказать и об остальных метриках.

Берём пример:
class Main {
//...
       public void foo(int i) {
           Logger.entry("foo(int)");
           System.out.println(i++);
           Logger.exit("foo(int)");
       }
}


И переписываем его в template<> — виде (ага, разумеется — C++ ):

template<typename FrameworkPolicy>
class Main {
//...
       public void foo(int i) {
           FrameworkPolicy::method m(Main::foo); // Явное указание модификации
           System.out.println(i++);
}


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

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

И опять — "недостатки", на этот раз — подходов к соблюдению контрактов:

Неспособность программных компонентов к повторному использованию. Соблюдение контрактов может быть верно для компонентов только в контексте конкретной системы. В другой системе вполне могут быть другие соглашения, что ведет к модификации кода компонентов

Чушь, извините. Совершенно то же самое можно получить и при бестолковой реализации аспектов. Проблема со свистом обходится глубоой декомпозицией проекта.

Перемешивание кода проверки условий и соблюдения контрактов с основным кодом компонентов. Это снижает способность компонентов быть повторно использованными и снижает "читабельность" их кода.

Опять таки, ровно так же аргументировалась необходимость повсеместного введения ООП. Выносите коды проверок в отдельные модули и наслаждайтесь. В чём проблема-то?

Рассредотачивание кода проверки контрактов по всей системе. Если возникает потребность изменить какое-либо из условий, то необходимо изменить их во всех модулях, на которые оно распространяется.

См. абзацем выше. И не будет никакого рассредоточения.

Громоздкая реализация проверки условий. Изъятие и вставка кода проверки условий в программные компоненты является весьма сложной задачей. Поддерживать проверку условий для всей системы достаточно тяжело.

Или у меня deja vu, или автор просто играет словами, перефразируя один и тот же тезис третий раз. А вы как думаете? Я, например, думаю, что этот и два предыдущих недостатка суть следствия неглубокой декомпозиции и избыточной защищённости, переастающей в дизъюнктивную когерентность реализаций (за объяснением термина интересующихся отсылаю к трудам Barbara Liskov ).

Невозможность соблюдения контрактов во время сборки проекта. В настоящее время реализации компиляторов объектных языков (Java, C++) не позволяют соблюдать проектные соглашения при сборке проекта.

Хоть я и не сидел на полу, но со стула так и не упал. Я конечно, понимаю, что в Java пока нет (вернее — только-только появилась) возможности использовать шаблоны, но зачем же так круто обобщать-то?



Вобщем, хотя я и благодарен автору за статью, но приведённые в ней аргументы вызывают очень неоднозначные впечатления, как и АОП само по себе (притом — давно). АО-компиляторы, конечно, интересная штука, но с их применимостью всё пока выглядит очень... ммм... расплывчато во многом из-за неявности модификаций кода. Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции. В смысле — просто декомпозиции по критерию функциональности, без ярлыков типа "аспектная" или "объектная".

А может, лучше уж компиляторы LISP доработать, а то что ни день, то новый этап об-LISP-ливания языков? По крайней мере, LISP честно заявляет о том, что программы и данные — суть одно и то же и играйтесь в методологии сколько влезет. Да, кстати, он тоже работает "несколько" медленнее Java/C++. И будет нам всеобщий ништяк. На некоторое время, разумеется. До следующего поветрия.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 13:04
Оценка: 5 (1) +1 :))
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>Ну хотя бы длительность и частоту вызовов.

ГВ>Для каждого метода БЛ? Или для каждого метода, вызываемого клиентским приложением?

Последнее.

IT>>Требование заказчика. Он обчитался пресрелизов от MS и в конце проекта решил добавить мониторинг сервера приложений.

ГВ>Так сервера приложений или бизнес-логики, которая на нём крутится?

Ты будешь пытаться поймать меня на терминалогии или отвечать на вопрос? Если ответить не можешь, то так и скажи "Не разобрался, погорячился, больше не буду". С кем не бывает.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 13:13
Оценка: -1 :)))
Здравствуйте, naje, Вы писали:

IT>>Забавно было читать как ты в пух и прах разносил AOP Вот теперь покажи его полную несостоятельность, заменив его своей декомпозицией. Давай, давай.


N>в нормальном фреймворке, с хорошо выделенным уровнем бизнес правил, всё это добавляется без труда на любом этапе, причём без препроцессоров типа AspectX'ов, а примеры таких фреймворков никто приводить я думаю не будет.


Отмазки из серии know-how мы уже тут проходили много раз. Не катит. Know-how нам твои не нужны, ты хотя бы идею озвуч, если она у тебя, конечно, есть.

N>может тебе стоит почитать ещё что-нибудь кроме пресрелизов от ms?


Слушай, дай ссылочку, желательно на английском. Я своим архитекторам из MS и IBM покажу. А то они убогие, ничего кроме RealProxy и атрибутов придумать не могут. А мы им щас опаньки — декомпозиция! И по шапке, и по шапке...
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Ответ
От: mikа Stock#
Дата: 26.01.04 12:29
Оценка: 47 (3)
Здравствуйте, IT, Вы писали:

IT>
IT>using System;
IT>using System.Runtime.Remoting.Proxies;

IT>[AttributeUsage(AttributeTargets.Class)]
IT>public class MyClassFactoryAttribute : ProxyAttribute
IT>{
IT>    public override MarshalByRefObject CreateInstance(Type type)
IT>    {
IT>             return (MarshalByRefObject)System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(MyRealClass));
IT>
IT>             // тут создаеться прокся. Ай-яй-яй :)) 
IT>            //return base.CreateInstance(typeof(MyRealClass));
IT>    }
IT>}

IT>[MyClassFactory]
IT>public class MyClass : ContextBoundObject
IT>{
IT>}

IT>class MyRealClass : MyClass
IT>{
IT>}

IT>class Test
IT>{
IT>    static void Main()
IT>    {
IT>        MyClass mc = new MyClass();

IT>        Console.WriteLine(mc.GetType().Name);
IT>    }
IT>}
IT>


IT>Работает шо железная железяка. TP/RP не создаются, так что с быстродейсвием проблем нет .


А чтобы создать без ТР нужно использовать посмотри исправлени в коде.

Кстати, код работоспособен. Только ужасно тормознутый
Re[8]: Ответ
От: vdimas Россия  
Дата: 25.01.04 14:16
Оценка: 27 (3)
Разрешите вмешаться, насчет задачки по счетчикам?

В моей практике я никогда не создавал бизнес объекты (БО) напрямую — они всегда создаются некоей фабрикой (или другим БО, выступающим в ее роли) Т.е. запросили сессию, у нее — некий БО, у того следующий и т.д.
Вся логика построена на открытых абстрактных (полностью, либо частично, или даже вовсе не абстрактных, но весьма полиморфных) классах.

Изначально, как я понял, встала задача — развесить хуки на вызовы методов (счетчики, мониторинг и т.д.),
так вот, для полиморфных методов это можно решить весьма даже многими способами

лопата begin {
учитывая, что по-сути нам требуется посадить именно хук, будим хачить:

1. COM — из typelib берем информацию об интерфейсе и в рантайме делаем ему заместитель, совместимый по vf_table, который в каждом методе вызывает наш хуковый счетчик, а потом вызывает (вызывает — громко сказано... делает jump на ) первоначальный метод замещенного метода интерфейса. При возврате ссылки на некий интерфейс — возвращаем прохаканный заместитель, если возвращаемый объект до этого не прохакан (это легко проконтроллировать)

2. С++ — ручками и только ручками в наследнике делаем вышеописанное для каждого метода, а лучше в самих методах. Комбинируя различные возможности С++, можно буквально одной строчкой в начале каждого метода добиться практически чего угодно — самый гибкий вариант, учитывая макроподстановки и шаблоны. (Вариант Г.В.)

3. .Net — очень много способов как сделать... выбираем на вкус... мне больше всего нравится идея в рантайм генерировать по typeinfo скриптинг, который делает нечто типа 1. и 2. но на "человеческом" .net ЯП, напр. С#
Вполне допустимый подход, ибо после компиляции и "переваривания" Jit быстродействие такого объекта в точности равно быстродействию обычного, расходуем время только на автогенерацию и компиляцию скрипта — но это все одноразово, 1 раз на класс (в отличии от CBO, где рефлекшн используется в каждом вызове, что действительно приемлимо разве что в Remouting, где это тонет в общих временных затратах).
} лопата end;

Ну а теперь вернемся в "человеческое" ООП.
Предложенная задача — неожиданная потребность начать мониторинг вообще всех вызовов — явно из разряда особенных (надуманных). Решение подобной задачи надо или проектировать вместе с фреймворком, или потом дорабатывать вообще все и ругать себя за скудоумие. Ибо ООП предполагает затрату некоей мыслительной энергии на начальных этапах проектирования.

Тема крайне интересная, и хотелось бы от IT услышать хоть один достойный пример, где АОП имело бы преимущество перед ООП. Хуки не предлагать , в реальных системах хуки делаются путем хаков (Win32). Интересно услышать задачу, относящуюся к целевым бизнес-объектам, а не к вспомогательным/системным вещам. (системного рода задачки на С++ весьма весело решаются, и никто не придерживается строгого ООП, если речь идет о чем-то весьма системном, типа представлении стека как списка параметров, в одной из своих библиотек на С++ я именно так и делал и даже больше, ибо возможность произвольной реинтерпретации произвольного участка памяти в С++ есть, хоть это и опускает нас на уровень древнего С... кстати, многое из Remouting в .Net именно на таком уровне и сделано, весьма это далеко от АОП и ООП)

И еще, самое главное:
Если не трудно, развития ради, интересно посмотреть на код и оценить трудоемкость подхода IT в решении его собственной задачки. ГВ предложил одну строчку кода на все интересующие методы, трудоемкость в этом случае ясна и понятна. IT, давай решение на АОЯП — справедливости ради, а то пока не ясно как все это сравнивать
Re[7]: Спорно.
От: beretta Россия icq: 138726397
Дата: 23.01.04 08:28
Оценка: 14 (1) +2
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Очень забавно — я тебе о том, что прежде чем куда-то ехать, нужно разобраться с картами, а ты предлагаешь лететь по пачке беломора и преодолевать препятствия. Ну что ж, давай поупражняемся.


Стоит? Имхо это мат в 2 хода.

У меня несколько иное представление к реализации нежели АОП, но раз разговор о признании самой проблематики. То я бы ответил словами классика о том, что нельзя объять необъятное. Проектирование вещь мощная и полезная, но имеет свой предел, обусловленный знанием (по специальности, предметной области) на текущий момент. И далеко не факт, что предлагаемое решение задачи будет актуальным на момент его применения, не зря говорят "Человек паланирует, бог смеется"
Re[4]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.01.04 17:53
Оценка: 6 (1) +1 :)
Здравствуйте, IT, Вы писали:

ГВ>>>>Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции.


IT>>>Ну и как ты собираешься подключить хотя бы тот же логгинг к уже почти готовому проекту с помощью декомпозиции?


ГВ>>Вопрос не в том, как подключить, а что потом со всем этим делать.


IT>Ну так и как ты собираешься это делать? У тебя есть двести классов бизнес-логики, как ты с помощью декомпозиции добавишь к ним логгинг?


У меня просто никогда не появлялось двухсот бизнес-классов без фреймворка для них. Да и вообще пример надуманный.

Лог нужен для двух задач: аудита системы пользователем или отладки (трассировка). Трассировочный лог — это одно, и я с трудом представляю ситуацию, когда в конце проекта нужно развешивать лог-вызовы по двумстам классам сразу. (Только не надо песен из репертуара группы "Ты никогда не писал больших программ") Это — ошибка в ДНК проектировщиков, а методологиями она не лечится, а только усугубляется. Если нужен аудит-лог, то опять-таки, решение "вешать лог-вызовы на все бизнес-классы" выглядит решением из серии: "Вы хотели? — Вот вам!", что тоже немного не мой конёк.

Так что, извини, но я не буду решать именно такой задачи: у меня её просто не может быть. И ещё с удовольствием настучу по рукам тому, кто попытается нечто подобное учудить.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.01.04 22:56
Оценка: 2 (1) +1 :)
Здравствуйте, IT, Вы писали:

IT>>>Ну хотя бы длительность и частоту вызовов.

ГВ>>Для каждого метода БЛ? Или для каждого метода, вызываемого клиентским приложением?
IT>Последнее.

Хорошо. Значит, нужно повесить счётчики на каждый открытый для внешнего клиента вызов. Особой проблемы нет. Почему? Потому что, если например, мы говорим о COM-вызовах, то у меня они редко непосредственно вплетены в структуру приложения, а находятся во внешнем, интерфейсном слое. Соответственно, реализация этого слоя всегда обвешивается трассировками/логами и прочей лабудой. Т.е., вот такая конструкция:

HRESULT SomeClass::getSomeValue(LONG *retVal)
{
  COM_CALL_TRACE(SomeClass, getSomeValue)
    //...
}


в порядке вещей. Итак, для решения твоей задачи мне потребуется только доработать COM_CALL_TRACE и перекомпилить проект. Скорее всего, я бы сделал контекстную замену на... ну, скажем, такую конструкцию:
HRESULT SomeClass::getSomeValue(LONG *retVal)
{
  COM_CALL_TRACE_TMDEF(TraceMode<Logged>, SomeClass, getSomeValue)
    //...
}


И здесь, кстати, мне на помощь и пришла бы декомпозиция — для выделения параметра TraceMode и уже его параметра (или атрибута?) — Logged.

Т.е., подход состоит в:

декомпозиции исходной задачи на сущности (вызов функции, трассировочный вызов, параметры трассировочного вызова);

— комбинирования выделенных сущностей либо в теле трассируемых функций либо в отдельных функторах вроде TraceCall(...).

Возможно, что в каком-то случае и на какое-то определённое время использование AspectC++ тоже будет полезным, но при прочих равных я бы предпочёл явные модификации исходного кода. Почему? Очень просто. Представим возможное развитие твоей ситуации. Появляется ещё 10 методов, которые логгировать не нужно. Что нужно сделать? По идее — модифицировать описание композиционного фильтра, но важно не забыть об этом. А в пиковом случае композиционный фильтр будет содержать перечисление всех методов, на которые навешиваются дополнительные аспекты, т.е., задача будет по сложности практически равна простой вставке строк в функции... Вопрос в том, что это за строки.

Поэтому, точно так же я бы поступил, даже если бы вызовов COM_CALL_TRACE(...) изначально не было расставлено: в конце концов, даже 500 очень простых модификаций пусть и бестолковая по характеру, но в данном случае — одноразовая работа. Её несложно автоматизировать макросами VS а результаты очень пригодятся в будущем.

Так что, на мой взгляд, подход "с декомпозицией" будет не хуже аспектного, поскольку необходимые изменения функций сосредоточатся в самих функциях, а не расползутся неизвестно где (почему, кстати, у меня АОП и вызывает пока неоднозначное впечатление).

Предположим теперь, что компонентная технология не используется, т.е., у меня есть свой навороченный framework, который перенаправляет внешние вызовы объектам-реализациям. Ключевое слово: "framework". Он и займётся счётчиками.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[16]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 28.01.04 08:41
Оценка: 25 (2)
Прошу прощения, у каждого тут свой спор, так что к барьеру мистер Ткачев
Итак, здравствуйте, IT, Вы писали:

IT>Какая демагогия? Я тебе привёл вполне реальный пример, может его чуть-чуть приукрасил. Замени пионера на бестолковую операционистку и всё будет как в жизни.

IT>Я тебе не за строки говорю, а за количество траха, которое мы все имеем при смешивании бизнеслогики и сквозного кода.

Вот давай я буду этой бестолковой операционисткой а ты будешь этим пионером, или наоборот, если хочешь .Net реализация АОП тебе не нравится, да? Ну а AspectJ нравится? Раз уж заговорили о количестве траха, то для сравнения я возьму тот же пример из статьи, все тот же Point, Line, DisplayUpdateAspect и попытаюсь выразить это на плюсах, а потом сравним со статьей.


struct Point
{
private:
    int x, y;
public:

    Point()
    {
        x=0;
        y=0;
    }    
    virtual    int getX() 
        { 
            return x; 
        }
    virtual    int getY() 
        { 
            return y; 
        }
    virtual    void setX(int x) 
        {
            this->x = x; 
        }
    virtual    void setY(int y) 
        {
            this->y = y; 
        }

};

struct Line
{
private:
    Point* p1, *p2;
public:
    virtual    Point* getP1() 
        { 
            return p1; 
        }
    virtual    Point* getP2() { return p2; }
    virtual    void setP1(Point* p1) 
        {
                     this->p1 = p1;
               }
    virtual    void setP2(Point* p2) 
        {
                     this->p2 = p2;
               }    
};

template<typename Base>
struct    DisplayUpdateAspectBase : public    Base
{
protected:
    Display* display;
public:
    /*SetDisplay/GetDisplay*/
};

template<typename Base>
struct PointDisplayUpdateAspect : public    DisplayUpdateAspectBase<Base>
{
public:
    virtual    void setX(int x) 
        {
            Base::setX(x);
            display->Update();
        }
    virtual    void setY(int y) 
        {
            Base::setY(y);
            display->Update();
        }
};

template<typename Base>
struct LineDisplayUpdateAspect : public    DisplayUpdateAspectBase<Base>
{
public:
    virtual    void setP1(Point* p1) 
        {
                     Base::setP1(p1);
            display->Update();
               }
    virtual    void setP2(Point* p2) 
        {
                     Base::setP2(p2);
            display->Update();
               }        
};

typedef    PointDisplayUpdateAspect<Point>    DisplayPoint;
typedef    LineDisplayUpdateAspect<Line>    DisplayLine;


Итак, мы я с легостью могу получить UI точки и линии, а так же их не визуальные представления, например мне нужны точки для представления логических кординат в коде вычислений, никакой связи с дисплеем нет. Юзверь в коде по прежнему работает с типом Point*, только пользуется фабрикой для создания визуальных точек и линий, или не визуальных. Решил я завтра обезопасить код DisplayPoint в мультитред логике, пишем следующее:


template<typename Base>
struct    LockAspectBase : public Base
{
protected:
    SyncObj    syncObj;
public:
    /*GetSyncObj*/
};

template<typename Base>
struct    PointLockAspect : LockAspectBase<Base>
{
public:
    virtual    void setX(int x) 
        {
            Mutex mtx( &syncObj);
            Base::setX(x);
        }
    virtual    void setY(int y) 
        {
            Mutex mtx( &syncObj);
            Base::setY(y);
        }    
};

Переписываем определение типа DisplayPoint:

typedef    PointDisplayUpdateAspect<Point>        DisplayPointBase;
typedef    PointLockAspect<DisplayPointBase>        DisplayPoint;


И все изменения, но, с ростом количества аспектов ростет количество вариантов типов, которые я могу создавать, это будет защищенная точка, защищенная точка с отображением, без отображения ( только логический обьект ) защищенный и незащищенный, и всего этого я добиваюсь в нескольких строчках кода. Реюзабилити моих "аспектов" гораздо выше чем в примере из статьи, например мы решили делать 3DPoint:


struct 3DPoint: public Point
{
protected:
    int z;
    3DPoint()
    {
        z = 0;
    }
    virtual    int getZ()
    {
        return Z;
    }
    virtual    void    setZ( int z )
    {
        this->z = z;
    }
};

template<typename Base>
struct 3DPointDisplayUpdateAspect : public    PointDisplayUpdateAspect<Base>
{
    virtual    void    setZ( int z )
    {
        Base::setZ(z);
        GetDisplay()->Update();
    }
};

template<typename Base>
struct 3DPointLockAspec : public PointLockAspec<Base>
{
    virtual    void    setZ( int z )
    {
        Mutex mtx( GetSyncObj());        
        Base::setZ(z);
    }
};


Количество вариантов как ты сам понимаешь ростет, а количество телодвижений за счет повторного использования моих же "аспектов" гораздо выше. Цель применения аспектов лежит в том что бы делать менее связанный, декларативный код, в примере из статьи я этого не вижу. Вот как я могу применить aspect DisplayUpdating в другом месте для другой компоненты в AspectJ, например для 3DPoint??? Они же все hardcoded, там четко прописано к какому методу какого типа все это привязывается, кроме всего нужно уметь понять что тут относится к сетап коду этих аспектов, а что к сквозной функциональности. А что касательно наследования таких аспектов???
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[15]: Спорно.
От: mikа Stock#
Дата: 23.01.04 16:03
Оценка: 14 (1) -1
Здравствуйте, IT, Вы писали:

IT>В .NET — это механизм перехвата создания и вызова методов объектов, который можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.


Отлично! У тебя АОП в .NET ассоциируеться только с remoting. Неужели, нет других мест, где он так же реализован, в той или иной мере (даю подсказку, есть )

IT>При том что задача, которую я поставил перед ГВ вполне решается данным способом.


Как и любым другим

M>>Сделать RealProxy через ООП не составит труда. Та же функциональность.


IT>Ещё один знаток Мика, ну расскажи нам, как сделать RealProxy средствами ООП. Мне правда интересно как на ООП реализуется интерсептор создания объектов, как стэк преобразуется в список параметров и наоборот. И никаких ассемблерных вставок и выкрутасов в стиле C, только чистый ООП.


Я прям стою и падаю. Такое чувство, что отнаследнование от ContextBountObject это не ООП.
Ты же в самом начале это делаешь. И именно, сделав аналог для ООП, можно добиться тех же результатов, что и для АОП.

IT>Да уж, понты так понты. Я хоть за свой базар отвечаю, в отличии от некоторых


"А пачему сразу Лукашенко!?" (что то юмористическое)
Re[4]: Спорно.
От: Аноним  
Дата: 22.01.04 16:45
Оценка: 1 (1) :)
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>>>Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции.


IT>>>Ну и как ты собираешься подключить хотя бы тот же логгинг к уже почти готовому проекту с помощью декомпозиции?


ГВ>>Вопрос не в том, как подключить, а что потом со всем этим делать.


IT>Ну так и как ты собираешься это делать? У тебя есть двести классов бизнес-логики, как ты с помощью декомпозиции добавишь к ним логгинг?


т.б. ты хочешь сказать что АОП это не метод проектирования, а метод добавления?
Re[9]: Спорно.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.01.04 14:21
Оценка: 1 (1) +1
Просьба ограничить объем цитирования.
... << RSDN@Home 1.1.3 beta 1 >>
AVK Blog
Re[15]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.01.04 07:04
Оценка: 1 (1) +1
Здравствуйте, Batiskaf, Вы писали:

B>Никого я не собираюсь поучать, все кругом взрослые дядьки, просто мне казалось что форумы существуют для обмена опытом, а глядя на этот топик такое впечатление что времена доисторических религиозных разборок продолжаются в других руслах, нафига спрашивается...


Следует помнить о том что читают этот топик значительно больше народу, чем пишут. Вот для них собственно.
... << RSDN@Home 1.1.3 beta 2 >>
AVK Blog
Re[12]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 15:27
Оценка: -1 :)
Здравствуйте, mikа, Вы писали:

M>А зря. Всего лишь громкие слова, за что он так на Геннадия "наезжал"


Поясни свою мысль насчёт громких слов, а то пока это выглядит как обвинение во вранье
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 15:47
Оценка: +1 -1
Здравствуйте, mikа, Вы писали:

N>>хотя причём тут RealProxy до сих пор понять не могу


M>В Нете это одна из реализаций аспектной сущности.


В .NET — это механизм перехвата создания и вызова методов объектов, который можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.

M>Хотя, честно говоря, я и сам не понял причем здесь это.


При том что задача, которую я поставил перед ГВ вполне решается данным способом.

M>Сделать RealProxy через ООП не составит труда. Та же функциональность.


Ещё один знаток Мика, ну расскажи нам, как сделать RealProxy средствами ООП. Мне правда интересно как на ООП реализуется интерсептор создания объектов, как стэк преобразуется в список параметров и наоборот. И никаких ассемблерных вставок и выкрутасов в стиле C, только чистый ООП.

M>Ладно, щас нам Игорь поведует, что же он имел ввиду, кроме понтов


Да уж, понты так понты. Я хоть за свой базар отвечаю, в отличии от некоторых
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 16:17
Оценка: +1 -1
Здравствуйте, mikа, Вы писали:

IT>>В .NET — это механизм перехвата создания и вызова методов объектов, который можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.


M>Отлично! У тебя АОП в .NET ассоциируеться только с remoting. Неужели, нет других мест, где он так же реализован, в той или иной мере (даю подсказку, есть )


Почитай, что я выше написал, особенно выделенное.

IT>>При том что задача, которую я поставил перед ГВ вполне решается данным способом.


M>Как и любым другим


Ну хоть один другой отличный от данного покажи

IT>>Ещё один знаток Мика, ну расскажи нам, как сделать RealProxy средствами ООП. Мне правда интересно как на ООП реализуется интерсептор создания объектов, как стэк преобразуется в список параметров и наоборот. И никаких ассемблерных вставок и выкрутасов в стиле C, только чистый ООП.


M>Я прям стою и падаю. Такое чувство, что отнаследнование от ContextBountObject это не ООП.

M>Ты же в самом начале это делаешь. И именно, сделав аналог для ООП, можно добиться тех же результатов, что и для АОП.

Ты только не путай тёплое с мягким. Наследование от CBO, для которого уже реализован RealProxy и реализация RealProxy средствами ООП это далеко не одно и тоже.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.01.04 15:26
Оценка: :))
Здравствуйте, vdimas, Вы писали:

V>(в отличии от CBO, где рефлекшн используется в каждом вызове,


В MBR (и CBO который ничем от MBR, кроме механики инициации не отличается) рефлекшен не используется. TransparentProxy это и есть то о чем ты говоришь, только реализованое прямо в JIT, т.е. не требующее компиляции вобще, а значит заведомо более быстрое чем то что ты предлагаешь. Тормоза ремоутинга не из-за тормозных проксей, а из за цепочки синков — и формирователи сообщений, и форматтеры и транспортные синки это очень небыстрая операция, поскольку, как правильно заметил IT, механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга. Потому и получается что при вызове через контекст происходит море лишних действий, в том числе и с использованием рефлекшена (для работы форматтера и запуска сообщения).

V>Ну а теперь вернемся в "человеческое" ООП.

V>Предложенная задача — неожиданная потребность начать мониторинг вообще всех вызовов — явно из разряда особенных (надуманных).

Эта задача очень часто встречается на практике. Вот буквально неделю назад такая задачка стояла.

V> Решение подобной задачи надо или проектировать вместе с фреймворком,


А если фреймворк уже есть? Только не надо мне рассказывать сказки о том что на этапе проектирования можно предусмотреть все.

V> или потом дорабатывать вообще все и ругать себя за скудоумие.


Или использовать АОП. Такой вариант имхо куда интереснее.

V>Тема крайне интересная, и хотелось бы от IT услышать хоть один достойный пример, где АОП имело бы преимущество перед ООП.


Как тут уже неоднократно замечалось не стоит противопоставлять ООП и АОП. Несмотря на красивые термины АОП ООП это идеология, а АОП всего лишь технология, чаще всего реализуемая при помощи ООП и в его рамках. Не надо сравнивать теплое с мягким.

V>кстати, многое из Remouting в .Net именно на таком уровне и сделано, весьма это далеко от АОП и ООП)


Можно узнать что конкретно в ремоутинге на уровне древнего С?

V>Если не трудно, развития ради, интересно посмотреть на код и оценить трудоемкость подхода IT в решении его собственной задачки. ГВ предложил одну строчку кода на все интересующие методы, трудоемкость в этом случае ясна и понятна. IT, давай решение на АОЯП — справедливости ради, а то пока не ясно как все это сравнивать


А решение на АОП вобще не требует в бизнес-объекте никакого кода. Более того, если АОП фреймворк нормально реализован не требуется даже перекомпиляции для его подключения. Вот например в текущем проекте есть у нас синк, который протоколирует все необработанные исключения сервера. Этот синк не требует никакой поддержки ни со стороны бизнес-кода, ни со стороны прикладного фреймворка, ни со стороны сервера приложений. Одна строчка в конфиге и он работает с любым ремоутинг-сервером. Пока вилла Рибо проектирует фреймворки с поддержкой всех возможных фантазий заказчика и усиленно в очередной раз копипейстит исходники, вилла Баджо давно уже получает с заказчика бабки
... << RSDN@Home 1.1.3 beta 1 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[18]: Ответ
От: mikа Stock#
Дата: 26.01.04 13:25
Оценка: 42 (1)
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mikа, Вы писали:


M>>А зачем там реализовывать? Там уже все есть, только без препроцессинга.


AVK>В С++?


Ага

M>>Взять бы хотя бы COM+.


AVK>Это не С++, это конкретная ОО-технология. Думаю не надо объяснять что он везде применим.


Ну дык и применяйте. А вы все да TP да RP.

M>>Если чисты СОМ, то смотреть ICallFrame, ICallInterceptor, IPolicyMaker, CoGetInterceptor.


AVK>Это все равно не С++.


Я могу через С++ с этим работать? Могу. Больше мне ничего не надо.

AVK>Отработают, не сомневайся. Думаешь для чего нужен CrossContextChannel?


Думаю, вот для этого
CrossContextChannel.SyncProcessMessage(message)
{
  Identity serverIdentity = InternalSink.GetServerIdentity(message);
  Context context = serverIdentity.ServerContext;

  ContextTransitionFrame frame = new ContextTransitionFrame();

  Thread.CurrentThread.EnterContext(сontext, ref frame);
  сontext.GetServerContextChain().SyncProcessMessage(message);
  Thread.CurrentThread.ReturnToContext(ref frame);
}


Тоесть, ничего кроме как для переключения контекстов он не нужен.
Re[7]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 04:38
Оценка: 18 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>OK, хорошо. Что нужно мониторить?


Ну хотя бы длительность и частоту вызовов.

ГВ>И интересно было бы узнать, откуда взялась такая задача?


Требование заказчика. Он обчитался пресрелизов от MS и в конце проекта решил добавить мониторинг сервера приложений.

ГВ>Очень забавно — я тебе о том, что прежде чем куда-то ехать, нужно разобраться с картами, а ты предлагаешь лететь по пачке беломора и преодолевать препятствия. Ну что ж, давай поупражняемся.


Забавно было читать как ты в пух и прах разносил AOP Вот теперь покажи его полную несостоятельность, заменив его своей декомпозицией. Давай, давай.
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.01.04 03:13
Оценка: 14 (1)
Здравствуйте, Merle, Вы писали:

M>И не совсем ясно с чем спорил ГВ, в своем изначальном постинге. Я так и не понял, он против АОП "в принцие" или нет?

Нет, я не против АОП "в принципе", хотя кое где в нём сомневаюсь (но тем не менее и кое-что использую). Например, я не считаю АОП чем-то принципиально новым по сравнению с ООП. Используются некоторые недостатки реализаций ООП-идей и подаётся как новый подход к проектированию и программированию. По большому счёту я считаю АОП просто развитием ОО-парадигмы в смысле уточнения подходов к сопряжению систем. Но это — пока. Мнение, как известно, может и измениться. Постинг же я забросил, поскольку не понравились вполне конкретные аргументы вполне конкретной статьи. Самоцитированием заниматься не буду, обо всём прямо сказано в посте.

А с IT сцепились (да и не сцепились-то, а просто беседуем) из-за конкретного примера, а не АОП вообще.

M>Впрочем один я кажется помню, неконтролируемое вмешательство в логику поведения объекта извне, я прав?

Да, ты совершенно прав. А чтобы вспомнить все — перечитай исходный пост.

Ещё мне кажется не слишком хорошей идея построения обобщений на основе имён методов, да и вообще — использование только методов как некоторых "осей", на которые нанизываются аспекты. Впрочем, это ко всему АОП не относится, это уже реализации конкретных инструментов.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 03:08
Оценка: 11 (1)
Здравствуйте, vdimas, Вы писали:

V>В моей практике я никогда не создавал бизнес объекты (БО) напрямую — они всегда создаются некоей фабрикой (или другим БО, выступающим в ее роли) Т.е. запросили сессию, у нее — некий БО, у того следующий и т.д.

V>Вся логика построена на открытых абстрактных (полностью, либо частично, или даже вовсе не абстрактных, но весьма полиморфных) классах.

Вполне жизненное решение используемое в том же COM и в его апофигозе имплементации — ATL

Недостатки абстрактных фабрик классов тоже хорошо известны:

1. Плохая расширяемость. На каждый новый тип объекта нужно писать новую фабрику.
2. Исользование синглетона для доступа к фабрикам, что значительно сужает область реиспользования создаваемых классов.
3. Отсутствие гарантии в том, что объект будет создан именно через фабрику. Даже твои абстрактные классы можно отнаследовать и спокойно создать напрямую.

В остальном отработанный и широко используемый подход.

V>3. .Net — очень много способов как сделать...


Кстати. О фабриках и синглетонах в .NET. AOP в действии

using System;
using System.Runtime.Remoting.Proxies;

[AttributeUsage(AttributeTargets.Class)]
public class MyClassFactoryAttribute : ProxyAttribute
{
    public override MarshalByRefObject CreateInstance(Type type)
    {
        return base.CreateInstance(typeof(MyRealClass));
    }
}

[MyClassFactory]
public class MyClass : ContextBoundObject
{
}

class MyRealClass : MyClass
{
}

class Test
{
    static void Main()
    {
        MyClass mc = new MyClass();

        Console.WriteLine(mc.GetType().Name);
    }
}


Работает шо железная железяка. TP/RP не создаются, так что с быстродейсвием проблем нет . Все 3 приведённые мной выше пункта при определённой сноровке легко устраняются. Правда появляются другие проблемы

Синглетон делается аналогично.

V>Ну а теперь вернемся в "человеческое" ООП.

V>Предложенная задача — неожиданная потребность начать мониторинг вообще всех вызовов — явно из разряда особенных (надуманных). Решение подобной задачи надо или проектировать вместе с фреймворком, или потом дорабатывать вообще все и ругать себя за скудоумие. Ибо ООП предполагает затрату некоей мыслительной энергии на начальных этапах проектирования.

Тему скудоумия и демагогии мы с ГВ уже обсудили
Автор: IT
Дата: 26.01.04
, лучше давай не будет продолжать

V>Тема крайне интересная, и хотелось бы от IT услышать хоть один достойный пример, где АОП имело бы преимущество перед ООП. Хуки не предлагать , в реальных системах хуки делаются путем хаков (Win32). Интересно услышать задачу, относящуюся к целевым бизнес-объектам, а не к вспомогательным/системным вещам. (системного рода задачки на С++ весьма весело решаются, и никто не придерживается строгого ООП, если речь идет о чем-то весьма системном, типа представлении стека как списка параметров, в одной из своих библиотек на С++ я именно так и делал и даже больше, ибо возможность произвольной реинтерпретации произвольного участка памяти в С++ есть, хоть это и опускает нас на уровень древнего С... кстати, многое из Remouting в .Net именно на таком уровне и сделано, весьма это далеко от АОП и ООП)


Можешь сходить по той же ссылке. Разницу между большими и маленькими проектами я объяснил Проблемы в них примерно так же как и проблемы с детьми. Маленькие дети — маленькие проблемы, большие дети — большие проблемы. Причём проблемы в разном возрасте могут быть одни и теже, но их масштабы резко отличаются.

V>И еще, самое главное:

V>Если не трудно, развития ради, интересно посмотреть на код и оценить трудоемкость подхода IT в решении его собственной задачки. ГВ предложил одну строчку кода на все интересующие методы, трудоемкость в этом случае ясна и понятна. IT, давай решение на АОЯП — справедливости ради, а то пока не ясно как все это сравнивать

В моём текущем проекте эти задачи решаются MS'овским тимом с помощью интерсепторов: RealProxy, синки, контексты и прочая фигня. Я этим совершенно не озабочен и не пишу ни одной строчки в своём коде кроме атрибутов, управлющих транзакциями (типа как в COM+). Производительность вполне приемлемая, т.к. всё это висит на ремоутинге. Но сказать что я от этого решения пребываю в поросячем восторге не могу. Для этого конкретного проекта вполне оптимальное решение, но оно ограничено применением ремоутинга. Как вполне резонно заметил naje, если будут требования быстродействия, то либо придётся всё это хозяйство отключать, либо искать другое решения. Может твоё сойдёт, может ГВ.
Для написания бизнес сущностей (не серверных объектов) и маппинга используется Rsdn.Framework.Data с поддержкой абстрактных классов. Сокращение объёма тупого кода примерно на две трети. Но тоже не всё так гладко как хотелось бы.
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: Ответ
От: vdimas Россия  
Дата: 27.01.04 16:25
Оценка: 7 (1)
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, vdimas, Вы писали:


V>>1. Неохота на клиента тянуть библиотеки имплементирующие БО на стороне сервера (из-за их потенциального размера и, вероятно, частой обновляемости да и еще 100 причин), т.е. хошь не хошь а выбираем абстрактные базовые классы или интерфейсы для наших целевых БО.


IT>Вообще-то, как-то это всё мудрёно. БО конечно же не надо тянуть на клиента, на клиента обычно тянется фасадная dll, содержащая интерфейсы к БО и бизнес сущности. Таже валидация, например, может быть (и должна) быть встроена в безнес сущности.


Так и есть, все очень фасадное, фасаднее чем ISomeThing не бывает.
Насчет валидации... Согласно собственной практике валидации можно классифицировать. Некоторые типы валидаций, напр. допустимые значения полей, заданные некоей формулой, легко записываются в виде аттрибутов полей и обрабатываются на клиенте. И нет смысла встраивать подобного рода валидацию в бизнес-сущности, т.к. валидация, не требующая наличия других каких-то других БО или даже доступа в БД легко описывается аттрибутами.

Более сложная валидация может происходить в имплементации самого БО, см. внимательней след. пункт. В тех же аттрибутах задается дополнительный тип поля (определяющий момент запуска валидирующего механизма) — "immediate update". А большинство полей передаются одним махом тем же автогенеренным прокси, который поддерживает наш некий интерфейс типа IDataSync, задействованный как раз при нажатии на клиентской форме кнопки "Save". (После нажатия на Save работающий с программой может вполне оправданно подождать пару секунд, но при набитии нескольких десятков полей все должно работать крайне шустро, и в то же самое время предоставлять возможность в ответ на изменение некоего поля прислать, скажем, обновленный список выбора на соседний ComboBox)

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

V>>2. Неохота удаленные экземляры этих БО биндить непосредственно к контролам форм, ибо не все изменения на форме клиента необходимо моментально перегонять на сервер, да и живость такого варианта "под пальчиками" оставляет желать лучшего при dial-up соединении. Из опытов предыдущих разработок выяснилось, что непосредственно гнать на сервер изменение поля БО надо дай бог в 10% случаев (для валидации сложной, либо для изменения значения других полей по сложному алгоритму), Поэтому решено автоматически генерить на клиенте заместитель, построение которого управляется типами и атрибуттами полей открытого абстрактного объявления БО.


Т.е. что охота получить в итоге? Охота получить систему, которая может работать в режиме n-tier приложения или даже в режиме однопользовательского десктоп-варианта. Это тоже дано сверху. В последнем случае клиентские модули работают с БО напрямую (в режиме обычных подгружаемых DLL) и никаких проблем.

При экспериментах, непосредственный биндинг удаленных экземпляров к полям форм ведет себя неважно даже в случае бинарной сериализации. Поэтому, было решено для различных конфигураций создавать различный Session объект, являющийся корнем иерархии фабрик БО. Второй вариант Session-объекта — это просто обычный Session объект "обернутый" нашим автогенерируемым прокси, который распространяет свое действие по автоматическому созданию проксей на всю цепочку создаваемых БО.

Хоть это все вероятно и выглядит мудренно, зато в итоге порождает совсем немного целевого бизнес-кода, именно фреймворк берет на себя многие тонкости по организации передачи данных м/у слоями и кешированием данных. (Да, много чего есть в .net, но вот идеологию immediate or lazzy update пришлось конопатить ручками, хотя, вроде, очевидная весчь...)

Опять же (про бизнес-сущности), оперирование бизнес-сущностями требует ОСМЫСЛЕННОСТИ кода клиента. Хех, кому это надо? На клиента просто приходят ресурсы форм и описание биндинга полей. Что делается на клиенте, так это то, что и должно там делаться: drag&drop, например, и пр. клиентские фишки. (Утрирую, бывает, очень редко, но бывает, что осмысленный код приходится накидывать и на клиенте)

Для нормальной работы всей этой кухни, разумеется, пришлось отнаследоваться от всех потенциально требуемых data-aware контролов, для работы в подобной системе, зато формы можно плодить как грибы (накидал ресурсы и ЗАБЫЛ), а разработчик серверной части (т.е. БО-части) вообще практически не задумывается от том, как и кто создает или работает с его объектами...

В общем, есть что пообсуждать.
Бардак ещё не аргумент
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 31.01.04 23:54
Оценка: 4 (1)
Здравствуйте, IT, Вы писали:

Вобщем, IT, мой пост поделен на две части: комментарии к твоему письму и некоторые выводы.

Сначала: комментарии.



IT>>>Небольшие изменения тут, небольшие там и вот перед нами каша из логики и вспомогательного кода.
ГВ>>Ну, Игорь, это уже отдаёт пионерством: "эта дорога неверна, мы срочно побежим другой". А чтобы не было каши надо чаще думать, чем работать. Помогает, проверено.

IT>Думать и работать — это аргументы в пользу бедных, будешь эту лапшу своему начальству вешать. Расскажешь ему, что вот там на RSDN есть такой дурачёк IT, нифига в этой жизни не понимает, а вот я, Геннадий Васильев, фишку очень даже секу

Что-то я не понял выделенной фразы. Причём тут бедность или богатство? А... кажется дошло. Это только бедные думают и работают... Хм. А богатые что делают?

IT>В техническом же форуме всё это называется одним ёмким словом — демагогия.

Ну в данный момент мы с тобой в форуме "Философия программирования", а философы — они народ сложный, так что уж — извини.

ГВ>>А если без ёрничанья, то перспектива получения каши если не из БЛ+вспомогатльный код, то уж внутри вспомогательного кода или внутри самой БЛ — по любому остаётся.


IT>Okey, хоть ты и не любишь песнь про большие проекты, но всё же, позволь, я тебе её спою, т.к. из всей нашей предыдущей дискуссии, я делаю вполне очевидный вывод, что ты слабо представляешь себе что это такое.

Грустная же у тебя песня получилась... И кстати, ты совершенно прав в том, что я действительно не представляю себе проекты с 50 девелоперами с зарплатой 150$/h. А вот объёмные (измеримая характеристика, ~300-500KLOC) проекты, реализуемые командой из ~15 девелоперов — очень даже представляю и под немалой частью твоих наблюдений (заметь, не выводов!) готов подписаться сам.

IT>Для начала давай разберёмся, что такое большой проект. Если ты думаешь, что это объём написанного кода, то это правда только отчасти. Это всё равно что определять сексуальную ориентацию человека по вторичным половым признакам. Так вот, размер проекта вовсе не измеряется числом строк, он измеряется числом амбиций, прямопропорционально зависящим от количества девелоперов помноженное на их амбициозность. Если учесть, что на серьёзные проекты приглашают серьёзное количество серьёзных ребят, то можешь себе представить что это такое.

Дурдом, естественно, хотя как мне кажется — ты не совсем верно здесь обобщаешь. Конкретная команда формируется конкретным PM-ом или отделом кадров... А может быть, у нас с тобой понимание термина "серьёзные ребята" сильно отличается.

IT> Например, представь что бы получилось, если бы кому-нибудь взбрело в голову поднять такой проект силами Top100 RSDN.ru

Хорошая шутка. Я даже хорошо представляю наши с тобой хм... споры в такой команде.


IT>У каждого из нас свои предпочтения, свой опыт и свои накатанные решения. Они все правильные, но разные. Сегодня может оказаться весомее мнение того, кто красноречивее, завтра того, у кого больше орденов, послезавтра окажется, что лучше было бы делать немного по-другому. А потом у PM'ов созреет новое видение функционирования продукта, маркетинг обнаружит новую нишу на рынке и тут найдётся кто-то, кто предложит ещё более подходящее в данной ситуации архитектурное решение. А проект тем временем идёт, люди пишут код, QA не сидит без дела. И тут ты в не самый подходящий момент заявляешь, что надо бы сделать небольшой рефакторинг во всех классах бизнеслогики. Всего-то делов на 3 часа и все изменения ты сделаешь сам. Правда на эти 3 часа лучше всем пойти покурить, т.к. тебе понадобится весь проект. Допустим средний рейт каждого из 50 девелоперов на этом проекте равен $150/h, то $150 * 3h * 50 = $22500. Столько стоит трёх-часовой простой на таком проекте.

Не-а, они все будут спать (буквально, ночью, как и все нормальные люди), пока я буду модифицировать проект. А наутро простой составит 4 часа одного меня, пока я буду отсыпаться, т.е., $150 * 4h = $600.

IT> Что бы этого избежать используется более мягкий переход, в коде начинают одновременно соседствовать два-три решения, появляются рудименты и атавизмы предыдущих архитектур. Код становится всё более и более запутанным. Бороться с этим бесполезно.

Да, Игорь, так обычно и происходит и ни в малейшей степени я с этим спорить не собираюсь. Бессмысленно спорить с тем, что есть. Споры обычно возникают вокруг того, что должно быть. Кстати, и наша с тобой дискуссия — о том же. Ты на самом деле предлагаешь не упорядочить бардак, а всего лишь свести его до "управляемого", т.е., не ты тянешь за собой проект, а он растаскивает тебя. Знаешь, меня здесь немного огорчает то, что при таком подходе роль архитектора должна по идее свестись к MSDN, т.е., — к справочной системе. Да и та не очень нужна.

IT> Так же бесполезно как и с тем, что в политику идут не совсем чистоплотные товарищи и очень часто выигрывают.

Выигрывает обычно тот, кто умело использует правила игры в своих целях. Впрочем это так... ремарки на полях.

IT> Человеческий фактор, ничего не поделаешь Рассуждать о правильном дизайне мы все мастаки, более того, каждый из нас может похвастаться удачными реализациями удачных решений в небольших проектах. Но большой проект — это часто наука психология + теория компромиссов.

И это тоже совершенно верно (не привязываясь к терминам). Архитектура "большого проекта" — это тоже вагон компромиссов. И на мой взгляд, компромиссность не означает отсутствия архитектуры.

IT> Единственный способ поднять такой проект — это не бороться со всем этим бардаком, а суметь его (бардак) организовать (не в смысле устроить, а в смысле взять под контроль).

Погоди, погоди. А у тебя что, сначала набирается 50 человек, а потом по ним приблизительно разбрасывается структура работ? Ну тогда пардон, но бардак неизбежен. Может быть, бардака лучше не допускать?

IT> Это умение построить не наиболее удачный дизайн с точки зрения какой-либо привычной характеристики типа быстродействие, масштабируемость, переносимость, а сделать его индифферентным к будущим изменениям, которые неизбежно будут возникать, причём периодичеки.

Лучший дизайн = отсутствие дизайна? Э нет, Игорь, вот тут я с тобой не согласен совершенно. Если совсем чуть-чуть подумать над твоими словами, то мы получим дизайн, который своеобразной "сеткой" облегает "большие и могучие системы" типа ОС, SQL-сервера, Коммуникационной Инфраструктуры. Почему? А потому, что у тебя нету больше места для централизации прикладной семантики. Не-ту-ти. Совсем. Ты пытаешься удовлетворить пожелания всех разработчиков, а это невозможно в принципе. И что ты делаешь? Вздыхаешь, говоришь: "Ну, в конце концов, это сильные ребята" и лепишь "индиффирентную к изменениям архитектуру". В результате у тебя один модуль работает лучше, другой хуже, третий работает через раз... Классика жанра: "Что же это, вы все Левши, а блоха так и не скачет." Я разумеется, сгущаю краски, но суть в том, что при таком подходе любой проект превратится в большой. Блин... десять землекопов в одном колодце будут копать со скоростью одного, но колодец будет в 3 раза шире. Впрочем, я естественно не сомневаюсь, что у конкретного тебя все блохи подкованы и скачут.

Штука как раз в том, что хорошее проектирование (ИМХО) стремится максимально удовлетворить и требованиям масштабируемости, и требованиям переносимости, и необходимому быстродействию, и самое главное — пытается сделать это только один раз, за счёт унификаций. Да, действительно, чтобы не иметь геморроя с выделением сквозной функциональности её лучше выделять на этапе проектирования. Не отсюда ли, кстати и тезис о "специальном проектировании" для АОП?

IT>AOP — это один из путей в светлое будущее. Прежде всего потому, что позволяет разнести, в общем-то, слабо связанные друг с другом сущности, полностью отжать бизнес логику от сквозного кода.

Согласен вобщем-то. Но есть и ещё одна заморока: этот тезис раньше выдвигался как защита ООП. Ничего нового.

IT>С одной стороны, чем короче код бизнес объектов, тем дешевле заказчику обойдётся проект. Продположим, каждый бизнес метод имеет в среднем по 10 строчек, ты сумел убрать одну, экономия 10%.

Ну вот только не грузи меня подобными "расчётами". Э... повторяя тебя же:

будешь эту лапшу своему начальству вешать

Это будет прекрасным аргументом в его глазах. Или у тебя "сильные ребята" работают преимущественно как машинистки? +/- 10% кода не решат вообще ничего.

IT>На 10 лимонах это уже 1 миллион. С другой, разрабатывать, реюзать, отлаживать, модифицировать и сопровождать такой код легче, а значит быстрее и дешевле. Где может сбойнуть следующий код:


IT>
IT>int Sum(int a, int b)
IT>{
IT>    return a + b;
IT>}
IT>


IT>Только в логике.

Разумеется, но кому он нужен в таком-то виде? Сбои проявятся при сопряжении этого кода с кодом сквозной функциональности. Хочешь, я напомню, чего не хватает в этом конкретном коде? Не хватает упоминания метода Sum в композиционном фильтре:

calls("int MyClass.Sum(int, int)") after(){ ... }


Притом упоминание должно быть именно таким. Почему? Попробую ответить.

ИМХО, самые большие неприятности будут, если написать вот так:

calls("* *.Sum(*, *)") after(){ ... }


Это сколько классов накроется аспектированием Sum? А если семантика MyClass2.Sum не соответствует MyClass.Sum и ему не требуется такого аспектирования? А сколько регрессионных тестов потребуется при модификации этого кода? А как тестировать новые классы? Учти, что вносимые АО-транслятором изменения непредсказуемы до запуска. Т.е., после создания нового класса можно ненароком сделать ему метод Sum и... А ведь именно так и будут поступать "новообращённые".

Впрочем, оставим пока новообращённых. Вот добавляем некий новый класс MyClass2 и метод MyClass2.Sum(), которому не требуется такое же аспектирование, как и MyClass.Sum(). Компилируем, запускаем, обнаруживаем белиберду. Исправляем... как? А вот так:

calls ("int *.Sum(*, *)")&&!("int MyClass2.Sum(int, int)") after(){ ... }


Т.е., здравствуй, отдельное упоминание метода MyClass2.Sum(). Потом ещё раз и ещё раз также. У нас вытягивается длинная цепочка отрицаний исходного обобщения "int *.Sum(*, *)". Притом обрати внимание, что эквивалентность имён в фильтре и в коде компилятором не верифицируется (это же просто поиск: нашли — хорошо, не нашли — фиг с ним), переваливая всё на рантайм.

Наконец, мы плюём на всё это и пишем в фильтре примерно такую конструкцию:
calls ("int MyClass.Sum(int, int)") || ("int MyClass3.Sum(int, int)") after(){ ... }


т.е., прямо перечисляем все аспектируемые методы. Но есть одна существенная деталь. В поисках аспектов нам приходится носиться неизвестно где и постоянно отвечать на вопрос: а не влияет ли данный аспект на новый класс/метод и т.п.? Плюс к тому — решать постоянную дилемму: добавить ли новый критерий в фильтр или модифицировать название метода/класса и т.п. Т.е., в пределе каждый шаг работы сопровождается вагоном неизвестных последствий, возникающих неизвестно откуда. Добавь ещё сюда, что часть фильтров при модификациях будет непременно забыта и она неизвестно когда выстрелит. Выход? Выход простой: отказаться от обобщений на основе имён, уровней доступа и тому подобной лабудени и для каждого метода и класса прописывать соответствующий вход в композиционном фильтре. Дешёвые примеры из статьи здесь, увы, на аргумент не канают.

А вот теперь противопоставим такому подходу конструирование на шаблонах. Если мы опишем класс прикладной логики например так:


// Общий базовый класс для прикладных классов
template<template<typename G, typename A> class POLICY, typename G, typename A>
class AppBase : public POLICY<G, A> { ... };

template<typename GENERAL_POLICY >
class AppClass1 : virtual public AppBase<Policy, GENERAL_POLICY, AppClass1 >
{
  int Sum(int a, int b)
    {
      POLICY_METHOD_CALL(Sum); // Создание объекта, контролирующего вызов.
        POLICY_RESULT(a + b); // Возможный перехват возвращаемого значения.
    }
};


То мы сможем сделать "финт ушами" и описать требуемую специализацию Policy<> в отдельной группе файлов, где и упомянем о сквозной функциональности и прочих аспектах специализации. В принципе — то же самое АОП, но разница по сравнению с неявной модификацией исходников именно в "явности" специализаций шаблонов. Плюс к тому — мы можем на всех уровнях использовать композиционные возможности C++. Хошь — в аспектах, хошь в специализациях полиси, хошь — в прикладных объектах. Некоторые композиционные ошибки будут отслежены компилятором.

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

IT>А этот?

IT>
IT>HRESULT SomeClass::getSomeValue(LONG *retVal, LONG a, LONG b)
IT>{
IT>    COM_CALL_TRACE_TMDEF(TraceMode<Logged>, SomeClass, getSomeValue)

IT>    *retVal = a + b;

IT>    return S_OK;
IT>}
IT>


IT>Ошибка может быть в вызове макроса (кстати, почитай что о макросах думает Страуструп),...


Плевать мне, что Страуструп по этому поводу думает. Именно недостаточная унифицированность синтаксиса C++ и есть одна из тех "дырок", которую проще заткнуть макросом. Хотя... почему бы не сделать например так:

template<typename GENERAL_POLICY>
class AppClass1 : virtual public AppBase<AppPolicy, GENERAL_POLICY, AppClass1 >
{
    // AppBase::tracer_t<>; // импортируем из AppBase<>, конструктор специализируется адресом метода
    // AppBase::returner_t<>; // оттуда же, специализируется адресом метода
  int Sum(int a, int b)
    {
      tracer_t t(Sum, this); // Создание объекта, контролирующего вызов.
        return returner_t::rv(Sum, a + b); // Контрольная точка для возможного перехвата возвращаемого значения.
    }
};



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

IT>... в самой логике, в коде возврата.

Да, это естественное следствие простейшего сопряжения двух разных идеологий.

IT> Т.е. твой код потенциально в три раза менее надёжный.

Нет, на практике он будет ничуть не менее надёжным, чем приведённый тобой пример. А в отдельных случаях — даже более.

IT> Теперь помнож это на те амбиции, которыми определяется размер проекта и в результате ты вылетишь с него со свистом, как вылетают те многие, которые всего этого не понимают.

Я думаю, что ты очень сильно загибаешь, ну да ладно. Кстати, ты не определил моей гипотетической роли в этом проекте. Ручаюсь, что с роли архитектора я вылечу в последнюю очередь.

IT>Поэтому, отвечая на твой пост:

...ты излагаешь наблюдения, делая странные на мой взгляд выводы.

ГВ>>

IT>

А если без ёрничанья, то перспектива получения каши если не из БЛ+вспомогатльный код, то уж внутри вспомогательного кода или внутри самой БЛ — по любому остаётся.


IT>Дело не в наличии каши как таковой, дело в её размерах. Каша в БЛ — это каша в БЛ, каша в сквозном коде — это каша в сквозном коде. Если ты их соединяешь вместе, то ты их не складываешь, ты их помножаешь.

И с умножением здесь я тоже совершенно согласен. Только то же самое у тебя произойдёт и при работе с АОП. Разве что коэффициент умножения будет несколько меньше.

IT> Согласен, что в маленьком проекте это вполне допустимо, практически без разницы, но в большом... увы.

Да, и я совершенно согласен.

IT>Хорошая архитектура в данном смысле — это не та архитектура, которая красиво смотрится в коде, это та, которую не видно вообще.

У-у-упс! Хороша позиция для архитектора, ничего не скажешь. Что-то я не совсем понимаю: а за что же он тогда отвечает? За то, чтобы все песни всех участников создали некое подобие согласованного скрипа?

ИМХО, хорошая архитектура позволяет ответить на вопросы: "чего можно?" и "чего нельзя?", и не требует большого времени на изучение деталей. Иными словами, хорошая архитектура помогает организовать мышление участников, чтобы не было явления ужасных Лебедя, Рака и Щуки.

IT> А AOP — это как раз один из путей для нас увидеть всё это счастье ещё в этой жизни

Увидеть — и содрогнуться? Во всяком случае, я бы не стал утверждать, что архитектура, которой "не видно вообще" — это хорошо. Это скорее признак гибели архитектуры, а АОП для неё — всё равно что спасательный круг. Только вот на спасательных кругах обычно ждут спасателя, а не отправляются в круизы...



Теперь — немного выводов.

Первое. Естественно, я не собираюсь спорить с твоими наблюдениями относительно того, что есть и какой бардак творится вокруг. Проблема в другом: ты указываешь на проблемы организации проекта, и предлагаешь решать эту задачу техническими методами. Извини, но это чушь. Во всяком случае — очень наивное суждение. Техника только немного помогает уменьшить объём бардака и только ненадолго. Нобель тоже когда-то думал, что тротиловая шашка попросту распугает воюющие армии. Какая наивность! Они стали мутузить друг друга ещё интенсивнее. То же самое произойдёт и с АОП (как в своё время — с ООП) — бардака только прибавится. Например, народ будет долго и нудно спорить о том, относить то или иное явление к Аспектам или Объектам. Так что, возможно, тебе стоит разобраться с управлением требованиями, обучить маркетологов азам дизайна или программистов — маркетингу. Не знаю. Но уверен, что ни шаблоны, ни АОП здесь не помощники... На мой взгляд, дико выглядит ситуация, когда каждый делает то, о чём душа поёт, но при этом называет себя членом команды. Ещё более парадоксальна твоя фраза о том, что "а проект-то идёт"... Как это так? Проект идёт, но требуется его срочная оптимизация (иначе мне просто не придёт в голову и мысли об оптимизации)... А сколько будет стоить проигрыш от невыполненного рефакторинга? Это уже и есть глупость чистой воды — ехать, лишь бы ехать.

При всём при том я не предлагаю жёстко заставлять всех "думать правильно" и так далее. Нет, я только предлагаю структурировать направление усилий и развить коммуникации. Проекты с большим числом участников (больше двух!), кстати, нередко от того и гибнут, что коммуникации плохо работают, или потому, что разнообразие мнений превращается в Лебедя, Рака и Щуку. И никуда от этого не денешься. Всегда — сколько людей, столько мнений. Но ведь и их можно разделить на подкоманды, подгруппы и т.п. И неизбежно что-то кому-то придётся отбросить и с чем-то смириться. Если кто-то не согласен — ну что ж. Может поискать другую работу или найти своё место здесь. Второй вариант предпочтительней, первый — тоже выход. Вот здесь действительно нужны и психология, и компромиссность, и ещё много каких личностных качеств центровых игроков.

Второе. Ты здесь в соседней ветке сказал, что у нас с тобой спор "новое vs старое". Нету пока что в АОП принципиальной новизны. Где она? В том, что привязку одних объектов к другим обозвали неким именем? Угу, новизна в общепринятой терминологии — и я с этим не спорю. Появились новые инструменты? А где я говорил, что это само по себе плохо? Другое дело, что они пока идеологически кривы... ну может быть когда-нибудь спрямятся. Возможно, появится новая строчка в табели о рангах в IT-индустрии. Но вся принципиальная новизна АОП пока что разлетается в пыль, если только вместо вызова метода создавать объект MethodCall<> с соответствующими параметрами и т.п. Всё, на этом новизна АОП заканчивается. Точки привязки аспектов на данный момент выделяются крайне наивно: call/return/before/after/throw/around ну и ещё — модификации структуры классов. Я не случайно говорю "на данный момент". Может быть — придумают что-то ещё: например, эффективные способы семантического анализа программ. Или — принципиально новые способы подмешивания сквозной функциональности. Хорошо бы...

Так что, на данный момент я оспаривал и оспариваю, что:
— АОП нас всех спасёт (технология принципиально не помощник в решении проблем организационного характера);
— ООП присущи недостатки, о которых упоминалось в статье (в кривых руках и микроскоп — всего лишь плохой молоток);
— АОП — это нечто принципиально новое (слабовато).

Вся новизна залючается только в снятии одних шор и немедленном одевании других. Коллеги, ну ёлки зелёные, лучше Лиспом займитесь.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: Спорно.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.01.04 14:21
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>т.б. ты хочешь сказать что АОП это не метод проектирования, а метод добавления?


Очень точно подмечено А проектирование это такое проектирование когда учитывается возможность легкого добавления.
... << RSDN@Home 1.1.3 beta 1 >>
AVK Blog
Re[22]: Ответ
От: TK Лес кывт.рф
Дата: 26.01.04 22:16
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

TK>>Ну, добавлять свои сервисы через CBO и говорить, что используется ремоутинг — это слишком громко. Просто, схожие технологии которые используют общую инфраструктуру.


IT>С той оговоркой, что в решеаемой задаче используется ремоутинг. Такая формулировка устроит?


А если ремоутинг не используется? т.е. реально считается, что System.EnterpriseServices.ServicedComponent это просто "неживое" решение (особенно библиотечные COM+ компоненты) из-за тормозов в CBO?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[17]: Ответ
От: IT Россия linq2db.com
Дата: 28.01.04 15:41
Оценка: 1 (1)
Здравствуйте, Batiskaf, Вы писали:

B>Вот давай я буду этой бестолковой операционисткой а ты будешь этим пионером, или наоборот, если хочешь .Net реализация АОП тебе не нравится, да?


Да её там почти нет.

B>Ну а AspectJ нравится?


Я такого не говорил.

B>Раз уж заговорили о количестве траха, то для сравнения я возьму тот же пример из статьи, все тот же Point, Line, DisplayUpdateAspect и попытаюсь выразить это на плюсах, а потом сравним со статьей.


[nice code skipped]

Это всё извращения на тему как сэмулировать AOP любыми доступными средствами. Я в своё время, когда меня заставили вернуться опять на C с C++, писал что-то типа такого:

struct MyObject
{
    int x;
    int y;
};

void MyMethod(MyObject *this)
{
}


И даже с успехом эмулировал виртуальные функции. Но называть этот изврат ООП у меня как-то язык не поворачивался.
То же самое сейчас ты демонстрируешь на С++. То же самое с RealProxy. То же самое я делаю в RFD с абстрактными классами. Всё это показывает лишь то, что проблема назрела и существует необходимость реализации AOP нормальными языковыми средствами.

В твоём коде я вижу как минимум две проблемы.

1. У тебя всё построено на виртуальных методах, следовательно, твои аспекты применимы только к ним.
2. Пользователь может создать и использовать просто Point, а не DisplayPoint. И тогда к нему придут пионеры.
3. Комбинирование аспектов в твоём случае приводит к появлению нового аспекта, реализующего эту комбинацию. Соответственно, там где нужно будет написать 2 аспекта тебе придётся делать 3, там где 3 — 7 и т.д. Запутаться не долго. При этом поймать ошибку будет непросто.

B>Количество вариантов как ты сам понимаешь ростет, а количество телодвижений за счет повторного использования моих же "аспектов" гораздо выше. Цель применения аспектов лежит в том что бы делать менее связанный, декларативный код, в примере из статьи я этого не вижу. Вот как я могу применить aspect DisplayUpdating в другом месте для другой компоненты в AspectJ, например для 3DPoint??? Они же все hardcoded, там четко прописано к какому методу какого типа все это привязывается, кроме всего нужно уметь понять что тут относится к сетап коду этих аспектов, а что к сквозной функциональности.


Давай не будем пытаться сравнивать академические исследования с коммерческими продуктами. AspectJ — это всего лишь попытки найти правильный путь. Мне тоже не нравится то, что ты называешь hardcoded. Но и ООП не начался с C++, до этого было много других языков, на которых пытались выразить идеи ООП. То что в AspectJ используется пока только 'call' совсем не означает, что мы не можем использовать что-нибудь типа 'attribute', 'baseclass', 'interface' или их комбинации.

B>А что касательно наследования таких аспектов???


Не вижу необходимости в наследовании Аспекты должны легко комбинироваться, а не наследоваться. Поэтому, например, гораздо важнее может оказаться механизм очерёдности их применения, что-то типа приоритетности.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Статья про АОП
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.04 04:13
Оценка: +1
Здравствуйте, Miem, Вы писали:

Статья нужная, но затянутая и с плохим русским. Ей бы корреторскую правку и цены бы ей небыло.

А то автор? Может связаться с ним и предложить опубликовать статью у нас (в журнале и на сайте)?
... << RSDN@Home 1.1.2 beta 3 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Спорно.
От: IT Россия linq2db.com
Дата: 22.01.04 18:10
Оценка: :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Так что, извини, но я не буду решать именно такой задачи: у меня её просто не может быть. И ещё с удовольствием настучу по рукам тому, кто попытается нечто подобное учудить.


Ну вот видишь, сам не любишь группу "Ты никогда не писал больших программ", зато являешься поклонником "Я настучу всем по рукам, кто так будет делать".
Ok, если мы такие нежные и нам нужен жизненный пример на туже тему, то вот тебе пример.
Пусть у нас не 200 классов, а всего лишь 20, в каждом из них в среднем по 10 паблик методов, итого 200 методов. Ну так получилось Теперь нужно добавить ко всем к ним каунтеры нескольких типов, чтобы обеспечить полный мониторинг системы во время эксплуатации.
Теперь влючай свою декомпозицию, выключай демагогию и покажи как это просто делается без AOP.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Спорно.
От: Banch  
Дата: 23.01.04 10:13
Оценка: +1
ГВ>Возьмите, например, вот эту цитату:

Аспектно-ориентированная декомпозиция на этапе анализа и проектирования позволяет выделить сквозную функциональность на разных уровнях абстракции и локализовать ее в отдельных модулях-аспектах.


ГВ>И замените в ней слова "Аспект" на "Объект". :) Что получили? Гы. Теперь делаем второй трюк: меняем "Аспект" на "Процедура". :))) Ох и любят же апологеты технологий игру словами. Как и я, впрочем. :)) Только я этой игры не скрываю. :)))


Суть в том, что с течением времени надо писать системы с все большим функционалом и за все меньшее время. А в последнее время добавилось еще и постоянное изменение требований прямо во время разработки.
Получается что нужно совершенствовать методологию и средства разработки, иначе никогда не удасться выйти из стадии проектирования. А если все-таки долго проектировать, то может и надобность в системе отпасть, потому что нужно будет уже что-то совершенно новое, или вообще клиент уйдет к конкурентам :)
Re: Спорно.
От: Merle Австрия http://rsdn.ru
Дата: 23.01.04 13:26
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Парадоксально но факт: ничего принципиально нового там нет, всё, что сказано — становилось понятно любому проектировщику ОО-систем ещё эдак лет 10 назад. <...> Ситуация — один в один, как и с паттернами.

<...>

ГВ>Павлов указывает недостатки, которые мне кажутся перефразом очень давно сформулированных тезисов:

ГВ>

ГВ>Плохое прослеживание назначения модуля: Одновременная реализация нескольких требований в одной модульной единице делает неясным соответствие между отдельным требованием и его реализацией, в результате затруднительно понять, что реализует конкретный модуль.

ГВ>Это можно отнести к любой программе — безотносительно её А- или О- ориентации.
<...>
ГВ>Решалось и решается на уровне проектирования, вернее — декомпозиции. Аспекты, как и объекты — не сами по себе родятся, а только как следствие работы мысли проектировщика.
<...>
ГВ>Проблемы совмещения реализаций аспектов тоже ещё не исследованы и не известны, что отмечает и автор статьи. Кроме того — это же ставилось в вину процедурному подходу.
<...>
ГВ>Именно это ставилось в вину "старому" подходу: структурному проектированию. Не, коллеги, проблема не в ярлыке, который вешается на "методологию", проблема в ДНК проектировщиков.
<...>
ГВ>Проделайте маленький фокус.
<...>
ГВ>Собственно, подобный трюк можно проделать со всей статьёй.

Клева конечно, но с чем ты здесь споришь?
Насколько я понял, автор статьи не объявляет о создании новой серебряной пули, а просто описывает круг проблем, при решении которых AOP облегчает жизнь.
Ты совершенно прав, тоже самое говорили и про процедурное программирование, и точно так же OOP не панацея.
Опять-таки, можно писать афигенски большие программы в чиста-процедурном стиле при наличии правильных рук, все дело в трудозатратах...

ГВ>Ох и любят же апологеты технологий игру словами. Как и я, впрочем. Только я этой игры не скрываю.

Ну вот ты и признался...

ГВ>И опять — "недостатки", на этот раз — подходов к соблюдению контрактов:

ГВ>

ГВ>Неспособность программных компонентов к повторному использованию. Соблюдение контрактов может быть верно для компонентов только в контексте конкретной системы. В другой системе вполне могут быть другие соглашения, что ведет к модификации кода компонентов

ГВ>Чушь, извините. Совершенно то же самое можно получить и при бестолковой реализации аспектов. Проблема со свистом обходится глубоой декомпозицией проекта.
Да кто бы спорил, но при AOP эта "глубокая декомпозиция" обходится дешевле.
Ну и так далее...
Вообщем поинт в том, что AOP не универсальное лекарство от всех болезней, как ты, возможно, пытаешься показать, а некая довольно приятная мулька, при наличии которой легче жить.
Мы уже победили, просто это еще не так заметно...
Re[18]: Спорно.
От: IT Россия linq2db.com
Дата: 24.01.04 22:55
Оценка: :)
Здравствуйте, naje, Вы писали:

N>+ всё это можно приправить всякими рюшечками типа переопределеных операторов [],(),->, более удачных названий, генерации структур Action1 по обычным методам класса(правда перечисл. в каком-нибудь листе типов), то что делает ProxyHlpr можно разнести в разные классы, чтоб удобней специализировать было, специализировать его можно не по класу и действию, а по групе класов и действий, ну и куча других приёмчиков, которые к этому топику отношения не имеют


Понятно. Реализуем паттерн Proxy. В общем, до простоты AOP тут как на четвереньках до Парижа. Особенно мне понравился вызов метода:

obj.Do<MyClass::Action1>(Tuple(12,Aliased<xParam>(2)));


Очень наглядно. Хотя, конечно, в качестве job security очень даже ничего
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Ответ
От: IT Россия linq2db.com
Дата: 25.01.04 00:40
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>Да хоть думай, хоть не думай, мантейнить это всё кому-то придётся.

ГВ>Ровно как и в случае использования АОП-компилятора.

Не совсем. Классы бизнес логики трогать не надо будет. Этим вообще могут заниматься разные люди и песнях про большие проекты даже разные подразделения.
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Ответ
От: mikа Stock#
Дата: 25.01.04 17:56
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

V>>(в отличии от CBO, где рефлекшн используется в каждом вызове,


AVK>В MBR (и CBO который ничем от MBR, кроме механики инициации не отличается) рефлекшен не используется. TransparentProxy это и есть то о чем ты говоришь, только реализованое прямо в JIT, т.е. не требующее компиляции вобще, а значит заведомо более быстрое чем то что ты предлагаешь.


Ты знаешь, я никак не могу понять, причем тут TP. Если вы реализуете класс от CBO и он передается между машинами, то это понятно, что скорость TP тут ничего не меняет, так как эта скорость выполнения какается только клиентской машины. Если же этот объект начинает использоваться внутри того домена, где он создан (а сервер скорее всего вызывает методы этого объекта, ибо не просто так же он получает), то скорость TP тут опять не играет. Вся тягость ложится на плечи того, что следует за TP (форматеры, синки, терминаторы и т.д.). И тут, честно говоря, нельзя сходу сказать, что тормозднее — RealProxy или вызов методов через Reflection.

AVK>Тормоза ремоутинга не из-за тормозных проксей, а из за цепочки синков — и формирователи сообщений, и форматтеры и транспортные синки это очень небыстрая операция, поскольку, как правильно заметил IT, механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.


Именно для перехвата вызовов она и предназначена. А уж как ты распорядишься этими вызовами (транзакции, сериализация, синхронизация, кеширование, безопасность и т.д.) — это твое дело.

AVK>Потому и получается что при вызове через контекст происходит море лишних действий, в том числе и с использованием рефлекшена (для работы форматтера и запуска сообщения).


Ну, не только для форматера. Методы объекта, мне кажется, тоже вызываются через Reflection. Прокся же держит в себе Object.

V>>Ну а теперь вернемся в "человеческое" ООП.

V>>Предложенная задача — неожиданная потребность начать мониторинг вообще всех вызовов — явно из разряда особенных (надуманных).

AVK>Эта задача очень часто встречается на практике. Вот буквально неделю назад такая задачка стояла.


Вообще всех? Ты уверен? Даже внутренние вызова внешних объектов? ИМХО, CBO только ухудшит картину. Часто те объекты, которые передают с сервера на клиент делают сериализуемыми (Serializable) и уж ни как не передают по ссылки.
Или ты предлагаешь идти по такому пути, что на время теста (вряд ли в реальных условиях может пригодиться подсчет вызовов) делать все объекты от CBO, а потом снова переводить их в сериализуемые классы? Тогда явная перекомпиляция + изменение внешнего интерфейса (думаю, не стоит объяснять, что Нет довольно сильно реагирует на изменение базового класса).
Re[11]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 13:18
Оценка: +1
Здравствуйте, Batiskaf, Вы писали:

B>Идеей твоей Игорь, я честно сказать не пронялся, в плюсах есть точно такие же декларативные средства, что ты тут показываешь.


Так мне никто не мешает вызывать MyClassBase напрямую без typedef. В этом вся проблема
Тогда уж лучше абстрактные классы vdimas.

B>И обошлись без ContextBoundObject... Может я ошибаюсь, но преимущества АОП в .Net в том, что я могу обувать свои типы в атрибуты динамически, на этапе выполнения? Нужно ли это на этапе выполнения, это уже другой вопрос


AOP в .NET находится в зачаточном состоянии. И хотя мне тут некоторые пытаются приписать популяризацию имплементации AOP в .NET с помощью RealProxy, это не так. Настоящий AOP без проддержки компилятором или хотя бы препроцессором не возможен. Ни на C#, ни на C++. Иначе мы бы его все уже давным давно успешно использовали. Всё что здесь предлагается — это использование тех или иных паттернов, что само по себе не плохо, но вовсе не является AOP.
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 16:37
Оценка: +1
Здравствуйте, Batiskaf, Вы писали:

IT>>Тогда уж лучше абстрактные классы vdimas.


B>Согласен, но это уже вопрос воспитания.


Воспитание — это хорошо. Но если есть возможность ошибиться, то люди будут ошибаться и этот код будет уходить в производство. В результате всё как бы работает и даже правильно, за исключением какой-то одной служебной функции. Вот, допустим, мы подобным способом имплементируем разграничение прав. Я забыл о воспитании или, например, Intellisence, сволочь подсунул мне не тот метод. Всё работает, функциональные тесты проходят, код уходит клиенту. Далее юный хакер из соседней школы вызывает мой метод и грабит через него автоматизируемый нами банк Кого сажать? Меня, как допустившего ошибку? Или тебя, как давшего мне такую ошибку допустить? Допустим меня, но где гарантия, что это была одна единственная подобная ошибка? Ты это можешь гарантировать?

B>Кому то проще наследоваться от ContextBoundObject и заколачивать в него гвоздями все необходимые атрибуты, я же предпочитаю оформить инклюд файл, в котором находятся одни typedef's, с комментариями и рекомендациями как это все использовать, тем более что документировать приходится как мне так и тебе в одинаковой мере. Внешне все выглядит по разному, но результат все тот же


Как раз сейчас речь идёт вовсе не о результате. Речь о минимизации усилий при кодировании и сопровождении.

B>Еще несколько лет назад я бы кинулся в драку защищать свой любимый С++, но со временем эта категоричность проходит, думаю у тебя тоже это случится, тридцатка уже стукнула или еще нет?


Нет, пока только 0x25 стукнуло

B>Вобщем какое может быть отношение неискушенных программеров к АОП идеологии? На мой взгляд тут нет места сопоставлениям, AOP vs. OOP и так далее. Это две разные парадигмы, которые друг друга дополняют, но не заменяют.


Кто бы спорил. Ты почитай с чего начался весь спор. ГВ заклеймил AOP как явление, сказал что без него до сих про жили и жить будем дальше. Пришлось вступаться.
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Ответ
От: IT Россия linq2db.com
Дата: 27.01.04 14:38
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>1. Неохота на клиента тянуть библиотеки имплементирующие БО на стороне сервера (из-за их потенциального размера и, вероятно, частой обновляемости да и еще 100 причин), т.е. хошь не хошь а выбираем абстрактные базовые классы или интерфейсы для наших целевых БО.

V>2. Неохота удаленные экземляры этих БО биндить непосредственно к контролам форм, ибо не все изменения на форме клиента необходимо моментально перегонять на сервер, да и живость такого варианта "под пальчиками" оставляет желать лучшего при dial-up соединении. Из опытов предыдущих разработок выяснилось, что непосредственно гнать на сервер изменение поля БО надо дай бог в 10% случаев (для валидации сложной, либо для изменения значения других полей по сложному алгоритму), Поэтому решено автоматически генерить на клиенте заместитель, построение которого управляется типами и атрибуттами полей открытого абстрактного объявления БО.

Вообще-то, как-то это всё мудрёно. БО конечно же не надо тянуть на клиента, на клиента обычно тянется фасадная dll, содержащая интерфейсы к БО и бизнес сущности. Таже валидация, например, может быть (и должна) быть встроена в безнес сущности.

V>И самое главное, поделитесь опытом, насколько реально в дотнетовском проекте перейти прямо сейчас на аспектную платформу без потери скорости? Какие есть инструменты?


Если вы используете ремоутинг, то все возможные тормоза вы уже получили, поэтому можно не стесняться и выносить весь сквозной код в интерсепторы.
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: Спорно.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 23:21
Оценка: :)
Здравствуйте, IT, Вы писали:

IT>
IT>obj.Do<MyClass::Action1>(Tuple(12,Aliased<xParam>(2)));
IT>


IT>Очень наглядно. Хотя, конечно, в качестве job security очень даже ничего


Толи еще будет, если мы все это не остановим!
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Ответ
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.01.04 17:32
Оценка: :)
Здравствуйте, VladD2, Вы писали:
VD>Так эта... ужо. Порубили, спланировали... даже альфа парсера пашет.
Это вы пока котлован роете. А вот как начнете обсуждение, в какую сторону расширять и углублять C# — вот тут-то и пойдет заливка фундамента. Кровью и слюнями .
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Бардак ещё не аргумент
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.02.04 06:17
Оценка: :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Что-то я не понял выделенной фразы. Причём тут бедность или богатство? А... кажется дошло. Это только бедные думают и работают... Хм. А богатые что делают?


О!!!... У них есть одна большая задача. Они думают как не работать.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Статья про АОП
От: Banch  
Дата: 15.01.04 10:22
Оценка:
спасибо за статью :)
очень интересно было наконец узнать что такое АОП
много слышал, но деталей не знал
Re[2]: Статья про АОП
От: hrg Россия  
Дата: 19.01.04 06:43
Оценка:
VladD2 -> "Re: Статья про АОП" :

V> Здравствуйте, Miem, Вы писали:


V> Статья нужная, но затянутая и с плохим русским. Ей бы корреторскую

V> правку и цены бы ей небыло.

Статья очень-очень нужная. Как говориться — в нужное мество и в нужное
время. Не пришлось изобретать велосипед. Но насчет правки — то же верно.

V> А то автор? Может связаться с ним и предложить опубликовать статью у

V> нас (в журнале и на сайте)?

Там рядом еще одна статья лежит.

Yury Kopyl aka hrg | http://id.totem.ru | "мы не пьем — мы лечимся..."
Posted via RSDN NNTP Server 1.8 beta
Re[3]: Статья про АОП
От: Miem Россия  
Дата: 19.01.04 06:55
Оценка:
Здравствуйте, hrg, Вы писали:

V>> А то автор? Может связаться с ним и предложить опубликовать статью у

V>> нас (в журнале и на сайте)?

Я автора лично не знаю ,его мыло указано в начале статьи. Сам наткнулся на сайт случайно.

hrg>Там рядом еще одна статья лежит.


Она, по-моему, представляет гораздо меньший интерес.
... << RSDN@Home 1.1.2 beta 1 >>
ICQ: 446240
Re[4]: Статья про АОП
От: hrg Россия  
Дата: 19.01.04 06:57
Оценка:
Miem -> "Re[3]: Статья про АОП" :

hrg>> Там рядом еще одна статья лежит.


M> Она, по-моему, представляет гораздо меньший интерес.


Если слить с первой статьей и убрать воду — будет самое то.

Yury Kopyl aka hrg | http://id.totem.ru |
"Хоббиты-маздай! Мордовия-фарева!" (С)Сарумян
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Статья про АОП
От: Miem Россия  
Дата: 19.01.04 07:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Статья нужная, но затянутая и с плохим русским. Ей бы корреторскую правку и цены бы ей небыло.

VD>А то автор? Может связаться с ним и предложить опубликовать статью у нас (в журнале и на сайте)?

Вот кто бы занялся списком литературы, который там приведен в конце статьи

А еще было бы замечательно если бы Тимофей, как самый знаток RealProxy ,накатал статью по реализации АОП под .NET на его основе . Я знаю, тут все противники реализаций чего либо на RealProxy, но на нем вполне можно замутить движок-службу, в которой можно регистировать различные расширения нечто вроде контекстный приемников, но гораздо с большими возможностями и тонкостями, например атрибуты к методам, которые будут перехватывать вызовы только к конкретному методу, всякие Nullable, подмена вызовов, задавать условия перехватов и подмены т.д. Регистрация различных типов атрибутов происходит где-нить в инициализации, а далее по коду эти атрибуты начинают активно использоваться приписываясь ко всем мыслимым местам. В общем замутить динамическую реализацию АОП, а не статическую, как в новом языке R# (на основе генерации кода). В прочем, это не одна статья,это целый проект...

PS Быстродействие — не главное.
... << RSDN@Home 1.1.2 beta 1 >>
ICQ: 446240
Re: Спорно.
От: IT Россия linq2db.com
Дата: 22.01.04 15:10
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции.


Ну и как ты собираешься подключить хотя бы тот же логгинг к уже почти готовому проекту с помощью декомпозиции?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.01.04 15:42
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции.


IT>Ну и как ты собираешься подключить хотя бы тот же логгинг к уже почти готовому проекту с помощью декомпозиции?


Вопрос не в том, как подключить, а что потом со всем этим делать.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Спорно.
От: IT Россия linq2db.com
Дата: 22.01.04 16:00
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Собственно АОП, как и ООП сами по себе не позволяют исключить зависимости реализации прикладной функциональности от "сквозной" — это решается на уровне декомпозиции.


IT>>Ну и как ты собираешься подключить хотя бы тот же логгинг к уже почти готовому проекту с помощью декомпозиции?


ГВ>Вопрос не в том, как подключить, а что потом со всем этим делать.


Ну так и как ты собираешься это делать? У тебя есть двести классов бизнес-логики, как ты с помощью декомпозиции добавишь к ним логгинг?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.01.04 00:27
Оценка:
Здравствуйте, IT, Вы писали:

ГВ>>Так что, извини, но я не буду решать именно такой задачи: у меня её просто не может быть. И ещё с удовольствием настучу по рукам тому, кто попытается нечто подобное учудить.


IT>Ну вот видишь, сам не любишь группу "Ты никогда не писал больших программ", зато являешься поклонником "Я настучу всем по рукам, кто так будет делать".


Это фигура речи.

IT>Ok, если мы такие нежные и нам нужен жизненный пример на туже тему, то вот тебе пример.

IT>Пусть у нас не 200 классов, а всего лишь 20, в каждом из них в среднем по 10 паблик методов, итого 200 методов. Ну так получилось Теперь нужно добавить ко всем к ним каунтеры нескольких типов, чтобы обеспечить полный мониторинг системы во время эксплуатации.

OK, хорошо. Что нужно мониторить? И интересно было бы узнать, откуда взялась такая задача?

IT>Теперь влючай свою декомпозицию, выключай демагогию и покажи как это просто делается без AOP.


Очень забавно — я тебе о том, что прежде чем куда-то ехать, нужно разобраться с картами, а ты предлагаешь лететь по пачке беломора и преодолевать препятствия. Ну что ж, давай поупражняемся.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: Спорно.
От: naje  
Дата: 23.01.04 08:35
Оценка:
Здравствуйте, IT, Вы писали:

IT>Забавно было читать как ты в пух и прах разносил AOP Вот теперь покажи его полную несостоятельность, заменив его своей декомпозицией. Давай, давай.


в нормальном фреймворке, с хорошо выделенным уровнем бизнес правил, всё это добавляется без труда на любом этапе, причём без препроцессоров типа AspectX'ов, а примеры таких фреймворков никто приводить я думаю не будет.

может тебе стоит почитать ещё что-нибудь кроме пресрелизов от ms?
Re[8]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.01.04 08:47
Оценка:
Здравствуйте, IT, Вы писали:

ГВ>>OK, хорошо. Что нужно мониторить?

IT>Ну хотя бы длительность и частоту вызовов.
Для каждого метода БЛ? Или для каждого метода, вызываемого клиентским приложением?

ГВ>>И интересно было бы узнать, откуда взялась такая задача?

IT>Требование заказчика. Он обчитался пресрелизов от MS и в конце проекта решил добавить мониторинг сервера приложений.
Так сервера приложений или бизнес-логики, которая на нём крутится?
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: Спорно.
От: naje  
Дата: 23.01.04 13:24
Оценка:
Здравствуйте, IT, Вы писали:

IT>Слушай, дай ссылочку, желательно на английском. Я своим архитекторам из MS и IBM покажу. А то они убогие, ничего кроме RealProxy и атрибутов придумать не могут. А мы им щас опаньки — декомпозиция! И по шапке, и по шапке...


упал, отполз
Re[11]: Спорно.
От: mikа Stock#
Дата: 23.01.04 13:49
Оценка:
Здравствуйте, naje, Вы писали:

IT>>Слушай, дай ссылочку, желательно на английском. Я своим архитекторам из MS и IBM покажу. А то они убогие, ничего кроме RealProxy и атрибутов придумать не могут. А мы им щас опаньки — декомпозиция! И по шапке, и по шапке...


N>упал, отполз


А зря. Всего лишь громкие слова, за что он так на Геннадия "наезжал"
Re[12]: Спорно.
От: naje  
Дата: 23.01.04 14:15
Оценка:
Здравствуйте, mikа, Вы писали:

M>Здравствуйте, naje, Вы писали:


IT>>>Слушай, дай ссылочку, желательно на английском. Я своим архитекторам из MS и IBM покажу. А то они убогие, ничего кроме RealProxy и атрибутов придумать не могут. А мы им щас опаньки — декомпозиция! И по шапке, и по шапке...


N>>упал, отполз


M>А зря. Всего лишь громкие слова, за что он так на Геннадия "наезжал"


просто щас если продолжать то флейм про дотнет сюда переедет
хотя причём тут RealProxy до сих пор понять не могу
про атрибуты кстати тоже можно долго спорить
Re[13]: Спорно.
От: mikа Stock#
Дата: 23.01.04 14:19
Оценка:
Здравствуйте, naje, Вы писали:

N>просто щас если продолжать то флейм про дотнет сюда переедет


Надо гнобить.

N>хотя причём тут RealProxy до сих пор понять не могу


В Нете это одна из реализаций аспектной сущности. Хотя, честно говоря, я и сам не понял причем здесь это. Сделать RealProxy через ООП не составит труда. Та же функциональность. Ладно, щас нам Игорь поведует, что же он имел ввиду, кроме понтов

N>про атрибуты кстати тоже можно долго спорить


Пожалуй, это верное решение. Что не посморить-то?
Re[15]: Спорно.
От: naje  
Дата: 23.01.04 16:12
Оценка:
Здравствуйте, IT, Вы писали:

IT>Ещё один знаток Мика, ну расскажи нам, как сделать RealProxy средствами ООП. Мне правда интересно как на ООП реализуется интерсептор создания объектов, как стэк преобразуется в список параметров и наоборот. И никаких ассемблерных вставок и выкрутасов в стиле C, только чистый ООП.


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

Проксирующий объект(или класс) легко поменять (полностью или просто что-то добавить). Причём есть куча методов как это делать тоже не сильно напрягаясь.

Стэк преобразовать в список параметров тоже можно передавая параметры в виде картежа а-ла boost::tuple (хотя реализацию можно и получше придумать, ориентированную просто на передачу параметров), потом я думаю понятно что с ним делать, причём всё это обычные правила программирования на этом верхнем уровне.
Сразу скажу что читабильность программ и производительность не теряется.

А поповоду преоброзовать уже какуюто готовую програмку под этот "верхний уровень", так это на emacs'е пара часов работы(ну может пару дней), хотя зачем это нужно?

И работает даже на всех компиляторах
Re[16]: Спорно.
От: IT Россия linq2db.com
Дата: 23.01.04 16:27
Оценка:
Здравствуйте, naje, Вы писали:

N>просто выделяем уровень, как хотим его называем (например уровень бизнес правил), все операции (создание/удаление объекта, вызов методов и т.п.) выполняются через какой-нибудь проксирующий объект (или класс), в котором всё и происходит, хотя тот кто скажет что это не ООП будет наверное прав


N>Проксирующий объект(или класс) легко поменять (полностью или просто что-то добавить). Причём есть куча методов как это делать тоже не сильно напрягаясь.


N>Стэк преобразовать в список параметров тоже можно передавая параметры в виде картежа а-ла boost::tuple (хотя реализацию можно и получше придумать, ориентированную просто на передачу параметров), потом я думаю понятно что с ним делать, причём всё это обычные правила программирования на этом верхнем уровне.

N>Сразу скажу что читабильность программ и производительность не теряется.

Хорошо бы кусочек кода самого класса, его прокси и вызывающего метода. Тонкости реализации не нужны, но на то как это может использоваться посмотреть очень даже интересно.
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: Спорно.
От: naje  
Дата: 23.01.04 17:37
Оценка:
Здравствуйте, IT, Вы писали:

IT>Хорошо бы кусочек кода самого класса, его прокси и вызывающего метода. Тонкости реализации не нужны, но на то как это может использоваться посмотреть очень даже интересно.




struct MyClass
{
    struct Action1
    {
        typedef int ret;
        template<typename P>
        static int Do(MyClass& This, const P& p)
        {
            Get<1>(p);
                // доступ к параметру по индексу
            Get<xParam>(p);
                // доступ по как-нибудь ассоциированному типу (xParam - какой-то уникальный тип)
            ForEach(p,SomeFunctor()); //просто перечисляем все параметры
        }
    };
    struct Action2
    {
        template<typename P>
        static int Do(MyClass& This, const P& p)
        {
        }
    };
};

// можно специализировать для любого действия и для любого класа статически
// + дефолтавая реализация может подобрать что-то в rt
template<typename T, typename A>
struct ProxyHlpr
{
    typedef typename A::ret ret;
    template<typename P>
    static void after(T& t, const P& p)
    {
    }
    template<typename P>
    static void before(T& t, const P& p)
    {
    }
    template<typename P>
    static ret call(MyClass& t, const P& p)
    {
        return MyClass::Action1::Do(t,p);
    }
};


template<typename O>
struct UnrealProxy
{
private:
    O obj;
public:
    UnrealProxy():obj(){}
    template<typename T, typename P>
    typename ProxyHlpr<O,T>::ret Do(const P& p)
    {
        ProxyHlpr<O,T>::before(obj,p);
        ProxyHlpr<O,T>::ret ret=ProxyHlpr<O,T>::call(obj,p);
        ProxyHlpr<O,T>::after(obj,p);
    }
};

...........................

//а это уже более высокий уровень

UnrealProxy<MyClass> obj;
obj.Do<MyClass::Action1>(Tuple(12,Aliased<xParam>(2)));


+ всё это можно приправить всякими рюшечками типа переопределеных операторов [],(),->, более удачных названий, генерации структур Action1 по обычным методам класса(правда перечисл. в каком-нибудь листе типов), то что делает ProxyHlpr можно разнести в разные классы, чтоб удобней специализировать было, специализировать его можно не по класу и действию, а по групе класов и действий, ну и куча других приёмчиков, которые к этому топику отношения не имеют
Re[17]: Спорно.
От: mikа Stock#
Дата: 24.01.04 13:30
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>В .NET — это механизм перехвата создания и вызова методов объектов, который можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.


...

IT>Почитай, что я выше написал, особенно выделенное.


Интересно, а причем здесь АОП? Я конечно понимаю, что тормоза, погода, красный цвет — это все у тебя к стилю программирования относиться

Ладно, ты сейчас очень хочешь уйти от темы, вернее, от той задачи которую ты поставил. Я попробую тебе этому воспрепятствовать.

И так, есть уже готовая система, в которой нужно для бизнес-объектов сделать подсчет вызовов методов. Так?

Чем тут потожет АОП? Да ничем, если изначально мы не сделали для нее фундамент из контекстов! Чисто гипотетически, мы это сделали заранее. Теперь, нам нужно лишь сделать реализацию RealProxy и все дела.

Ага. Щаз! Только вот те тормоза, которые при этом возникают, это не в счет. Конечно, зачем их учитывать, если мы программируем с использованием АОП.

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

Ладно. Теперь перейдем к метапрограмированию. Атрибуты — это хорошо. Очень хорошо. Но! Только тогда, когда они в меру и когда они реально нужны. Или для тебя Reflection ничего не значит, вернее его производительность?

Гремучая смесь из ремотинга и позднего связывания в одном потоке, по-моему это уж слишком.

IT>Ты только не путай тёплое с мягким. Наследование от CBO, для которого уже реализован RealProxy и реализация RealProxy средствами ООП это далеко не одно и тоже.


Во-первых, RealProxy в .NET реализован средствами ООП. Это к тому, кто тут путает теплое с мягким.
Во-вторых, смотри выше в моем ответе про провайдеры.
Re[18]: Спорно.
От: IT Россия linq2db.com
Дата: 24.01.04 21:21
Оценка:
Здравствуйте, mikа, Вы писали:

IT>>Почитай, что я выше написал, особенно выделенное.


M>Интересно, а причем здесь АОП? Я конечно понимаю, что тормоза, погода, красный цвет — это все у тебя к стилю программирования относиться


Чего? Видимо тебе не лишним будет перечитать не только моё, но и своё сообщение Ты хоть сам понял что написал?

M>Ладно, ты сейчас очень хочешь уйти от темы, вернее, от той задачи которую ты поставил. Я попробую тебе этому воспрепятствовать.


Мда, плохому ты быстро учишься

M>И так, есть уже готовая система, в которой нужно для бизнес-объектов сделать подсчет вызовов методов. Так?


Точно, молодец!

M>Чем тут потожет АОП? Да ничем, если изначально мы не сделали для нее фундамент из контекстов! Чисто гипотетически, мы это сделали заранее. Теперь, нам нужно лишь сделать реализацию RealProxy и все дела.


M>Ага. Щаз! Только вот те тормоза, которые при этом возникают, это не в счет. Конечно, зачем их учитывать, если мы программируем с использованием АОП.


Опять не вижу логики

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


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

N>>>хотя причём тут RealProxy до сих пор понять не могу

M>>В Нете это одна из реализаций аспектной сущности.

IT>В .NET — это механизм перехвата создания и вызова методов объектов, который можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.


Механизм TransparentProxy/RealProxy в .NET это не реализация аспектной сущности. Это такая штука, которую можно приспособить для динамической интеграции аспектов, но её основное назначение совсем другое. Сделать это можно только, если твой объект наследник CBO либо MBR + используется ремоутинг, хотя в последнем случае RealProxy тоже врядли прокатит. Потеря производительности на вызовах методов в данном случае будет весьма ощутимая, но в случае ремоутинга это не страшно, т.к. TransparentProxy всё равно создаётся для объекта, т.е. у нас просто нет выбора. Таким образом, этот механизм можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.

Теперь мысль ясна?

M>Ладно. Теперь перейдем к метапрограмированию. Атрибуты — это хорошо. Очень хорошо. Но! Только тогда, когда они в меру и когда они реально нужны. Или для тебя Reflection ничего не значит, вернее его производительность?


Если рефлекшин использовать с умом и там где это уместно, то никаких проблем с ним не возникает.

M>Гремучая смесь из ремотинга и позднего связывания в одном потоке,


Да хоть в двух потоках, какая разница? Или ты имел ввиду домены?

M>по-моему это уж слишком.


Ладно, пропустим. То что ты споришь сам с собой мы уже выяснили

IT>>Ты только не путай тёплое с мягким. Наследование от CBO, для которого уже реализован RealProxy и реализация RealProxy средствами ООП это далеко не одно и тоже.


M>Во-первых, RealProxy в .NET реализован средствами ООП. Это к тому, кто тут путает теплое с мягким.


Ну покажи мне в Роторе то место где создаётся и вызывается RealProxy средствами ООП.
Хотя, не стоит тратить время, лучше почитай матчасть, особенно про то, что такое TransparentProxy?
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: Спорно.
От: mikа Stock#
Дата: 24.01.04 21:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Теперь я понял, ты разговариваешь сам с собой и додумываешь за меня то, чего не понял. Ok, ещё раз для особо одарённых.


Всегда приятно получить "хорошую" оценку от тебя Я смотрю, ты тоже учишься. Похвально.

IT>Механизм TransparentProxy/RealProxy в .NET это не реализация аспектной сущности. Это такая штука, которую можно приспособить для динамической интеграции аспектов, но её основное назначение совсем другое. Сделать это можно только, если твой объект наследник CBO либо MBR + используется ремоутинг, хотя в последнем случае RealProxy тоже врядли прокатит. Потеря производительности на вызовах методов в данном случае будет весьма ощутимая, но в случае ремоутинга это не страшно, т.к. TransparentProxy всё равно создаётся для объекта, т.е. у нас просто нет выбора. Таким образом, этот механизм можно использовать для имплементации идей AOP, за счёт значительной потери производительности. Но в случае ремоутинга это вполне допустимо.


IT>Теперь мысль ясна?


Спасибо, что разяснил. А то я не знал. Только, скорее всего, это ты сам с собою тут общаешся.

Идем к исходной твоей задаче, подсчет вызовов.

Система в эксплуатации и вполне функционирует. Решили добавить к ней твое требование.

Твое решение: унаследовать все сущности от CBO, сделать с ними общение через ремотинг (между машинами), чтобы тормоза особо не ощущались. Это АОП.

Мое решение: внести функциональность в провайдеры, через которые идет взаимодейтствие с бизнес-сущностями. Это ООП.

IT>Если рефлекшин использовать с умом и там где это уместно, то никаких проблем с ним не возникает.


Забавно, но пока ты предлагаешь обратное

M>>Гремучая смесь из ремотинга и позднего связывания в одном потоке,


IT>Да хоть в двух потоках, какая разница? Или ты имел ввиду домены?


Я это к тому, что использовать ремотинг в кокретной задаче в пределах одного домена — расточительство.

M>>Во-первых, RealProxy в .NET реализован средствами ООП. Это к тому, кто тут путает теплое с мягким.


IT>Ну покажи мне в Роторе то место где создаётся и вызывается RealProxy средствами ООП.


Зачем же так далеко смотреть. Я тебе просто сказал, что RealProxy в Нете реализован с подходом ООП. Как тому подтверждение — это наследование его от класса System.Object. Мысли проще, зачем так все усложнять.

IT>Хотя, не стоит тратить время, лучше почитай матчасть, особенно про то, что такое TransparentProxy?


Обязательно, Игорь. Сам тебе хотел посоветовать, да вот потом решил, что рыбные места выдавать ни к чему.
Re[20]: Спорно.
От: IT Россия linq2db.com
Дата: 24.01.04 23:05
Оценка:
Здравствуйте, mikа, Вы писали:

M>Твое решение: унаследовать все сущности от CBO, сделать с ними общение через ремотинг (между машинами), чтобы тормоза особо не ощущались. Это АОП.


Слушай, я уже устал от твоей демагогии. Я никаких решений не предлагал, я смиренно жду решения от ГВ.

M>Мое решение: внести функциональность в провайдеры, через которые идет взаимодейтствие с бизнес-сущностями. Это ООП.


Давай примерчик своего провайдера. Посмотрим что к чему.

IT>>Если рефлекшин использовать с умом и там где это уместно, то никаких проблем с ним не возникает.


M>Забавно, но пока ты предлагаешь обратное


Опять демагогия? Где именно что я предлагал.

M>Я это к тому, что использовать ремотинг в кокретной задаче в пределах одного домена — расточительство.


Ну и? Ты думаешь ты сделал открытие, кто-то был против?

IT>>Ну покажи мне в Роторе то место где создаётся и вызывается RealProxy средствами ООП.


M>Зачем же так далеко смотреть. Я тебе просто сказал, что RealProxy в Нете реализован с подходом ООП. Как тому подтверждение — это наследование его от класса System.Object. Мысли проще, зачем так все усложнять.


А ты в курсе каким способом вызывается RealProxy? Может продемонстрируешь как это сделать без готовой .NET реализации?
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.01.04 23:13
Оценка:
Здравствуйте, IT, Вы писали:

IT>Слушай, я уже устал от твоей демагогии. Я никаких решений не предлагал, я смиренно жду решения от ГВ.


Лови.
Автор: Геннадий Васильев
Дата: 25.01.04
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Ответ
От: IT Россия linq2db.com
Дата: 24.01.04 23:21
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Т.е., подход состоит в:


Обычный старый дедовский способ, ничего нового

ГВ>Возможно, что в каком-то случае и на какое-то определённое время использование AspectC++ тоже будет полезным, но при прочих равных я бы предпочёл явные модификации исходного кода. Почему? Очень просто. Представим возможное развитие твоей ситуации. Появляется ещё 10 методов, которые логгировать не нужно. Что нужно сделать? По идее — модифицировать описание композиционного фильтра, но важно не забыть об этом. А в пиковом случае композиционный фильтр будет содержать перечисление всех методов, на которые навешиваются дополнительные аспекты, т.е., задача будет по сложности практически равна простой вставке строк в функции... Вопрос в том, что это за строки.


А если я забуду воткнуть твои строки в вызываемые методы? А если мне захочется добавить ещё немножко аспектов? А вдруг заказчик одумается и решит отключить всё это нафиг? Каждый раз контекстный поиск замена?

ГВ>Поэтому, точно так же я бы поступил, даже если бы вызовов COM_CALL_TRACE(...) изначально не было расставлено: в конце концов, даже 500 очень простых модификаций пусть и бестолковая по характеру, но в данном случае — одноразовая работа. Её несложно автоматизировать макросами VS а результаты очень пригодятся в будущем.


Да здравствует Copy/Paste — самая продвинутая технология индусов и китайцев

ГВ>Так что, на мой взгляд, подход "с декомпозицией" будет не хуже аспектного, поскольку необходимые изменения функций сосредоточатся в самих функциях, а не расползутся неизвестно где (почему, кстати, у меня АОП и вызывает пока неоднозначное впечатление).


Подход copy/pas... простите, "с декомпозицией" как я понимаю, это и есть твоя главная идея. Понял.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.01.04 23:30
Оценка:
Здравствуйте, IT, Вы писали:

ГВ>>Т.е., подход состоит в:

IT>Обычный старый дедовский способ, ничего нового

Угу, ничто не ново под Луной.

IT>А если я забуду воткнуть твои строки в вызываемые методы? А если мне захочется добавить ещё немножко аспектов? А вдруг заказчик одумается и решит отключить всё это нафиг? Каждый раз контекстный поиск замена?


А ты подумай, какие именно строки надо воткнуть и что поставить за этими строками, чтобы потом к ним не возвращаться.

ГВ>>Поэтому, точно так же я бы поступил, даже если бы вызовов COM_CALL_TRACE(...) изначально не было расставлено: в конце концов, даже 500 очень простых модификаций пусть и бестолковая по характеру, но в данном случае — одноразовая работа. Её несложно автоматизировать макросами VS а результаты очень пригодятся в будущем.

IT>Да здравствует Copy/Paste — самая продвинутая технология индусов и китайцев

А где ты там copy/paste в его страшной ипостаси увидел? Я не фрагменты кода копирую, а всего-то дублирую сигнатуру вызова. Собственно, COM_CALL_TRACE_TMDEF(...) можно и не вводить. Хватит и разумно применённых частичных специализаций в реализации COM_CALL_TRACE(...).

ГВ>>Так что, на мой взгляд, подход "с декомпозицией" будет не хуже аспектного, поскольку необходимые изменения функций сосредоточатся в самих функциях, а не расползутся неизвестно где (почему, кстати, у меня АОП и вызывает пока неоднозначное впечатление).

IT>Подход copy/pas... простите, "с декомпозицией" как я понимаю, это и есть твоя главная идея. Понял.

Ну, как уж понял — так уж и понял.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: Спорно.
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.01.04 23:34
Оценка:
Здравствуйте, beretta, Вы писали:

ГВ>>Очень забавно — я тебе о том, что прежде чем куда-то ехать, нужно разобраться с картами, а ты предлагаешь лететь по пачке беломора и преодолевать препятствия. Ну что ж, давай поупражняемся.

B>Стоит? Имхо это мат в 2 хода.
"А точка усмехнулась и стала запятой" (c).

B>У меня несколько иное представление к реализации нежели АОП, но раз разговор о признании самой проблематики. То я бы ответил словами классика о том, что нельзя объять необъятное. Проектирование вещь мощная и полезная, но имеет свой предел, обусловленный знанием (по специальности, предметной области) на текущий момент.

Именно поэтому всегда нужно думать хоть на полшага вперёд и анализировать максимум доступной информации.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Ответ
От: IT Россия linq2db.com
Дата: 24.01.04 23:55
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>А если я забуду воткнуть твои строки в вызываемые методы? А если мне захочется добавить ещё немножко аспектов? А вдруг заказчик одумается и решит отключить всё это нафиг? Каждый раз контекстный поиск замена?


ГВ>А ты подумай, какие именно строки надо воткнуть и что поставить за этими строками, чтобы потом к ним не возвращаться.


Да хоть думай, хоть не думай, мантейнить это всё кому-то придётся.

ГВ>Ну, как уж понял — так уж и понял.


Как объяснил, так и понял
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.01.04 00:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>А если я забуду воткнуть твои строки в вызываемые методы? А если мне захочется добавить ещё немножко аспектов? А вдруг заказчик одумается и решит отключить всё это нафиг? Каждый раз контекстный поиск замена?

ГВ>>А ты подумай, какие именно строки надо воткнуть и что поставить за этими строками, чтобы потом к ним не возвращаться.
IT>Да хоть думай, хоть не думай, мантейнить это всё кому-то придётся.
Ровно как и в случае использования АОП-компилятора.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.01.04 00:46
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Да хоть думай, хоть не думай, мантейнить это всё кому-то придётся.

ГВ>>Ровно как и в случае использования АОП-компилятора.

IT>Не совсем. Классы бизнес логики трогать не надо будет. Этим вообще могут заниматься разные люди и песнях про большие проекты даже разные подразделения.


Ну... не сказал бы, что я предлагаю такие уж сильные изменения в БЛ-классах. Зацепили framework — и поехали. Дальше всё равно по месту смотреть надо, у обоих стратегий есть свои плюсы и минусы.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: Ответ
От: IT Россия linq2db.com
Дата: 25.01.04 01:00
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

IT>>Не совсем. Классы бизнес логики трогать не надо будет. Этим вообще могут заниматься разные люди и песнях про большие проекты даже разные подразделения.


ГВ>Ну... не сказал бы, что я предлагаю такие уж сильные изменения в БЛ-классах.


Небольшие изменения тут, небольшие там и вот перед нами каша из логики и вспомогательного кода.

ГВ>Зацепили framework — и поехали.


Приципили из BL кода?

ГВ>Дальше всё равно по месту смотреть надо, у обоих стратегий есть свои плюсы и минусы.


О! Прогресс на лицо
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: Спорно.
От: naje  
Дата: 25.01.04 12:39
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, naje, Вы писали:


N>>+ всё это можно приправить всякими рюшечками типа переопределеных операторов [],(),->, более удачных названий, генерации структур Action1 по обычным методам класса(правда перечисл. в каком-нибудь листе типов), то что делает ProxyHlpr можно разнести в разные классы, чтоб удобней специализировать было, специализировать его можно не по класу и действию, а по групе класов и действий, ну и куча других приёмчиков, которые к этому топику отношения не имеют


IT>Понятно. Реализуем паттерн Proxy. В общем, до простоты AOP тут как на четвереньках до Парижа. Особенно мне понравился вызов метода:


IT>
IT>obj.Do<MyClass::Action1>(Tuple(12,Aliased<xParam>(2)));
IT>


IT>Очень наглядно. Хотя, конечно, в качестве job security очень даже ничего


вобще по поводу патернов то кроме прокси там ещё темплейт метод есть, но вобще я не патерны хотел показать
вобще по поводу наглядности я там написал что рюшечек всяких можно подобавлять
конечно будет непривычно, но не ненаглядно
тем более этот премер я просто атфанаря написал, а ты как всегда к мелачам цепляешься

ты лучше ответь на такой вопрос, что если этот заказчик из твоего вопроса захочет не мониторинг добавить, а производительность неимоверную, и/или чтоб програмка вместе с операционкой помещалась на флэшку 8 МБ (такой запрос более реальный чем просьбя о мониторинге), а у тебя всё с испольлванием RealProxy уже написано
что делать?
Re[8]: Ответ
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.01.04 15:42
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Не совсем. Классы бизнес логики трогать не надо будет. Этим вообще могут заниматься разные люди и песнях про большие проекты даже разные подразделения.

ГВ>>Ну... не сказал бы, что я предлагаю такие уж сильные изменения в БЛ-классах.
IT>Небольшие изменения тут, небольшие там и вот перед нами каша из логики и вспомогательного кода.
Ну, Игорь, это уже отдаёт пионерством: "эта дорога неверна, мы срочно побежим другой". А чтобы не было каши надо чаще думать, чем работать. Помогает, проверено.

А если без ёрничанья, то перспектива получения каши если не из БЛ+вспомогатльный код, то уж внутри вспомогательного кода или внутри самой БЛ — по любому остаётся.

ГВ>>Зацепили framework — и поехали.

IT>Приципили из BL кода?
Угу, а он всегда с каким-нить окружением связан.

ГВ>>Дальше всё равно по месту смотреть надо, у обоих стратегий есть свои плюсы и минусы.

IT>О! Прогресс на лицо
Ты меня обнадёживаешь.
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[11]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.01.04 18:06
Оценка:
Здравствуйте, mikа, Вы писали:

AVK>>В MBR (и CBO который ничем от MBR, кроме механики инициации не отличается) рефлекшен не используется. TransparentProxy это и есть то о чем ты говоришь, только реализованое прямо в JIT, т.е. не требующее компиляции вобще, а значит заведомо более быстрое чем то что ты предлагаешь.


M>Ты знаешь, я никак не могу понять, причем тут TP.


Потому что именно ТР обеспечивает тот функционал, который необходим в АОП. Все остальное это уже инфраструктура ремоутинга, для АОП не нужная.

M> Если вы реализуете класс от CBO и он передается между машинами, то это понятно, что скорость TP тут ничего не меняет, так как эта скорость выполнения какается только клиентской машины. Если же этот объект начинает использоваться внутри того домена, где он создан (а сервер скорее всего вызывает методы этого объекта, ибо не просто так же он получает), то скорость TP тут опять не играет. Вся тягость ложится на плечи того, что следует за TP (форматеры, синки, терминаторы и т.д.).


Все верно, об этом я и писал. Проблема в том что все эти потроха АОП не нужны, а отцепить их от ТР не так то просто (точнее просто, но про автоматическую инициацию придеться забыть).

AVK>>Тормоза ремоутинга не из-за тормозных проксей, а из за цепочки синков — и формирователи сообщений, и форматтеры и транспортные синки это очень небыстрая операция, поскольку, как правильно заметил IT, механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.


M>Именно для перехвата вызовов она и предназначена.


Вот это новость. Я всегда считал что ремоутинг нужен для передачи объектных сообщений через канал.


AVK>>Потому и получается что при вызове через контекст происходит море лишних действий, в том числе и с использованием рефлекшена (для работы форматтера и запуска сообщения).


M>Ну, не только для форматера. Методы объекта, мне кажется, тоже вызываются через Reflection.


Обрати внимание на выделенное. Это я об RemotingServices.ExecuteMessage().


V>>>Предложенная задача — неожиданная потребность начать мониторинг вообще всех вызовов — явно из разряда особенных (надуманных).


AVK>>Эта задача очень часто встречается на практике. Вот буквально неделю назад такая задачка стояла.


M>Вообще всех? Ты уверен?


Разумеется не вобще всех, а определенной категории.

M> Даже внутренние вызова внешних объектов?


Это да, это как раз и было нужно.

M> ИМХО, CBO только ухудшит картину.


А кто сказал что использовался СВО?
... << RSDN@Home 1.1.3 beta 1 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[12]: Ответ
От: mikа Stock#
Дата: 25.01.04 18:39
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Потому что именно ТР обеспечивает тот функционал, который необходим в АОП. Все остальное это уже инфраструктура ремоутинга, для АОП не нужная.


Почему же. ТР помогает только стартовать ремотингу свои АОП-видную инфраструктуру. В С++ нет ТР. Это ведь не значит, что там не может быть АОП.

AVK>Все верно, об этом я и писал. Проблема в том что все эти потроха АОП не нужны, а отцепить их от ТР не так то просто (точнее просто, но про автоматическую инициацию придеться забыть).


Если CAO — то да, а если SAO, то можно что-нибудь сделать с Activator.

AVK>>>Тормоза ремоутинга не из-за тормозных проксей, а из за цепочки синков — и формирователи сообщений, и форматтеры и транспортные синки это очень небыстрая операция, поскольку, как правильно заметил IT, механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.


M>>Именно для перехвата вызовов она и предназначена.


AVK>Вот это новость. Я всегда считал что ремоутинг нужен для передачи объектных сообщений через канал.


механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.

Это ты написал? Согласить, высказывание

ремоутинг нужен для передачи объектных сообщений через канал

идет перпендикулярно.

AVK>>>Потому и получается что при вызове через контекст происходит море лишних действий, в том числе и с использованием рефлекшена (для работы форматтера и запуска сообщения).


M>>Ну, не только для форматера. Методы объекта, мне кажется, тоже вызываются через Reflection.


AVK>Обрати внимание на выделенное. Это я об RemotingServices.ExecuteMessage().


Ага. А я дополнил. Нам ведь нужно еще и запустить метод объекта.

M>>Вообще всех? Ты уверен?


AVK>Разумеется не вобще всех, а определенной категории.


Сужаем круг требований. Так глядишь дойдем до того, что это можно было бы предвидеть на этапе проектирования

M>> Даже внутренние вызова внешних объектов?


AVK>Это да, это как раз и было нужно.


Хм. А причем тут тот ремотинг, про который говорил ИТ (ремотинг тут идет в двух ипостясиях: локальный и сетевой). ИТ говорил, что тормоза передачи по сети съедят всю тормознутость, которая получиться от TP + RP. И это правда. А теперь получается, что совсем наоборот. Ничего не будет компенсировать тормоза.

AVK>А кто сказал что использовался СВО?


Транспортная часть (агенты, форматеры, провайдеры, ченелы)? Кстати, это не

внутренние вызова внешних объектов

Может мы по разному понимает фразу "внутренние вызова"?
Re[13]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.01.04 20:20
Оценка:
Здравствуйте, mikа, Вы писали:

M>Почему же. ТР помогает только стартовать ремотингу свои АОП-видную инфраструктуру.


Так то ремоутинг, а мы ведь о чистом АОП говорим. А ему ничего, окромя сладкой парочки TP/RP не нужно. В принципе они вполне живут без остального, но для получения ТР нужно явно сказать RP GetTransparentProxy, а это не есть гуд. Автоматическую же инициацию без врубания ремоутинга целиком сделать не получится.

M> В С++ нет ТР. Это ведь не значит, что там не может быть АОП.


Может, но либо фиговое, либо путем изменения языка (обычно это реализуется препроцессором специальным).

M>Если CAO — то да, а если SAO, то можно что-нибудь сделать с Activator.


Пофигу. Даже СВО все равно подымают и ченел и форматтер. Можно воткнуться до форматтерного синка в ченел и тем самым обойти форматтер, но все равно производительность будет не ахти. Можно еще в мессадж синке вобще до ченнела не допускать, но имхо это уже какой то изврат.

AVK>>Вот это новость. Я всегда считал что ремоутинг нужен для передачи объектных сообщений через канал.


M>

M>механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.

M>Это ты написал?

Я написал.

M> Согласить, высказывание

M>

M>ремоутинг нужен для передачи объектных сообщений через канал

M>идет перпендикулярно.

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

AVK>>Обрати внимание на выделенное. Это я об RemotingServices.ExecuteMessage().


M>Ага. А я дополнил. Нам ведь нужно еще и запустить метод объекта.


Блин, Мика, почитай что такое ExecuteMessage и что он делает

AVK>>Разумеется не вобще всех, а определенной категории.


M>Сужаем круг требований. Так глядишь дойдем до того, что это можно было бы предвидеть на этапе проектирования


Нет, не сойдемся. Невозможно предвидеть все возможные требования, на эту тему я даже спорить не буду.

AVK>>Это да, это как раз и было нужно.


M>Хм. А причем тут тот ремотинг, про который говорил ИТ (ремотинг тут идет в двух ипостясиях: локальный и сетевой). ИТ говорил, что тормоза передачи по сети съедят всю тормознутость, которая получиться от TP + RP. И это правда. А теперь получается, что совсем наоборот. Ничего не будет компенсировать тормоза.


При работе ремоутинга будет. При работе АОП нет, поскольку ремоутинг там не нужен и весь оверхед ляжет тяжким грузом на приложение. Т.е. в итоге механика дотнета позволяет строить АО-решения эффективными только для удаленных вызовов.

AVK>>А кто сказал что использовался СВО?


M>Транспортная часть (агенты, форматеры, провайдеры, ченелы)?


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

M>

M>внутренние вызова внешних объектов

M>Может мы по разному понимает фразу "внутренние вызова"?

Тебе виднее, ты термин придумал.
... << RSDN@Home 1.1.3 beta 1 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[20]: Спорно.
От: IT Россия linq2db.com
Дата: 25.01.04 22:58
Оценка:
Здравствуйте, naje, Вы писали:

N>тем более этот премер я просто атфанаря написал, а ты как всегда к мелачам цепляешься


Разве это мелочи? Во-первых, твой дизайн заставляет разработчика явно вызывать объект через прокси, это ни ясности кода не добавляет, ни защищает от ошибок. Во-вторых, ты посмотри как ты надругался над основами ООП в бизнес классе. Это же больше не ООП, ни инкапсуляции, ни наследования, ни полиморфизма

N>ты лучше ответь на такой вопрос, что если этот заказчик из твоего вопроса захочет не мониторинг добавить, а производительность неимоверную, и/или чтоб програмка вместе с операционкой помещалась на флэшку 8 МБ (такой запрос более реальный чем просьбя о мониторинге), а у тебя всё с испольлванием RealProxy уже написано

N>что делать?

Хороший вопрос между прочим. В случае поддержки AOP самим компилятором, как ты понимаешь, никаких проблем не будет. В случае RealProxy, которую, прошу ещё раз заметить, я не предлагал как панацею, имеем тормоза. Соответственно, придётся извращаться либо предложенным тобой способом, либо как предлагает ГВ.
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Ответ
От: mikа Stock#
Дата: 26.01.04 10:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>Кстати. О фабриках и синглетонах в .NET. AOP в действии


Я бы сказал в бездействии.

IT>

........

IT>class Test
IT>{
IT>    static void Main()
IT>    {
IT>        MyClass mc = new MyClass();

IT>        Console.WriteLine(mc.GetType().Name);
IT>    }
IT>}
IT>


IT>Работает шо железная железяка. TP/RP не создаются, так что с быстродейсвием проблем нет . Все 3 приведённые мной выше пункта при определённой сноровке легко устраняются.


Не создаеться? А что выведет вот эта строчка?

Console.WriteLine(System.Runtime.Remoting.RemotingServices.IsTransparentProxy(mc));


Вообщем ты не прав. Но даже не в этом, а том, что без связки TP/RP у тебя практически не будет АОП.

IT>Правда появляются другие проблемы


Игорь, давай так. В игру угадайка лучше не стоит играть. Тем более, что люди предлагают тебе решение на C++, что значит не знают, как может работать Remoting на Нете.


IT>Синглетон делается аналогично.


Вот только синглетон то и делаеться такими способами. И более ничего.
Re[10]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 26.01.04 10:16
Оценка:
Здравствуйте, IT, Вы писали:

IT>
IT>using System;
IT>using System.Runtime.Remoting.Proxies;

IT>[AttributeUsage(AttributeTargets.Class)]
IT>public class MyClassFactoryAttribute : ProxyAttribute
IT>{
IT>    public override MarshalByRefObject CreateInstance(Type type)
IT>    {
IT>        return base.CreateInstance(typeof(MyRealClass));
IT>    }
IT>}

IT>[MyClassFactory]
IT>public class MyClass : ContextBoundObject
IT>{
IT>}

IT>class MyRealClass : MyClass
IT>{
IT>}

IT>class Test
IT>{
IT>    static void Main()
IT>    {
IT>        MyClass mc = new MyClass();

IT>        Console.WriteLine(mc.GetType().Name);
IT>    }
IT>}
IT>


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


struct MyClassBase
{

};

typedef    MyClassBase    MyClass;

int main(...)
{
    MyClass* mc= new MyClass();
}


Завтра я меняю всего несколько строк:


template<typename Base>
struct    MyRealClass: public    Base
{

};

typedef    MyRealClass<MyClassBase>    MyClass;

int main(...)
{
    MyClass* mc= new MyClass();
}


Ну а завтра мне еще и это нужно навесить:


template<typename Base>
struct    MyRealClassWithAdittionalStrategy : public Base
{

};

typedef    MyRealClassWithAdditionalStrategy<MyRealClass<MyClassBase> >     MyClass;

int main(...)
{
    MyClass* mc= new MyClass();
}


И обошлись без ContextBoundObject... Может я ошибаюсь, но преимущества АОП в .Net в том, что я могу обувать свои типы в атрибуты динамически, на этапе выполнения? Нужно ли это на этапе выполнения, это уже другой вопрос
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[14]: Ответ
От: mikа Stock#
Дата: 26.01.04 10:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

M>>Почему же. ТР помогает только стартовать ремотингу свои АОП-видную инфраструктуру.


AVK>Так то ремоутинг, а мы ведь о чистом АОП говорим.


А почему ты думаешь, что чистый АОП должен обязательно ассоциироваться с Нетовскими понятиями. Или у нас Нет уже панацея?

AVK>А ему ничего, окромя сладкой парочки TP/RP не нужно.


Ну вот тут приводили различные паттерны, которые обходятся без эти двух.

M>> В С++ нет ТР. Это ведь не значит, что там не может быть АОП.


AVK>Может, но либо фиговое, либо путем изменения языка (обычно это реализуется препроцессором специальным).


Это так на Нете реализовано. Не стоит думать, что оно везде так.

M>>Если CAO — то да, а если SAO, то можно что-нибудь сделать с Activator.


M>> Согласить, высказывание

M>>

M>>ремоутинг нужен для передачи объектных сообщений через канал

M>>идет перпендикулярно.

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


Ты писал

механика проксей предназначена не для перехвата вызовов, а для работы ремоутинга.


Я ответил

Именно для перехвата вызовов она и предназначена.


Я утверждаю, что механика проксей предназначена для перехвата вызовов.

AVK>Блин, Мика, почитай что такое ExecuteMessage и что он делает


Сорри. Что то я не усмотрел, что ты там написал про вызов метода объекта.

M>>Сужаем круг требований. Так глядишь дойдем до того, что это можно было бы предвидеть на этапе проектирования


AVK>Нет, не сойдемся. Невозможно предвидеть все возможные требования, на эту тему я даже спорить не буду.


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

AVK>>>Это да, это как раз и было нужно.


AVK>Т.е. в итоге механика дотнета позволяет строить АО-решения эффективными только для удаленных вызовов.


Именно. Но давай еще раз по порядку. Клиент передал серверу объект CBO. Сервер должен вызвать по крайней мере один из методов этого объекта (хотя бы транспортная инфраструктура это делает). Получается, что никакого удаленного вызова и не будет.

AVK>Это не имело отношения к той задачке о которой речь.


Да я про твою уже спросил.

AVK>Та задачка была решена написанием банальных проксей, но это не значит что это лучшее решение, просто использовать ремоутинг для трассировки внутрипроцессных вызовов не лучшее решение.


Ага. Наконец-то, сказал то, что я Игорю вдалбливаю уже 10 топиков назад.
Re[15]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.01.04 12:00
Оценка:
Здравствуйте, mikа, Вы писали:

AVK>>Так то ремоутинг, а мы ведь о чистом АОП говорим.


M>А почему ты думаешь, что чистый АОП должен обязательно ассоциироваться с Нетовскими понятиями.


А почему ты думаешь что я так думаю? Я так не думаю. Просто без написания препроцессора единственная разумная возможность АОП это TP/RP.

M>Ну вот тут приводили различные паттерны, которые обходятся без эти двух.


Насколько я помню изначально я говорил об особенностях реализации АОП в дотнете.

M>>> В С++ нет ТР. Это ведь не значит, что там не может быть АОП.


AVK>>Может, но либо фиговое, либо путем изменения языка (обычно это реализуется препроцессором специальным).


M>Это так на Нете реализовано.


Нет, на нете реализовано фиговое. Через препроцессор это уже R# .

M>Не стоит думать, что оно везде так.


Ну хорошо, как ты реализуешь честный АОП на С++ без препроцессора?

M>>>Сужаем круг требований. Так глядишь дойдем до того, что это можно было бы предвидеть на этапе проектирования


AVK>>Нет, не сойдемся. Невозможно предвидеть все возможные требования, на эту тему я даже спорить не буду.


M>А я это и не утверджаю. Я говорю, что чем меньше требований, тем лучше мы их продумает на начальном этапе. Отсюда повышается вероятность того, что мы сможет продумать последующие модорнизации системы.


Повышается, но не до 100% и даже не до 10%, как показывает практика. АОП позволяет в случае обнаружения непредусмотренного обойтись значительно меньшей кровью.

AVK>>Т.е. в итоге механика дотнета позволяет строить АО-решения эффективными только для удаленных вызовов.


M>Именно. Но давай еще раз по порядку. Клиент передал серверу объект CBO. Сервер должен вызвать по крайней мере один из методов этого объекта (хотя бы транспортная инфраструктура это делает). Получается, что никакого удаленного вызова и не будет.


Но вся цепочка форматтеров и транспортных синков отработает по полной. Вот в этом и задница.

AVK>>Та задачка была решена написанием банальных проксей, но это не значит что это лучшее решение, просто использовать ремоутинг для трассировки внутрипроцессных вызовов не лучшее решение.


M>Ага. Наконец-то, сказал то, что я Игорю вдалбливаю уже 10 топиков назад.


Дык Игорь то не об АОП на основе TP/RP говорит, а об нормальном АОП. Вот нормальный АОП очень даже прокатил бы.
... << RSDN@Home 1.1.3 beta 1 >>
AVK Blog
Re[16]: Ответ
От: mikа Stock#
Дата: 26.01.04 12:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

M>>Это так на Нете реализовано.


AVK>Нет, на нете реализовано фиговое. Через препроцессор это уже R# .


Только вот он не реализован

M>>Не стоит думать, что оно везде так.


AVK>Ну хорошо, как ты реализуешь честный АОП на С++ без препроцессора?


А зачем там реализовывать? Там уже все есть, только без препроцессинга. Взять бы хотя бы COM+. Если чисты СОМ, то смотреть ICallFrame, ICallInterceptor, IPolicyMaker, CoGetInterceptor.

M>>Именно. Но давай еще раз по порядку. Клиент передал серверу объект CBO. Сервер должен вызвать по крайней мере один из методов этого объекта (хотя бы транспортная инфраструктура это делает). Получается, что никакого удаленного вызова и не будет.


AVK>Но вся цепочка форматтеров и транспортных синков отработает по полной. Вот в этом и задница.


Вряд ли форматеты и провайдеры тут отработают. Скорее всего только те синки, которые кроссконтекстное общение осуществляют.

AVK>Дык Игорь то не об АОП на основе TP/RP говорит, а об нормальном АОП. Вот нормальный АОП очень даже прокатил бы.


Игорь, в своем первом сообщении упомянул RealProxy. Так что ни о каком чистом АОП и речи не шло. Это я его продвигаю, так как на С++ проксей не сущесвует.
Re[17]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.01.04 12:50
Оценка:
Здравствуйте, mikа, Вы писали:

M>А зачем там реализовывать? Там уже все есть, только без препроцессинга.


В С++?

M>Взять бы хотя бы COM+.


Это не С++, это конкретная ОО-технология. Думаю не надо объяснять что он везде применим.

M>Если чисты СОМ, то смотреть ICallFrame, ICallInterceptor, IPolicyMaker, CoGetInterceptor.


Это все равно не С++.

M>>>Именно. Но давай еще раз по порядку. Клиент передал серверу объект CBO. Сервер должен вызвать по крайней мере один из методов этого объекта (хотя бы транспортная инфраструктура это делает). Получается, что никакого удаленного вызова и не будет.

AVK>>Но вся цепочка форматтеров и транспортных синков отработает по полной. Вот в этом и задница.

M>Вряд ли форматеты и провайдеры тут отработают. Скорее всего только те синки, которые кроссконтекстное общение осуществляют.


Отработают, не сомневайся. Думаешь для чего нужен CrossContextChannel?
... << RSDN@Home 1.1.3 beta 1 >>
AVK Blog
Re[11]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 13:03
Оценка:
Здравствуйте, mikа, Вы писали:

M>А чтобы создать без ТР нужно использовать посмотри исправлени в коде.


M>Кстати, код работоспособен. Только ужасно тормознутый


А блин, точно. Опять quick solution.
Что-то я видел на эту тему, правда давно это было, надо будет опять в Роторе покопаться.
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.01.04 13:34
Оценка:
Здравствуйте, mikа, Вы писали:

M>Здравствуйте, AndrewVK, Вы писали:


M>Думаю, вот для этого

M>
M>CrossContextChannel.SyncProcessMessage(message)
M>{
M>  Identity serverIdentity = InternalSink.GetServerIdentity(message);
M>  Context context = serverIdentity.ServerContext;

M>  ContextTransitionFrame frame = new ContextTransitionFrame();

M>  Thread.CurrentThread.EnterContext(сontext, ref frame);
M>  сontext.GetServerContextChain().SyncProcessMessage(message);
M>  Thread.CurrentThread.ReturnToContext(ref frame);
M>}
M>


M>Тоесть, ничего кроме как для переключения контекстов он не нужен.


См. выделенное.
... << RSDN@Home 1.1.3 beta 2 >>
AVK Blog
Re[20]: Ответ
От: mikа Stock#
Дата: 26.01.04 14:03
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, mikа, Вы писали:


M>>Здравствуйте, AndrewVK, Вы писали:


M>>Думаю, вот для этого

M>>
M>>CrossContextChannel.SyncProcessMessage(message)
M>>{
M>>  Identity serverIdentity = InternalSink.GetServerIdentity(message);
M>>  Context context = serverIdentity.ServerContext;

M>>  ContextTransitionFrame frame = new ContextTransitionFrame();

M>>  Thread.CurrentThread.EnterContext(сontext, ref frame);
AVK>M>  сontext.GetServerContextChain().SyncProcessMessage(message);
M>>  Thread.CurrentThread.ReturnToContext(ref frame);
M>>}
M>>


M>>Тоесть, ничего кроме как для переключения контекстов он не нужен.


AVK>См. выделенное.


И что? Неверим наслово?


Context.GetServerContextChain()
{
  return new ServerContextTerminatorSink();
}

ServerContextTerminatorSink.SyncProcessMessage(message)
{
  IMessageSink sink = InternalSink.GetServerIdentity(message).GetServerObjectChain(out obj);
  return sink.SyncProcessMessage(message);
}

ServerIdentity.GetServerObjectChain()
{
  IMessageSink sink = new ServerObjectTerminatorSink(serverObj);
}

ServerObjectTerminatorSink.SyncProcessMessage
{
      IMessage iMessage2;

      IMessage iMessage1 = InternalSink.ValidateMessage(msg);
      if (iMessage1 != null)
      {
        return iMessage1;
      }
      IMethodCallMessage iMethodCallMessage = msg is IMethodCallMessage;
      LogicalCallContext logicalCallContext1 = null;
      bool flag = false;
      try
      {
        object local1 = _server;
        VerifyIsOkToCallMethod(local1, iMethodCallMessage);
        LogicalCallContext logicalCallContext2 = null;
        if (iMethodCallMessage != null)
        {
          logicalCallContext2 = iMethodCallMessage.LogicalCallContext;
        }
        else
        {
          logicalCallContext2 = (LogicalCallContext)msg.Properties["__CallContext"];
        }
        logicalCallContext1 = CallContext.SetLogicalCallContext(logicalCallContext2);
        flag = true;
        logicalCallContext2.PropagateIncomingHeadersToCallContext(msg);
        PreserveThreadPrincipalIfNecessary(logicalCallContext2, logicalCallContext1);
        if (IsOKToStackBlt(iMethodCallMessage, local1) && ((Message)iMethodCallMessage).Dispatch(local1, fExecuteInContext))
        {
          iMessage2 = new StackBasedReturnMessage();
          ((StackBasedReturnMessage)iMessage2).InitFields((Message)iMethodCallMessage);
          LogicalCallContext logicalCallContext3 = CallContext.GetLogicalCallContext();
          logicalCallContext3.PropagateOutgoingHeadersToMessage(iMessage2);
          ((StackBasedReturnMessage)iMessage2).SetLogicalCallContext(logicalCallContext3);
        }
        else
        {
          MethodBase methodBase = GetMethodBase(iMethodCallMessage);
          object[] locals1 = null;
          object local2 = null;
          RemotingMethodCachedData remotingMethodCachedData = InternalRemotingServices.GetReflectionCachedData(methodBase);
          object[] locals2 = Message.CoerceArgs(iMethodCallMessage, remotingMethodCachedData.Parameters);
          local2 = PrivateProcessMessage(methodBase, locals2, local1, methodPtr, fExecuteInContext, out locals1);
          CopyNonByrefOutArgsFromOriginalArgs(remotingMethodCachedData, locals2, ref locals1);
          LogicalCallContext logicalCallContext4 = CallContext.GetLogicalCallContext();
          iMessage2 = new ReturnMessage(local2, locals1, (locals1 != null) ? (int)locals1.Length : 0, logicalCallContext4, iMethodCallMessage);
          logicalCallContext4.PropagateOutgoingHeadersToMessage(iMessage2);
        }
        CallContext.SetLogicalCallContext(logicalCallContext1);
      }
      catch (Exception e)
      {
        iMessage2 = new ReturnMessage(e, iMethodCallMessage);
        ((ReturnMessage)iMessage2).SetLogicalCallContext(iMethodCallMessage.LogicalCallContext);
        if (flag)
        {
          CallContext.SetLogicalCallContext(logicalCallContext1);
        }
      }
      return iMessage2;
}


Вообщем, это в статье все есть у Тимофея. Как видишь, нигде нет сериализации
Re[12]: Ответ
От: mikа Stock#
Дата: 26.01.04 14:05
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, mikа, Вы писали:


M>>А чтобы создать без ТР нужно использовать посмотри исправлени в коде.


M>>Кстати, код работоспособен. Только ужасно тормознутый


IT>А блин, точно. Опять quick solution.


"Поспешишь — людей насмешишь". Русский поговорки забыл?

IT>Что-то я видел на эту тему, правда давно это было, надо будет опять в Роторе покопаться.


Что именно, как без TP? Дык я же привел
Re[12]: Ответ
От: mikа Stock#
Дата: 26.01.04 14:10
Оценка:
Здравствуйте, IT, Вы писали:

IT>AOP в .NET находится в зачаточном состоянии. И хотя мне тут некоторые пытаются приписать популяризацию имплементации AOP в .NET с помощью RealProxy, это не так. Настоящий AOP без проддержки компилятором или хотя бы препроцессором не возможен. Ни на C#, ни на C++. Иначе мы бы его все уже давным давно успешно использовали. Всё что здесь предлагается — это использование тех или иных паттернов, что само по себе не плохо, но вовсе не является AOP.


Более того, АОП на Нете, основанный на контекстам ужасно глюченный. Как тому пример, куча вопросов, "как перехватить вызов из одного и того же контекста, или разные контексты". Контексты кажутся такими пушыстями только тогда, когда ты ими не занимаешься вплотную. Как только дело до практики, все оказывается не все так гладко...

Так что, вердикт таков. Берем банду, учим паттерны, проектируем
Re[12]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 26.01.04 14:16
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Batiskaf, Вы писали:


B>>Идеей твоей Игорь, я честно сказать не пронялся, в плюсах есть точно такие же декларативные средства, что ты тут показываешь.


IT>Так мне никто не мешает вызывать MyClassBase напрямую без typedef. В этом вся проблема

IT>Тогда уж лучше абстрактные классы vdimas.

Согласен, но это уже вопрос воспитания. Кому то проще наследоваться от ContextBoundObject и заколачивать в него гвоздями все необходимые атрибуты, я же предпочитаю оформить инклюд файл, в котором находятся одни typedef's, с комментариями и рекомендациями как это все использовать, тем более что документировать приходится как мне так и тебе в одинаковой мере. Внешне все выглядит по разному, но результат все тот же

B>>И обошлись без ContextBoundObject... Может я ошибаюсь, но преимущества АОП в .Net в том, что я могу обувать свои типы в атрибуты динамически, на этапе выполнения? Нужно ли это на этапе выполнения, это уже другой вопрос


IT>AOP в .NET находится в зачаточном состоянии. И хотя мне тут некоторые пытаются приписать популяризацию имплементации AOP в .NET с помощью RealProxy, это не так. Настоящий AOP без проддержки компилятором или хотя бы препроцессором не возможен. Ни на C#, ни на C++. Иначе мы бы его все уже давным давно успешно использовали. Всё что здесь предлагается — это использование тех или иных паттернов, что само по себе не плохо, но вовсе не является AOP.

Еще несколько лет назад я бы кинулся в драку защищать свой любимый С++, но со временем эта категоричность проходит, думаю у тебя тоже это случится, тридцатка уже стукнула или еще нет?
Вобщем какое может быть отношение неискушенных программеров к АОП идеологии? На мой взгляд тут нет места сопоставлениям, AOP vs. OOP и так далее. Это две разные парадигмы, которые друг друга дополняют, но не заменяют. Базовый ООП является незаменимой частью дизайна архитектуры, интерфейсы и виртуальные методы сегодня еще никто не отменил. Вместе с этим, в современном программинге нечего делать без продвинутых средств реализации, каковыми и является к примеру АОП. То есть эти средства помогают более простыми и экономичными способами имплементировать все тот же правильный дизайн, ведь выделение сквозной функциональности в одном месте это в первую очередь правильный дизайн, АОП предлагает лишь более простой метод придерживаться этого дизайна. В С++ таким средством являются шаблоны, вот одна из последних тем на это счет, многое было сказано в этом топике и не хочется повторяться: http://www.rsdn.ru/Forum/Message.aspx?mid=516933
Автор: AndrewJD
Дата: 23.01.04
. Никто же не решится экспортировать море темплейт классов в клиентский код, равно как в случае с аспектами, пользователю твоей компоненты нет необходимости импортировать определения всех аспектных атрибутов, его интересует бинарный протокол взаимодействия с компонентой, то есть какой то конечный тип, возможно даже скрытый за фабрикой. В случае же если он решил наследоваться, что бы переопределять некоторую функциональность, то это уже не совсем клиентский код, по этому ему прийдется подключить все атрибуты или составные темплейтные части этой компоненты для дальнейшего наращивания функциональности модуля. А какой язык дает при этом все эти возможности, это уже дело привычки и образования — я например дорожу плюсовыми приемами, хотя возможности библиотек джавы или .Нет очень впечатляющие, но код ведь буду писать я а не библиотека, и хотелось бы код этот все таки писать а не копировать из файла в файл.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[13]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 15:27
Оценка:
Здравствуйте, mikа, Вы писали:

IT>>А блин, точно. Опять quick solution.


M>"Поспешишь — людей насмешишь".


Дык о тож

M>Русский поговорки забыл?


Ещё помню. Например такие:

— Не суди и не судим будешь.
— Как аукнется так и откликнется.



IT>>Что-то я видел на эту тему, правда давно это было, надо будет опять в Роторе покопаться.


M>Что именно, как без TP? Дык я же привел


Я не про это. Было что-типа CreateUninitializedObject
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Ответ
От: Merle Австрия http://rsdn.ru
Дата: 26.01.04 15:35
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>Согласен, но это уже вопрос воспитания.

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

B> Кому то проще наследоваться от ContextBoundObject и заколачивать в него гвоздями все необходимые атрибуты

Это уже вопрос конкретной реализации (а именно Net, каковая все-таки далековата от идеала).
Как-то надо все-таки определиться, мы обсуждаем Аспекты "в принципе" или Аспекты в Net, а то mika все на RP с CBO съезжает.

B>>>И обошлись без ContextBoundObject... Может я ошибаюсь, но преимущества АОП в .Net в том, что я могу обувать свои типы в атрибуты динамически, на этапе выполнения? Нужно ли это на этапе выполнения, это уже другой вопрос

Пока преимуществ AOP в Net не много... Я, откровенно говоря, только-только в это въезжаю, и уже хочется большего, но сама идея мне нравится.

B>Еще несколько лет назад я бы кинулся в драку защищать свой любимый С++, но со временем эта категоричность проходит, думаю у тебя тоже это случится, тридцатка уже стукнула или еще нет?


2IT Вот Игорь, воспитывал, воспитывал Мику, а сейчас тебя большие дядьки разуму научать будут...


B>Вобщем какое может быть отношение неискушенных программеров к АОП идеологии? На мой взгляд тут нет места сопоставлениям, AOP vs. OOP и так далее. Это две разные парадигмы, которые друг друга дополняют, но не заменяют. Базовый ООП является незаменимой частью дизайна архитектуры, интерфейсы и виртуальные методы сегодня еще никто не отменил. Вместе с этим, в современном программинге нечего делать без продвинутых средств реализации, каковыми и является к примеру АОП.

[+]
Вах, правильно говорищ! Собственна об том и речь, ясен хобот, что от OOP никто отказываться не собирается и поэтому не совсем ясно об чем спор.
И не совсем ясно с чем спорил ГВ, в своем изначальном постинге. Я так и не понял, он против АОП "в принцие" или нет? И каковы его аргументы если да?
Впрочем один я кажется помню, неконтролируемое вмешательство в логику поведения объекта извне, я прав?

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

Корректно ли говорить о "более правильном" или "менее правильном" дизайне? АОП предполагает все-таки большую гибкость, я бы даже сказал более удачное соотношение "гибкость/сложность кода", и в этом смысле дизайн с AOP более правильный.
Мы уже победили, просто это еще не так заметно...
Re[14]: Ответ
От: mikа Stock#
Дата: 26.01.04 15:40
Оценка:
Здравствуйте, IT, Вы писали:

M>>"Поспешишь — людей насмешишь".


IT>- Не суди и не судим будешь.

IT>- Как аукнется так и откликнется.

IT>)


ИТ бояться — на RSDN не ходить.

IT>Я не про это. Было что-типа CreateUninitializedObject


И каков принцип не помнишь? Может аналог FormatterServices.GetUninitializedObject, только напрямую через internal методы.
Re[14]: Ответ
От: mikа Stock#
Дата: 26.01.04 15:50
Оценка:
Здравствуйте, Merle, Вы писали:

M>Как-то надо все-таки определиться, мы обсуждаем Аспекты "в принципе" или Аспекты в Net, а то mika все на RP с CBO съезжает.


Да не я это. ИТ сам первым упомянул эти слова. Ну я и понеслась

M>Пока преимуществ AOP в Net не много... Я, откровенно говоря, только-только в это въезжаю, и уже хочется большего, но сама идея мне нравится.


А кому она не нравится?

M>2IT Вот Игорь, воспитывал, воспитывал Мику, а сейчас тебя большие дядьки разуму научать будут...


Поправочка. Игорь воспитывал Рому. Мне же удалось-таки уйти от этой экзекуции.
Re[15]: Ответ
От: Merle Австрия http://rsdn.ru
Дата: 26.01.04 16:30
Оценка:
Здравствуйте, mikа, Вы писали:

M>Да не я это. ИТ сам первым упомянул эти слова. Ну я и понеслась

А чего нестись-то? Нефиг путать идею с реализацией..
Мы уже победили, просто это еще не так заметно...
Re[14]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 26.01.04 16:32
Оценка:
Здравствуйте, Merle, Вы писали:

B>>Еще несколько лет назад я бы кинулся в драку защищать свой любимый С++, но со временем эта категоричность проходит, думаю у тебя тоже это случится, тридцатка уже стукнула или еще нет?

M>
M>2IT Вот Игорь, воспитывал, воспитывал Мику, а сейчас тебя большие дядьки разуму научать будут...

Никого я не собираюсь поучать, все кругом взрослые дядьки, просто мне казалось что форумы существуют для обмена опытом, а глядя на этот топик такое впечатление что времена доисторических религиозных разборок продолжаются в других руслах, нафига спрашивается...


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

M>Корректно ли говорить о "более правильном" или "менее правильном" дизайне? АОП предполагает все-таки большую гибкость, я бы даже сказал более удачное соотношение "гибкость/сложность кода",

Я не говорю о более правильном дизайне, прочитай еще раз мой пост. Дизайн он либо правильный либо так получилось, я же говорю о средствах, которые способствуют тому что бы не делать так как получилось, а так как хотелось не смотря на нехватку времени и нервов. И АОП как средство, в этом плане не единственное.

M> в этом смысле дизайн с AOP более правильный.

Подчеркиваю, АОП поможет имплементировать необходимый дизайн. Хотелось бы при этом избежать компромисов, но в реальной жизни так не бывает, я думаю каждый из вас испытывал ощущения, когда ты читаешь инфу о новом подходе или идеологии и тут же начинаешь взвешивать в голове сколько новых проблем это принесет, чего тебя лишают, и чем тебя наделяют взамен. Свой первый серьёзный облом с явой я прошел еще в году 97 — м, средств упрощающих правильную имплементацию там явно не хватало, не зря сейчас и в Шарпе и в Яве дженерики появились, причина все та же, добавить эти самые средства имплементации...
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[15]: Ответ
От: Merle Австрия http://rsdn.ru
Дата: 26.01.04 16:52
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>Никого я не собираюсь поучать, все кругом взрослые дядьки <...>

Не бери в голову, просто у нас некоторый междусобойчик и я немного неудачно пытался IT поддеть..

B>Я не говорю о более правильном дизайне, прочитай еще раз мой пост.

Верно, это я сказал. Мысь была такова: "если корректно говорить о ..." ну и так далее...
Тока что же говорил, что все взрослые дядьки, а все трактуете как наезд, прям как не взрослые.
Хотя у меня сегодня с формулировками вообще все очень хорошо...

B> Дизайн он либо правильный либо так получилось, я же говорю о средствах, которые способствуют тому что бы не делать так как получилось, а так как хотелось не смотря на нехватку времени и нервов. И АОП как средство, в этом плане не единственное.

В общем случае конечно не единственное. Но при поддержке компилятора, для некоторых задач, самое удобное.

M>> в этом смысле дизайн с AOP более правильный.

B>Подчеркиваю, АОП поможет имплементировать необходимый дизайн.
Осознал.
Мы уже победили, просто это еще не так заметно...
Re[13]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 16:57
Оценка:
Здравствуйте, mikа, Вы писали:

M>Так что, вердикт таков. Берем банду, учим паттерны, проектируем


Это только половина вердикта. В оставшейся части — используем AOP, если это позволяют нам доступные средства.
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 16:57
Оценка:
Здравствуйте, mikа, Вы писали:

M>Игорь, в своем первом сообщении упомянул RealProxy. Так что ни о каком чистом АОП и речи не шло. Это я его продвигаю, так как на С++ проксей не сущесвует.


Теперь я понял. Все твои посылки в защиту ГВ — это как раз и есть твоё продвижение AOP. Ну оно и понятно, на С++ ведь проксей не сущесвует.

Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 26.01.04 16:58
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Batiskaf, Вы писали:


IT>>>Тогда уж лучше абстрактные классы vdimas.


B>>Согласен, но это уже вопрос воспитания.


IT>Воспитание — это хорошо. Но если есть возможность ошибиться, то люди будут ошибаться и этот код будет уходить в производство. В результате всё как бы работает и даже правильно, за исключением какой-то одной служебной функции. Вот, допустим, мы подобным способом имплементируем разграничение прав. Я забыл о воспитании или, например, Intellisence, сволочь подсунул мне не тот метод. Всё работает, функциональные тесты проходят, код уходит клиенту. Далее юный хакер из соседней школы вызывает мой метод и грабит через него автоматизируемый нами банк Кого сажать? Меня, как допустившего ошибку? Или тебя, как давшего мне такую ошибку допустить? Допустим меня, но где гарантия, что это была одна единственная подобная ошибка? Ты это можешь гарантировать?


Кажется ты что то там про демагогию говорил...

B>>Кому то проще наследоваться от ContextBoundObject и заколачивать в него гвоздями все необходимые атрибуты, я же предпочитаю оформить инклюд файл, в котором находятся одни typedef's, с комментариями и рекомендациями как это все использовать, тем более что документировать приходится как мне так и тебе в одинаковой мере. Внешне все выглядит по разному, но результат все тот же


IT>Как раз сейчас речь идёт вовсе не о результате. Речь о минимизации усилий при кодировании и сопровождении.

Ну давай количество строк сравнивать не будем, тем более что количество это будет приблизительно одинаковым

B>>Еще несколько лет назад я бы кинулся в драку защищать свой любимый С++, но со временем эта категоричность проходит, думаю у тебя тоже это случится, тридцатка уже стукнула или еще нет?


IT>Нет, пока только 0x25 стукнуло


То то я вижу ты круглосуточно в форуме сидишь. Папа, вернись в семью, тебя дети ждут!!

B>>Вобщем какое может быть отношение неискушенных программеров к АОП идеологии? На мой взгляд тут нет места сопоставлениям, AOP vs. OOP и так далее. Это две разные парадигмы, которые друг друга дополняют, но не заменяют.


IT>Кто бы спорил. Ты почитай с чего начался весь спор. ГВ заклеймил AOP как явление, сказал что без него до сих про жили и жить будем дальше. Пришлось вступаться.

Да нормальный он парень, просто объясниться внятно не получилось, либо вам не удалось его понять, одно из двух, точно говорю
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[16]: Ответ
От: mikа Stock#
Дата: 26.01.04 20:04
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, mikа, Вы писали:


M>>Да не я это. ИТ сам первым упомянул эти слова. Ну я и понеслась

M>А чего нестись-то? Нефиг путать идею с реализацией..

Вот вот. Я Игоря этим и потыкал. А до сих пор сопротивляется
Re[18]: Ответ
От: mikа Stock#
Дата: 26.01.04 20:25
Оценка:
Здравствуйте, IT, Вы писали:

M>>Игорь, в своем первом сообщении упомянул RealProxy. Так что ни о каком чистом АОП и речи не шло. Это я его продвигаю, так как на С++ проксей не сущесвует.


IT>Теперь я понял.


Всегда бы так

IT>Все твои посылки в защиту ГВ


Да не Геннадия я защищал (в твоем/его споре, чтобы уровнять шансы нужно было мне на твою сторону перейти )
Я защищал ту идей, в которой говорилось, что на ООП решение будет более эффективно и просто. Конечно, не все можно так красиво сделать на ООП, как это можно реализовать на АОП. Но данный пример (которые ты привел) был настолько надуманным и ужасным, что на АОП решение оказалось очень и очень плохим.

IT>- это как раз и есть твоё продвижение AOP.


Я не продвигаю АОП. Я пытаюсь отделить понятие реализации АОП от его абстрактного представления.

IT>Ну оно и понятно, на С++ ведь проксей не сущесвует.


Вот опять. Ну причем тут прокси? Ну нет у АОП такого понятие как "прокси". Там есть такое понятие как "аспект".
Re[19]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 20:47
Оценка:
Здравствуйте, mikа, Вы писали:

M>Я защищал ту идей, в которой говорилось, что на ООП решение будет более эффективно и просто. Конечно, не все можно так красиво сделать на ООП, как это можно реализовать на АОП. Но данный пример (которые ты привел) был настолько надуманным и ужасным, что на АОП решение оказалось очень и очень плохим.


Пример, который я привёл является классической задачей AOP. Решение на RP вполне нормальное, с той оговоркой, что используется ремоутинг.
Если нам не помогут, то мы тоже никого не пощадим.
Re[20]: Ответ
От: TK Лес кывт.рф
Дата: 26.01.04 21:05
Оценка:
Hello, "IT"
>
> M>Я защищал ту идей, в которой говорилось, что на ООП решение будет более эффективно и просто. Конечно, не все можно так красиво сделать на ООП, как это можно реализовать на АОП. Но данный пример (которые ты привел) был настолько надуманным и ужасным, что на АОП решение оказалось очень и очень плохим.
>
> Пример, который я привёл является классической задачей AOP. Решение на RP вполне нормальное, с той оговоркой, что используется ремоутинг.

Ну, добавлять свои сервисы через CBO и говорить, что используется ремоутинг — это слишком громко. Просто, схожие технологии которые используют общую инфраструктуру.
Posted via RSDN NNTP Server 1.8 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[21]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 21:17
Оценка:
Здравствуйте, TK, Вы писали:

>> Пример, который я привёл является классической задачей AOP. Решение на RP вполне нормальное, с той оговоркой, что используется ремоутинг.


TK>Ну, добавлять свои сервисы через CBO и говорить, что используется ремоутинг — это слишком громко. Просто, схожие технологии которые используют общую инфраструктуру.


С той оговоркой, что в решеаемой задаче используется ремоутинг. Такая формулировка устроит?
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 21:21
Оценка:
Здравствуйте, Batiskaf, Вы писали:

IT>>Воспитание — это хорошо. Но если есть возможность ошибиться, то люди будут ошибаться и этот код будет уходить в производство. В результате всё как бы работает и даже правильно, за исключением какой-то одной служебной функции. Вот, допустим, мы подобным способом имплементируем разграничение прав. Я забыл о воспитании или, например, Intellisence, сволочь подсунул мне не тот метод. Всё работает, функциональные тесты проходят, код уходит клиенту. Далее юный хакер из соседней школы вызывает мой метод и грабит через него автоматизируемый нами банк Кого сажать? Меня, как допустившего ошибку? Или тебя, как давшего мне такую ошибку допустить? Допустим меня, но где гарантия, что это была одна единственная подобная ошибка? Ты это можешь гарантировать?


B>Кажется ты что то там про демагогию говорил...


Какая демагогия? Я тебе привёл вполне реальный пример, может его чуть-чуть приукрасил. Замени пионера на бестолковую операционистку и всё будет как в жизни.

IT>>Как раз сейчас речь идёт вовсе не о результате. Речь о минимизации усилий при кодировании и сопровождении.

B>Ну давай количество строк сравнивать не будем, тем более что количество это будет приблизительно одинаковым

Я тебе не за строки говорю, а за количество траха, которое мы все имеем при смешивании бизнеслогики и сквозного кода.

IT>>Нет, пока только 0x25 стукнуло


B>То то я вижу ты круглосуточно в форуме сидишь.


Это просто у нас с тобой сутки в разное время

B>Папа, вернись в семью, тебя дети ждут!!


Мои дети уже большие, папу в Тёрнамент делают как сынка

IT>>Кто бы спорил. Ты почитай с чего начался весь спор. ГВ заклеймил AOP как явление, сказал что без него до сих про жили и жить будем дальше. Пришлось вступаться.

B>Да нормальный он парень, просто объясниться внятно не получилось, либо вам не удалось его понять, одно из двух, точно говорю

А кто говорит, что он ненормальный Это у нас с ним обычный спор на тему старое vs новое.
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 21:24
Оценка:
Здравствуйте, mikа, Вы писали:

M>>>Да не я это. ИТ сам первым упомянул эти слова. Ну я и понеслась

M>>А чего нестись-то? Нефиг путать идею с реализацией..

M>Вот вот. Я Игоря этим и потыкал. А до сих пор сопротивляется


Просто ты как всегда перепутал тёплое с мягким
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: Ответ
От: mikа Stock#
Дата: 26.01.04 22:04
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, mikа, Вы писали:


M>>>>Да не я это. ИТ сам первым упомянул эти слова. Ну я и понеслась

M>>>А чего нестись-то? Нефиг путать идею с реализацией..

M>>Вот вот. Я Игоря этим и потыкал. А до сих пор сопротивляется


IT>Просто ты как всегда перепутал тёплое с мягким


Понятно. Начинаем уже стрелки друг на друга переводить
Re[23]: Ответ
От: IT Россия linq2db.com
Дата: 26.01.04 22:37
Оценка:
Здравствуйте, TK, Вы писали:

IT>>С той оговоркой, что в решеаемой задаче используется ремоутинг. Такая формулировка устроит?


TK>А если ремоутинг не используется? т.е. реально считается, что System.EnterpriseServices.ServicedComponent это просто "неживое" решение (особенно библиотечные COM+ компоненты) из-за тормозов в CBO?


Можно вопрос точнее сформулировать?
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Ответ
От: IT Россия linq2db.com
Дата: 27.01.04 01:37
Оценка:
Здравствуйте, mikа, Вы писали:

IT>>Я не про это. Было что-типа CreateUninitializedObject


M>И каков принцип не помнишь? Может аналог FormatterServices.GetUninitializedObject, только напрямую через internal методы.


Короче, вот такой изврат получается.

using System;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;

namespace Example
{
    public class MyProxy : RealProxy
    {
        public MyProxy(Type type) : base(type)
        {
        }

        public MarshalByRefObject CreateInstance()
        {
            InitializeServerObject(null);

            return base.GetUnwrappedServer();
        }

        public override IMessage Invoke(IMessage msg)
        {
            return null;
        }
    }

    [AttributeUsage(AttributeTargets.Class)]
    public class MyClassFactoryAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type type)
        {
            return new MyProxy(typeof(MyRealClass)).CreateInstance();
        }
    }

    [MyClassFactory]
    public class MyClass : ContextBoundObject
    {
    }

    class MyRealClass : MyClass
    {
    }

    class Test
    {
        static void Main()
        {
            MyClass mc = new MyClass();

            Console.WriteLine(mc.GetType().Name);
        }
    }
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Ответ
От: IT Россия linq2db.com
Дата: 27.01.04 01:54
Оценка:
Здравствуйте, mikа, Вы писали:

M>Кстати, код работоспособен. Только ужасно тормознутый


А как ты мерял тормознутось?
Если нам не помогут, то мы тоже никого не пощадим.
Re[24]: Ответ
От: TK Лес кывт.рф
Дата: 27.01.04 04:12
Оценка:
Hello, "IT"
>
> IT>>С той оговоркой, что в решеаемой задаче используется ремоутинг. Такая формулировка устроит?
>
> TK>А если ремоутинг не используется? т.е. реально считается, что System.EnterpriseServices.ServicedComponent это просто "неживое" решение (особенно библиотечные COM+ компоненты) из-за тормозов в CBO?
>
> Можно вопрос точнее сформулировать?

Просто не раз уже упоминалось, что использование CBO это тормоза и только из-за ремоутинга их не заметно. Вот и интересно — а как быть с ServicedComponent — ведь этот класс наследуется от CBO и должен автоматически получать все проблемы с этим связанные.
Posted via RSDN NNTP Server 1.8 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[25]: Ответ
От: IT Россия linq2db.com
Дата: 27.01.04 04:49
Оценка:
Здравствуйте, TK, Вы писали:

TK>Просто не раз уже упоминалось, что использование CBO это тормоза и только из-за ремоутинга их не заметно. Вот и интересно — а как быть с ServicedComponent — ведь этот класс наследуется от CBO и должен автоматически получать все проблемы с этим связанные.


Похоже что так. Нужно мерить.
Я сейчас померил скорость создания CBO объекта (без проксей) и простого объекта, разница в сотни раз. Многовато конечно. Создание обычного объекта может быть оптимизировано до нескольких десятков команд процессора, а CBO это переходы из unmanaged в managed и т.п. Основные тормоза где-то тут.
Если нам не помогут, то мы тоже никого не пощадим.
Re[26]: Ответ
От: TK Лес кывт.рф
Дата: 27.01.04 05:05
Оценка:
Здравствуйте, IT, Вы писали:

TK>>Просто не раз уже упоминалось, что использование CBO это тормоза и только из-за ремоутинга их не заметно. Вот и интересно — а как быть с ServicedComponent — ведь этот класс наследуется от CBO и должен автоматически получать все проблемы с этим связанные.


IT>Похоже что так. Нужно мерить.

IT>Я сейчас померил скорость создания CBO объекта (без проксей) и простого объекта, разница в сотни раз.

В смысле без проксей? По умолчанию прокси будет создаваться всегда, и при первом вызове CBO (конструктор) вызов пройдет по максимально длинному пути — через создание всех приемников и т.п.
с линейкой не считал, но наверное там как раз в районе сотни процессорных инструкций и набежит.

IT>Многовато конечно. Создание обычного объекта может быть оптимизировано до нескольких десятков команд процессора, а CBO это переходы из unmanaged в managed и т.п. Основные тормоза где-то тут.


Переход managed / unmanaged — достаточно быстрый. Собственно никакого перехода то и нет — просто jit навставляет десяток лишних инструкций на вызов каждого метода (это если контекст не покидать). Да даже если и покидать — ты считаешь, что сотня инструкций (циклов нет) это серьезный performance hit для вызова бизнес метода?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[27]: Ответ
От: IT Россия linq2db.com
Дата: 27.01.04 05:36
Оценка:
Здравствуйте, TK, Вы писали:

TK>Переход managed / unmanaged — достаточно быстрый. Собственно никакого перехода то и нет — просто jit навставляет десяток лишних инструкций на вызов каждого метода (это если контекст не покидать). Да даже если и покидать — ты считаешь, что сотня инструкций (циклов нет) это серьезный performance hit для вызова бизнес метода?


Вот тест:

using System;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;

namespace Example
{
    // -------------------------------------------------

    public class MyProxy : RealProxy
    {
        public MyProxy(Type type) : base(type)
        {
        }

        public MarshalByRefObject CreateInstance()
        {
            InitializeServerObject(null);

            return base.GetUnwrappedServer();
        }

        public override IMessage Invoke(IMessage msg)
        {
            return null;
        }
    }

    [AttributeUsage(AttributeTargets.Class)]
    public class MyClassFactoryAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type type)
        {
            return new MyProxy(typeof(MyObject)).CreateInstance();
        }
    }

    [MyClassFactory]
    public class MyObject : ContextBoundObject
    {
    }

    // -------------------------------------------------

    [AttributeUsage(AttributeTargets.Class)]
    public class MikaClassFactoryAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type type)
        {
            return (MarshalByRefObject)FormatterServices.GetUninitializedObject(typeof(MikaObject));
        }
    }

    [MikaClassFactory]
    public class MikaObject : ContextBoundObject
    {
    }

    // -------------------------------------------------
    
    [AttributeUsage(AttributeTargets.Class)]
    public class ProxyClassFactoryAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type type)
        {
            return base.CreateInstance(type);
        }
    }

    [ProxyClassFactory]
    public class ProxyObject : ContextBoundObject
    {
    }

    // -------------------------------------------------

    public class CBOObject : ContextBoundObject
    {
    }

    // -------------------------------------------------

    public class JustAnObject
    {
    }

    class Test
    {
        static void Main()
        {
            MyObject     mo = new MyObject();
            MikaObject   io = new MikaObject();
            ProxyObject  po = new ProxyObject();
            CBOObject    co = new CBOObject();
            JustAnObject jo = new JustAnObject();

            DateTime dt = DateTime.Now;
            for (int i = 0; i < 500000; i++)
                mo = new MyObject();
            Console.WriteLine("MyObject:     {0}", DateTime.Now - dt);

            dt = DateTime.Now;
            for (int i = 0; i < 500000; i++)
                io = new MikaObject();
            Console.WriteLine("MikaObject:   {0}", DateTime.Now - dt);

            dt = DateTime.Now;
            for (int i = 0; i < 500000; i++)
                po = new ProxyObject();
            Console.WriteLine("ProxyObject:  {0}", DateTime.Now - dt);

            dt = DateTime.Now;
            for (int i = 0; i < 500000; i++)
                co = new CBOObject();
            Console.WriteLine("CBOObject:    {0}", DateTime.Now - dt);

            dt = DateTime.Now;
            for (int i = 0; i < 500000; i++)
                jo = new JustAnObject();
            Console.WriteLine("JustAnObject: {0}", DateTime.Now - dt);
        }
    }
}


Вот результат:

MyObject:     00:00:02.0156250
MikaObject:   00:00:00.4531250
ProxyObject:  00:00:39.5937500
CBOObject:    00:00:33.7500000
JustAnObject: 00:00:00.0156250


В общем, насчёт сотен раз я ошибся
Если нам не помогут, то мы тоже никого не пощадим.
Re[28]: Ответ
От: TK Лес кывт.рф
Дата: 27.01.04 07:19
Оценка:
Здравствуйте, IT, Вы писали:

TK>>Переход managed / unmanaged — достаточно быстрый. Собственно никакого перехода то и нет — просто jit навставляет десяток лишних инструкций на вызов каждого метода (это если контекст не покидать). Да даже если и покидать — ты считаешь, что сотня инструкций (циклов нет) это серьезный performance hit для вызова бизнес метода?


IT>Вот тест:


Ну, круто

IT>Вот результат:


MikaObject:   00:00:00.4005960
JustAnObject: 00:00:00.0100149
JustAnMbrObject: 00:00:00.0300447


IT>В общем, насчёт сотен раз я ошибся


как видно само создание cbo — процесс достаточно быстрый (MikaObject) и основные задержки идут на формирование инфраструктуры. А учитывая, что основная задача cbo — это фасад бизнес логики, то время создания получается достаточно приемлемым.
с тем же успехом можно попробовать открывать в цикле соединения к бд без использования пула — тоже медленно, вот только кто это реально использует?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[9]: Ответ
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 09:48
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Изначально, как я понял, встала задача — развесить хуки на вызовы методов (счетчики, мониторинг и т.д.),

V>так вот, для полиморфных методов это можно решить весьма даже многими способами

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

Здорово? Нереально? При твоих технологиях конечно. А вот с АОП очень даже. Ты просто делаешь аспект который прикручивает нужный код ко всем классам помеченым определенным образом. И все. Если что случись меняшь только аспект. Код остается чисты и красивым как уроки общучения ОО-программированию.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Ответ
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 09:48
Оценка:
Здравствуйте, vdimas, Вы писали:

V>1. COM — из typelib берем информацию об интерфейсе и в рантайме делаем ему заместитель, совместимый по vf_table, который в каждом методе вызывает наш хуковый счетчик, а потом вызывает (вызывает — громко сказано... делает jump на ) первоначальный метод замещенного метода интерфейса. При возврате ссылки на некий интерфейс — возвращаем прохаканный заместитель, если возвращаемый объект до этого не прохакан (это легко проконтроллировать)


И фигачим на каждый плевок по таблицы из 1024 методов плюс асмовские вставки. А как же иначе? Наш легкий джамп легок только в выполнении. На практике он требует хакерства.

И вот еще какая проблема. Код то может без ком-а работать. Ну, да тоже можно и через виртуальную таблицу зафигачить. Остается правда оверхэд на виртуальный вызов. Но это уже не так критично. Вроде все ОК? Ах да. Это хакерство же нужно теперь подключить ко всем интерфейсам что нужно перехватить. Да не к интерфейсам, а ко всем классам. Ну, да ладно пошли клепать тонны фабрик. Такова силявя.

V>3. .Net — очень много способов как сделать... выбираем на вкус... мне больше всего нравится идея в рантайм генерировать по typeinfo скриптинг, который делает нечто типа 1. и 2. но на "человеческом" .net ЯП, напр. С#


Здорово. Но вот время на компиляцию. Ошибки в рантайме. И трудность в отладке. Беда, однако.


V>Вполне допустимый подход, ибо после компиляции и "переваривания" Jit быстродействие такого объекта в точности равно быстродействию обычного, расходуем время только на автогенерацию и компиляцию скрипта — но это все одноразово, 1 раз на класс (в отличии от CBO, где рефлекшн используется в каждом вызове, что действительно приемлимо разве что в Remouting, где это тонет в общих временных затратах).


Ну, в общем конечно выход. Но вот проблемы описанные выше... А давай как мы твой вариант (смелый и красивый) немножко доработаем напильником... Знаешь, что мы сделам. Мы переведем генерацию кода из рантайма в компайл-тайм. И даже круче. Мы научимся модифицировать исходный код так чтобы можно было менять не только вызовы методов, но и любые части кода.

Правда красивее? Время в рантайме не тратится. Мы имеем проверку на стадии компиляции. И что приятно при отладке у нас полноценная отладочная информация. Мы же просто код компилятором компилировали!

Правда трудности остались. Каждый раз при изменениях аспектов нам нужно перегенерировть сам генератор. Нда. А! О! Придумал. Мы делаем АПИ позволяющее упростить создание генераторов. Делам некий синтаксис позволяющий делать такие замены кода которые нам нужны. Ё! Да мы же до того самого АОП и договорились. Во оно как! А?!

V>} лопата end;


Не. Это уже на кибер трактор тянет.

V>Ну а теперь вернемся в "человеческое" ООП.


Не. Ну, кудаж мы теперь вернемся. ООП то у нас уже человеческий! Без всяких ковычек. Ведь обвязка теперь у нас приклеивается во время компиляции. Причем шаблоны С++ просто детство по сравнению с гибкостью нашего решения. Привда?

V>...Ибо ООП предполагает затрату некоей мыслительной энергии на начальных этапах проектирования.


Погоди. Мы же в реалии жизни хотели вернуться. Или нет? А в реалии еще никто ен смог спроектировать систему без ошибок. Что-то забыли, что-то появилось пока реализовывали... Ну, бывает же... жизнь все же...

V>Тема крайне интересная, и хотелось бы от IT услышать хоть один достойный пример, где АОП имело бы преимущество перед ООП.


Тут оно как. Нет таких преимуществ. Они как бы прекрасно делают каждый свое дело. Просто АОП — это такое крутейшее средство реалтаймного рефакторинга. А ООП — это средство ясного изложения мыслей. Вместе они сила. А порознь одно бессмысленно, а второе начинает намыливаться мелочами не относящимися к делу.


V>И еще, самое главное:

V>Если не трудно, развития ради, интересно посмотреть на код и оценить трудоемкость подхода IT в решении его собственной задачки. ГВ предложил одну строчку кода на все интересующие методы, трудоемкость в этом случае ясна и понятна. IT, давай решение на АОЯП — справедливости ради, а то пока не ясно как все это сравнивать

А слабо прочесть статью ставшую основой этой теме?

Понимаю, качество у нее не очень. Много воды. Формулировки не точные. Ну, да мы договорились с автором и опубликуем статью в журнале "Технология Клиент-Сервер" в честь чего выжмем ее хорошенько, и причешем. Вот тогда может все спорящие ее и прочтут до конца.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Ответ
От: vdimas Россия  
Дата: 27.01.04 13:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, vdimas, Вы писали:


V>>1. COM — из typelib берем информацию об интерфейсе и в рантайме делаем ему заместитель, совместимый по vf_table,

VD>И вот еще какая проблема. Код то может без ком-а работать. Ну, да тоже можно и через виртуальную таблицу зафигачить. Остается правда оверхэд на виртуальный вызов. Но это уже не так критично. Вроде все ОК? Ах да. Это хакерство же нужно теперь подключить ко всем интерфейсам что нужно перехватить. Да не к интерфейсам, а ко всем классам. Ну, да ладно пошли клепать тонны фабрик. Такова силявя.

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

V>>3. .Net — очень много способов как сделать... выбираем на вкус... мне больше всего нравится идея в рантайм генерировать по typeinfo скриптинг, который делает нечто типа 1. и 2. но на "человеческом" .net ЯП, напр. С#


VD>Здорово. Но вот время на компиляцию. Ошибки в рантайме. И трудность в отладке. Беда, однако.


Дык, отладка-то одноразовая
и предположительный размер генератора невелик, да и результат его работы контроллировать крайне легко — скриптинг на "человеческом" ЯП.


V>>Вполне допустимый подход, ибо после компиляции и "переваривания" Jit быстродействие такого объекта в точности равно быстродействию обычного, расходуем время только на автогенерацию и компиляцию скрипта — но это все одноразово, 1 раз на класс (в отличии от CBO, где рефлекшн используется в каждом вызове, что действительно приемлимо разве что в Remouting, где это тонет в общих временных затратах).


VD>Ну, в общем конечно выход. Но вот проблемы описанные выше... А давай как мы твой вариант (смелый и красивый) немножко доработаем напильником... Знаешь, что мы сделам. Мы переведем генерацию кода из рантайма в компайл-тайм. И даже круче. Мы научимся модифицировать исходный код так чтобы можно было менять не только вызовы методов, но и любые части кода.


VD>Правда красивее? Время в рантайме не тратится. Мы имеем проверку на стадии компиляции. И что приятно при отладке у нас полноценная отладочная информация. Мы же просто код компилятором компилировали!


VD>Правда трудности остались. Каждый раз при изменениях аспектов нам нужно перегенерировть сам генератор. Нда. А! О! Придумал. Мы делаем АПИ позволяющее упростить создание генераторов. Делам некий синтаксис позволяющий делать такие замены кода которые нам нужны. Ё! Да мы же до того самого АОП и договорились. Во оно как! А?!


Так... А теперь давайте ближе к той же теме.
Идет разработка (прямо сейчас) n-таерной архитектуры на дотнете на Windows.Forms в качестве платформы клиента.
Так вот, есть несколько пожеланий (перечислю парочку):
1. Неохота на клиента тянуть библиотеки имплементирующие БО на стороне сервера (из-за их потенциального размера и, вероятно, частой обновляемости да и еще 100 причин), т.е. хошь не хошь а выбираем абстрактные базовые классы или интерфейсы для наших целевых БО.
2. Неохота удаленные экземляры этих БО биндить непосредственно к контролам форм, ибо не все изменения на форме клиента необходимо моментально перегонять на сервер, да и живость такого варианта "под пальчиками" оставляет желать лучшего при dial-up соединении. Из опытов предыдущих разработок выяснилось, что непосредственно гнать на сервер изменение поля БО надо дай бог в 10% случаев (для валидации сложной, либо для изменения значения других полей по сложному алгоритму), Поэтому решено автоматически генерить на клиенте заместитель, построение которого управляется типами и атрибуттами полей открытого абстрактного объявления БО.

Я всерьез предполагаю делать так, как описал выше насчет скриптинга.Статью прочел и доводы понятны. Есть мысли как сделать это сделать иначе, чем предложенный вариант?

Дополнительные условия функционирования системы:
— система начнет эксплуатироваться до своего полного завершения (да, именно так), будет вводится поблочно и предполагает быть максимально гибкой. Клиентское ПО будет при каждом запуске запрашивать текущие версии библиотек и тянуть их последнии варианты.
— БО — интерфейсы не "заморожены", т.е. регуляно могут добавлятся поля, или немного менятся тип существующих и т.д. Учитывая биндинг по именам и спецификацию клиентских форм в XML, это, вроде, не проблема.
— Конечное количество БО может быть действительно очень большим. Учитывая, что в качестве клиента могут выступать даже такие совсем тонкие платформы как планшетные ПК и их разновидности без HD, то предполагается тянуть на клиента библиотеки в процессе работы по мере надобности, т.е. охота сократить их размер до минимума. Учитывая, что один человек в течении одного рабочего дня вряд ли успеет пройтись вообще по всей системе, предполагается, что клиент-работник в силу своих привилегий, специализации и т.д. будет задействовать постоянно дай бог 5-10% всех существующих на сервере БО. Т.е. как бы не имеет смысл делать готовые заглушки заранее, именно охота в процессе работы формировать и догружать библиотеки (маленькие такие библиотеки, содержащие лишь объявления интерфейсов БО и аттрибутику)

И самое главное, поделитесь опытом, насколько реально в дотнетовском проекте перейти прямо сейчас на аспектную платформу без потери скорости? Какие есть инструменты?

Я пока, кроме inline компилятора AspectC# ничего более готового для дотнета не нашел, повторяя Влада — "И трудность в отладке. Беда, однако."
Re[11]: Ответ
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 14:25
Оценка:
Здравствуйте, vdimas, Вы писали:

V>И самое главное, поделитесь опытом, насколько реально в дотнетовском проекте перейти прямо сейчас на аспектную платформу без потери скорости? Какие есть инструменты?


V>Я пока, кроме inline компилятора AspectC# ничего более готового для дотнета не нашел, повторяя Влада — "И трудность в отладке. Беда, однако."


Тебе не аспектами нужно увлекаться с твоими задачами. И не ООП. Тебе нужно клиентов на веб-интерфейс переводить. И тогда всю эту фигню даже обдумывать нужно не будет.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Ответ
От: vdimas Россия  
Дата: 27.01.04 15:41
Оценка:
Здравствуйте, IT, Вы писали:

V>>И самое главное, поделитесь опытом, насколько реально в дотнетовском проекте перейти прямо сейчас на аспектную платформу без потери скорости? Какие есть инструменты?


IT>Если вы используете ремоутинг, то все возможные тормоза вы уже получили, поэтому можно не стесняться и выносить весь сквозной код в интерсепторы.


Да нет, имелось ввиду без потери в скорости разработки, разумеется.
Ибо VS.Net + Visio там же и плагин от Together, да еще с intellisense и удобным представлением проектов и классов, да плюс еще NDoc (+ еще 100 удобств, перечислите сами) — это довольно шустрая среда в плане именно скорости разработки.
Re[12]: Ответ
От: vdimas Россия  
Дата: 27.01.04 15:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Тебе не аспектами нужно увлекаться с твоими задачами. И не ООП. Тебе нужно клиентов на веб-интерфейс переводить. И тогда всю эту фигню даже обдумывать нужно не будет.


И веб-интерфейс, разумеется будет, для совсем уж тонких клиентов но с быстрым и-нетом (все эти "глобальные" решения принимаю не я, разумеется, это требования заказчика).

Как показал предыдущий проект (C++-клиент, CORBA, Java-сервак), "нормальный" (не веб) клиент куда как субъективно шустрее пашет, ибо по сети гоняются "голые" данные, а всякие мета-инфо и ресурсы форм — лишь однажды, да и те кешируются м/у запусками программы, т.е. в итоге получаем по dial-up и-нету субъективно неплохую скорость работы, с клиентской т.з. сравнимую с работой в локалке с какой-нить CS-системой.
Re[20]: Спорно.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 23:32
Оценка:
Здравствуйте, naje, Вы писали:

N>вобще по поводу наглядности я там написал что рюшечек всяких можно подобавлять


Достаточно.

N>ты лучше ответь на такой вопрос, что если этот заказчик из твоего вопроса захочет не мониторинг добавить, а производительность неимоверную, и/или чтоб програмка вместе с операционкой помещалась на флэшку 8 МБ (такой запрос более реальный чем просьбя о мониторинге), а у тебя всё с испольлванием RealProxy уже написано

N>что делать?

Я так понимаю IT-у самому все эти реал-прокси не нравятся. Вод добьем R# будем все в компайл-тайме прикомпилировать.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Спорно.
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.04 23:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>Хороший вопрос между прочим. В случае поддержки AOP самим компилятором, как ты понимаешь, никаких проблем не будет. В случае RealProxy, которую, прошу ещё раз заметить, я не предлагал как панацею, имеем тормоза. Соответственно, придётся извращаться либо предложенным тобой способом, либо как предлагает ГВ.


Кстати, из всего предложенного самыми удобными были РеалПрокси и перемап vtbl-а в КОМ-овском объекте. Но и то, и то не катит если метод должен работать быстро. И ни, то ни то не может помочь заменить отдельные операторы и т.п.

PS

Мы там пока вы тут тренеруете силу убеждения нашли подходящий генератор кода, создали репозиторий ЦВС, залили туда превую альфу, открыли несколько дискусий, я написал вводную статью (поглядел бы, кстати).

Сейчас нужно:

1. Новую ветку в проектах.
2. Опубликовать статью (если хочешь допиши туда свои мысли по АОП, или создай отдельную статью).
3. Сделать ссылку на форум в ветке проекта.
4. Дать новость и объявление в дотнетный и С++-ный форумы.
5. Заняться агрессивной агитацией за вступление в редя разработчиков R#.

Если подсобиш, мы будет мтлько рады. А то явно для обращения в АОП-веру не хватает примеров на работающем прототпе.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Спорно.
От: IT Россия linq2db.com
Дата: 28.01.04 05:18
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Очень наглядно. Хотя, конечно, в качестве job security очень даже ничего


VD>Толи еще будет, если мы все это не остановим!


Да, пора заканчивать с этим бардаком!
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Ответ
От: vdimas Россия  
Дата: 28.01.04 10:05
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Пьеса о создании супер рэплэйсилке

[кусь]
VD>Занавес...

А теперь ссылочку на интегрированную среду разработки под АОП, плиз. (под дотнет, если мона)
А то все эти рассуждения об АОП никак не вырастут из теоретических прений.

(Польза-то от коллективизации понятна... не понятно, что такое коллективизация...)

Ведь речь, в конечном итоге, должна идти о ПОЛЕЗНОСТИ этой технологии в наших современных реалиях. Т.е. берем немаленький проект с приличным числом девелоперов, убеждаем их в полезности еще одной фишки (предположим), которая дополняет наше мышление и добавляет нам счастья, не опровергая предыдущий опыт, и теперь, после того как все ответили: "ну давай!", что им дать-то?

(в той статье было перечисление разработок на тему АОП, из них ничего, относящегося к дотнет, я пока не рискну предложить для серьезной промышленной разработки, может у кого-то есть другая информация?)
Re[13]: Ответ
От: IT Россия linq2db.com
Дата: 28.01.04 16:01
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Насчет валидации... Согласно собственной практике валидации можно классифицировать. Некоторые типы валидаций, напр. допустимые значения полей, заданные некоей формулой, легко записываются в виде аттрибутов полей и обрабатываются на клиенте. И нет смысла встраивать подобного рода валидацию в бизнес-сущности, т.к. валидация, не требующая наличия других каких-то других БО или даже доступа в БД легко описывается аттрибутами.


Чего там квалифицировать. Валидация должна проводиться везде и всегда. Естественно, что при этом нужно учитывать целесообразность затрат на валидацию. Например, если валидация требует обращения к БД, то делать эту её часть из UI нецелосообразно. Но это совсем не означает, что БЛ должен полагаться на то, что что-то провалидировано на UI и не проводить той же самой повторной валидации на сервере.

V>Более сложная валидация может происходить в имплементации самого БО, см. внимательней след. пункт.


Точно.

V>Возвращаясь к бизнес-сущностям, далеко не все виды валидаций да и просто каких-то осмысленных действий можно выполнить "силами" самой бизнес-сущности, в отрыве от других сущностей (которых может не быть в момент обработки в месте этой обработки — скажем на клиеннте), т.е. от них как от таковых (сущностей, "гоняемых" по значению, а не по ссылке) давно отказались.


Можно об этом поподробней, почему отказались?

V>При экспериментах, непосредственный биндинг удаленных экземпляров к полям форм ведет себя неважно даже в случае бинарной сериализации. Поэтому, было решено для различных конфигураций создавать различный Session объект, являющийся корнем иерархии фабрик БО. Второй вариант Session-объекта — это просто обычный Session объект "обернутый" нашим автогенерируемым прокси, который распространяет свое действие по автоматическому созданию проксей на всю цепочку создаваемых БО.


Сдаётся мне, что ноги вашей архитектуры растут из COM. Такое ощущение, что вы сделали COM Application Model, затем нарвались на тормоза (а это действительно самый неудачный способ применения ремоутинга) и начали изобретать свои собственные велосипеды. Не проще было бы с самого начала перейти на stateless модель, либо уж если оставлять stateful, то взять более отработанные решения типа клонирования.

V>Хоть это все вероятно и выглядит мудренно, зато в итоге порождает совсем немного целевого бизнес-кода, именно фреймворк берет на себя многие тонкости по организации передачи данных м/у слоями и кешированием данных. (Да, много чего есть в .net, но вот идеологию immediate or lazzy update пришлось конопатить ручками, хотя, вроде, очевидная весчь...)


Ну понятно, без хорошего фрейсворка тут не обойтись

V>Опять же (про бизнес-сущности), оперирование бизнес-сущностями требует ОСМЫСЛЕННОСТИ кода клиента. Хех, кому это надо? На клиента просто приходят ресурсы форм и описание биндинга полей. Что делается на клиенте, так это то, что и должно там делаться: drag&drop, например, и пр. клиентские фишки. (Утрирую, бывает, очень редко, но бывает, что осмысленный код приходится накидывать и на клиенте)


А что понимается под описанием баиндинга полей?

V>Для нормальной работы всей этой кухни, разумеется, пришлось отнаследоваться от всех потенциально требуемых data-aware контролов, для работы в подобной системе, зато формы можно плодить как грибы (накидал ресурсы и ЗАБЫЛ), а разработчик серверной части (т.е. БО-части) вообще практически не задумывается от том, как и кто создает или работает с его объектами...


Вы свой баиндинг изобрели или просто что-то расширили?

V>В общем, есть что пообсуждать.


Всегда
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: Ответ
От: naje  
Дата: 28.01.04 16:26
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Batiskaf, Вы писали:



IT>
IT>struct MyObject
IT>{
IT>    int x;
IT>    int y;
IT>};

IT>void MyMethod(MyObject *this)
IT>{
IT>}
IT>


Чтоб на С ООП эмулировать нужно метод назвать как-то так MyObject_MyMethod(MyObject *this) .
А вобще в С++ техника определения методов класса не членами класса, дает очень много замечательных эффектов, оставаясь ООП при этом.
Re[18]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 28.01.04 16:48
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Batiskaf, Вы писали:


B>>Вот давай я буду этой бестолковой операционисткой а ты будешь этим пионером, или наоборот, если хочешь .Net реализация АОП тебе не нравится, да?


IT>Да её там почти нет.

Хоть это и имеет отношение другому спору, но Мика таки своего добился

B>>Раз уж заговорили о количестве траха, то для сравнения я возьму тот же пример из статьи, все тот же Point, Line, DisplayUpdateAspect и попытаюсь выразить это на плюсах, а потом сравним со статьей.



IT>Это всё извращения на тему как сэмулировать AOP любыми доступными средствами. Я в своё время, когда меня заставили вернуться опять на C с C++, писал что-то типа такого:


IT>
IT>struct MyObject
IT>{
IT>    int x;
IT>    int y;
IT>};

IT>void MyMethod(MyObject *this)
IT>{
IT>}
IT>


IT>И даже с успехом эмулировал виртуальные функции. Но называть этот изврат ООП у меня как-то язык не поворачивался.

IT>То же самое сейчас ты демонстрируешь на С++. То же самое с RealProxy. То же самое я делаю в RFD с абстрактными классами. Всё это показывает лишь то, что проблема назрела и существует необходимость реализации AOP нормальными языковыми средствами.
Ты забыл отвести 4 байта под виртуальную таблицу Помнится в самом начале существования форума .Net на РСДН я показывал одному джависту что полиморфизм существовал задолго до появления объектно ориентированных языков, что кстати очередной раз подтверждает мысль о том, что при достаточной развитости существующих языков можно безболезненно эмулировать современные парадигмы

IT>В твоём коде я вижу как минимум две проблемы.


IT>1. У тебя всё построено на виртуальных методах, следовательно, твои аспекты применимы только к ним.

Для начала методы в AspectJ так же как бы виртуальные, если только это не final. АОП в .Net ты сам только что зачеркнул. Что же касается С++, то я с легкостью могу применять этот способ и для не виртуальных методов и работать с обьектами по значению, что очень гладко сойдется с парадигмой статического дженерик полиморфизма, но это уже другая история.

IT>2. Пользователь может создать и использовать просто Point, а не DisplayPoint. И тогда к нему придут пионеры.

Только не нужно говорить что ты не внимательно прочел мой пост, виртуальные функции ты заметил, а упоминания про фабрику пропустил. Так на всякий случай хочу напомнить, фабрика на плюсах стоит две строки кода...

IT>3. Комбинирование аспектов в твоём случае приводит к появлению нового аспекта, реализующего эту комбинацию. Соответственно, там где нужно будет написать 2 аспекта тебе придётся делать 3, там где 3 — 7 и т.д. Запутаться не долго. При этом поймать ошибку будет непросто.

Мне кажется я достаточно ясно показал применимость аспекта для Point в рамках 3DPoint, отличный пример повторного использования, не очень понял на что ты намекаешь... Учитывая декларативные особенности языка, этот аспект ты можешь натянуть на другой тип, у которого совпадают имена и прототипы инспектируемых функций (методы setX\setY могут быть не только у точек, ведь правда), это тоже приятная особенность.

B>>Количество вариантов как ты сам понимаешь ростет, а количество телодвижений за счет повторного использования моих же "аспектов" гораздо меньше. Цель применения аспектов лежит в том что бы делать менее связанный, декларативный код, в примере из статьи я этого не вижу. Вот как я могу применить aspect DisplayUpdating в другом месте для другой компоненты в AspectJ, например для 3DPoint??? Они же все hardcoded, там четко прописано к какому методу какого типа все это привязывается, кроме всего нужно уметь понять что тут относится к сетап коду этих аспектов, а что к сквозной функциональности.


IT>Давай не будем пытаться сравнивать академические исследования с коммерческими продуктами. AspectJ — это всего лишь попытки найти правильный путь. Мне тоже не нравится то, что ты называешь hardcoded. Но и ООП не начался с C++, до этого было много других языков, на которых пытались выразить идеи ООП. То что в AspectJ используется пока только 'call' совсем не означает, что мы не можем использовать что-нибудь типа 'attribute', 'baseclass', 'interface' или их комбинации.

Сравнивать я не собирался, ты же сам начал говорить о количестве трахов... Я пытаюсь применить существующие средства, работать нужно сейчас, и выбор делать так же сейчас. И когда еще эти саны с микрософтами снизойдут до наших нужд и решатся привести это в надлежащий вид, сколько споров было про необходимость дженериков в яве к примеру, по началу категорическти не желали этого делать, ведь помнишь же, сколько говорильни было о вреде дженериков и множественного наследования. Наигрались в System.out.println, пошли задачи круче.

B>>А что касательно наследования таких аспектов???


IT>Не вижу необходимости в наследовании Аспекты должны легко комбинироваться, а не наследоваться. Поэтому, например, гораздо важнее может оказаться механизм очерёдности их применения, что-то типа приоритетности.


Тогда может стоит уже прямо сейчас позаботиться о создании аспектов для аспектов... К примеру супер аспекты, которые будут перемешивать все аспекты в кучу, и выделять из них сквозную функциональность, но для этого нужно будет сначала наваять километры аспектных имплементаций в коде, что бы понять что разница между аспектом и классом неожиданно исчезла, ну а потом ждать очередного языкового решения для всех наших бед
Вобщем пора прекращать споры, надоело все это
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[19]: Ответ
От: IT Россия linq2db.com
Дата: 28.01.04 17:21
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>Ты забыл отвести 4 байта под виртуальную таблицу


Не забыл. В этом "классе" нет виртуальных методов, поэтому ему виртуальная таблица не нужна

IT>>1. У тебя всё построено на виртуальных методах, следовательно, твои аспекты применимы только к ним.

B>Для начала методы в AspectJ так же как бы виртуальные, если только это не final.

Здесь ключевое слово 'если'.

B>АОП в .Net ты сам только что зачеркнул.


Ты имеешь ввиду чистый AOP или попытки его эмуляции? Чистого AOP нет ни C++, ни в .NET. Я бы даже сказал, что он пока вообще ещё не сформировался и находится в стадии исследований. То что мы о нём тут рассуждаем, говорит лишь о том, что из чисто академических исследований AOP переходит в стадию исследований технического применения. Вот и всё.

B>Что же касается С++, то я с легкостью могу применять этот способ и для не виртуальных методов и работать с обьектами по значению, что очень гладко сойдется с парадигмой статического дженерик полиморфизма, но это уже другая история.


И потеряешь полиморфность объекта. Кстати, ещё одна проблема:

4. Фактически, ты пораждаешь два класса, когда в AOP можно вполне обойтись одним.

IT>>2. Пользователь может создать и использовать просто Point, а не DisplayPoint. И тогда к нему придут пионеры.

B>Только не нужно говорить что ты не внимательно прочел мой пост, виртуальные функции ты заметил, а упоминания про фабрику пропустил. Так на всякий случай хочу напомнить, фабрика на плюсах стоит две строки кода...

Point p = new Point();


Вот чего стоит вся твоя фабрика. Была фабрика и нет фабрики.

IT>>3. Комбинирование аспектов в твоём случае приводит к появлению нового аспекта, реализующего эту комбинацию. Соответственно, там где нужно будет написать 2 аспекта тебе придётся делать 3, там где 3 — 7 и т.д. Запутаться не долго. При этом поймать ошибку будет непросто.

B>Мне кажется я достаточно ясно показал применимость аспекта для Point в рамках 3DPoint, отличный пример повторного использования, не очень понял на что ты намекаешь... Учитывая декларативные особенности языка, этот аспект ты можешь натянуть на другой тип, у которого совпадают имена и прототипы инспектируемых функций (методы setX\setY могут быть не только у точек, ведь правда), это тоже приятная особенность.

Я намекаю на то, что если у тебя есть аспект A и аспект B, то для того чтобы их оба применить к объекту, тебе придётся написать аспект C, который будет являтся комбинацией первых двух. Короче, к одному типу объекта ты можешь применить только один аспект.

B>Сравнивать я не собирался, ты же сам начал говорить о количестве трахов... Я пытаюсь применить существующие средства, работать нужно сейчас, и выбор делать так же сейчас.


Это совсем другой разговор. Весь сыр бор в этой ветке был затеян из-за того, что ГВ начал утверждать, что аспекты не дают никаких преимуществ по сравнению с существующими средствами. Вот это я и пытаюсь опровергнуть. Если ты мне хочешь показать применение существующих средств, то я не против посмотреть, но не надо только меня и других убеждать в том, что это как раз он самый идеал и есть.

IT>>Не вижу необходимости в наследовании Аспекты должны легко комбинироваться, а не наследоваться. Поэтому, например, гораздо важнее может оказаться механизм очерёдности их применения, что-то типа приоритетности.


B>Тогда может стоит уже прямо сейчас позаботиться о создании аспектов для аспектов... К примеру супер аспекты, которые будут перемешивать все аспекты в кучу, и выделять из них сквозную функциональность, но для этого нужно будет сначала наваять километры аспектных имплементаций в коде, что бы понять что разница между аспектом и классом неожиданно исчезла, ну а потом ждать очередного языкового решения для всех наших бед


Зачем что-то перемешивать? Один аспект накладывается на целевой объект за другим, какие проблемы. Они вообще ничего друг о друге знать не должны.
Если нам не помогут, то мы тоже никого не пощадим.
Re[20]: Ответ
От: Batiskaf Израиль http://www.mult.ru/
Дата: 29.01.04 11:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Batiskaf, Вы писали:


Не желаю я продолжать это ненужный спор, просто хочется что бы исчезло недопонимание, так что вынужден отправить алаверды...

IT>>>1. У тебя всё построено на виртуальных методах, следовательно, твои аспекты применимы только к ним.

B>>Для начала методы в AspectJ так же как бы виртуальные, если только это не final.

IT>Здесь ключевое слово 'если'.


Интересно, а не виртуальными ли станут методы этого же Point, если ты решишь завести несколько имплементаций, например точку с обновлением экрана и точку как логическую координату...

B>>АОП в .Net ты сам только что зачеркнул.


IT>Ты имеешь ввиду чистый AOP или попытки его эмуляции? Чистого AOP нет ни C++, ни в .NET. Я бы даже сказал, что он пока вообще ещё не сформировался и находится в стадии исследований. То что мы о нём тут рассуждаем, говорит лишь о том, что из чисто академических исследований AOP переходит в стадию исследований технического применения. Вот и всё.


B>>Что же касается С++, то я с легкостью могу применять этот способ и для не виртуальных методов и работать с обьектами по значению, что очень гладко сойдется с парадигмой статического дженерик полиморфизма, но это уже другая история.


IT>И потеряешь полиморфность объекта. Кстати, ещё одна проблема:

Ты же только что упрекал меня в том, что мои аспекты насаживаются только на вируальные методы? Если я не ошибаюсь, в До диез других средств для реализации полиморфизма пока что не существует... Просто в плюсах есть еще одна форма полиморфизма, не менее мощная, тот же vector<T> это еще какой полиморфизм, особенно когда ты меняешь один typedef и весь твой алгоритм приобретает другую предметную область.

IT>4. Фактически, ты пораждаешь два класса, когда в AOP можно вполне обойтись одним.

Ок, сначала ты все таки прийдешь к пониманию того, что аспект это то же класс, ну а потом станет понятно что у аспектов, которые насаживаются на разные классы может быть общая функциональность,инициализация к примеру, как в моем примере у аспектов 3DPointLockAspec и PointLockAspect есть общая функциональность LockAspectBase<Base>. Так что все дороги ведут к наследованию аспектов, иначе будет дублирование кода. И чем в таком случае аспект отличается от класса???

IT>>>2. Пользователь может создать и использовать просто Point, а не DisplayPoint. И тогда к нему придут пионеры.

B>>Только не нужно говорить что ты не внимательно прочел мой пост, виртуальные функции ты заметил, а упоминания про фабрику пропустил. Так на всякий случай хочу напомнить, фабрика на плюсах стоит две строки кода...

IT>
IT>Point p = new Point();
IT>


IT>Вот чего стоит вся твоя фабрика. Была фабрика и нет фабрики.


IT>>>3. Комбинирование аспектов в твоём случае приводит к появлению нового аспекта, реализующего эту комбинацию. Соответственно, там где нужно будет написать 2 аспекта тебе придётся делать 3, там где 3 — 7 и т.д. Запутаться не долго. При этом поймать ошибку будет непросто.

B>>Мне кажется я достаточно ясно показал применимость аспекта для Point в рамках 3DPoint, отличный пример повторного использования, не очень понял на что ты намекаешь... Учитывая декларативные особенности языка, этот аспект ты можешь натянуть на другой тип, у которого совпадают имена и прототипы инспектируемых функций (методы setX\setY могут быть не только у точек, ведь правда), это тоже приятная особенность.

IT>Я намекаю на то, что если у тебя есть аспект A и аспект B, то для того чтобы их оба применить к объекту, тебе придётся написать аспект C, который будет являтся комбинацией первых двух. Короче, к одному типу объекта ты можешь применить только один аспект.


Ок, подитожим 2 и 3 пункты... Давай подсчитаем количество твоих телодвижений на С диез:

Сначала у тебя есть Point:


class PointBase
{
    //base functional
    virtualvoid setX(...);
    ...
    ...
};


Этот класс без единого аспекта, или если разработчики языка предусмотрят механизм затирания предыдущих аспектов, то тогда конечно да, но насколько я понимаю об этом никто еще в серьёз не задумывается...

теперь выводим точку с аспектом:


class UIPoint : public PointBase
{
virtual    void setX(...)
{
    base.setX(...);
}
...
...
};

aspect UIPointDisplayAspect
{
    call UIPoint.setX || bla bla
};


захотелось иметь точки с дисплей аспектом и мютексами одновременно — благо наследуя от UIPoint ты наследуешь и его аспект, но наследоваться тебе нужно по любому, потому что тебе же нужно поставить фильтр на конкретные вызова конкретного типа ( call ConcreteType.concreteMethodName ), та же ситуация с идеей аттрибутов, тебе же нужно его вешать на конкретный метод, значит обьявить тебе его в наследнике прийдется, и имплементация его будет конечно же base.methodName.


class UIPointWithLock : public UIPoint
{
virtual    void setX(...)
{
    base.setX(...);
}
...
...
};

aspect UIPointLockAspect
{
    call UIPointWithLock.setX || bla bla
}


Либо нужно выдумывать динамический байнд атрибутов( аспектов ) на твои типы, типа сказать что с классом Point примени сейчас аспект номер один а теперь аспект номер 2 + номер 5. Но в таком случае создание инстанса класса уже не будет выглядеть так празднично как ты показывал:

вместо

Point p = new Point();


должна быть какая то конструкция что бы указать комбинацию аспектов, применительно к базовому классу, в лучшем случае как то так:

uses UIPointLockAspect
{
    Point p = new Point();
}

Так что думаю ты еще вернешься к фабрикам, и посмотришь чего они стоят на самом деле.

Что касается комбинирования "аспектов" в моем случае, то хотелось бы устранить недопонимание, для того что бы создать UIPointWithLock я должен определить класс PointBase, и два аспекта, которые надеваются один на другой совершенно без ограничений, по принципу:


struct  Type
{
    virtual void F1()
    {    }
};

template<typename Base>
struct Aspect1 : public Base
{
    virtual void F1()
    {
        //aspect operations
        Base::F1();
    }    
};

template<typename Base>
struct Aspect2 : public Base
{
    virtual void F1()
    {
        //aspect operations
        Base::F1();
    }    
};

typedef    Aspect1<Type>    Type1;
typedef    Aspect2<Type>    Type2;
typedef    Aspect1<Type2>    Type3;
typedef    Aspect3<Type3>    Type4;
....

Теперь понятно что ограничений нет ни каких, а так же прекрасно видно кто больше должен ваять классов и аспектов, вся фишка в том, что слово typedef умеет порождать тип из предложенных шаблонов, в AspectJ таких конструкций к сожалению пока что нет...

Мне кажется самое время подвести черту под этим спором, АОП пока что ценна исключительно идеологически, применять это можно и нужно существующими средствами, думаю что после прочтения этой скандальной темы у многих изменятся требования к этим средствам.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[3]: Статья про АОП
От: mSerg Украина  
Дата: 29.01.04 14:58
Оценка:
Здравствуйте, Miem, Вы писали:

[Skipped]

http://msdn.microsoft.com/msdnmag/issues/02/03/aop/
WBR, Serg Matskov
Re[21]: Ответ
От: IT Россия linq2db.com
Дата: 30.01.04 03:37
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>Не желаю я продолжать это ненужный спор...




IT>>>>1. У тебя всё построено на виртуальных методах, следовательно, твои аспекты применимы только к ним.

B>>>Для начала методы в AspectJ так же как бы виртуальные, если только это не final.

IT>>Здесь ключевое слово 'если'.


B>Интересно, а не виртуальными ли станут методы этого же Point, если ты решишь завести несколько имплементаций, например точку с обновлением экрана и точку как логическую координату...


Давай выйдем из рамок твоего примера и посмотрим ширше. Так ли уж редки не виртуальные методы? В БЛ они сплошь и рядом.

IT>>И потеряешь полиморфность объекта. Кстати, ещё одна проблема:

B>Ты же только что упрекал меня в том, что мои аспекты насаживаются только на вируальные методы?

Я тебя упрекал за негибкость дизайна, а не за виртуальные методы.

IT>>4. Фактически, ты пораждаешь два класса, когда в AOP можно вполне обойтись одним.

B>Ок, сначала ты все таки прийдешь к пониманию того, что аспект это то же класс, ну а потом станет понятно что у аспектов, которые насаживаются на разные классы может быть общая функциональность,инициализация к примеру, как в моем примере у аспектов 3DPointLockAspec и PointLockAspect есть общая функциональность LockAspectBase<Base>. Так что все дороги ведут к наследованию аспектов, иначе будет дублирование кода. И чем в таком случае аспект отличается от класса???

Как минимум назначением. Обычные классы реализуют логику приложения, аспекты реализуют логику построения и взаимодейсивия классов. А так конечно же это классы, в шарпе и java, например, вообще нельзя написать метод вне класса

IT>>Я намекаю на то, что если у тебя есть аспект A и аспект B, то для того чтобы их оба применить к объекту, тебе придётся написать аспект C, который будет являтся комбинацией первых двух. Короче, к одному типу объекта ты можешь применить только один аспект.


B>Ок, подитожим 2 и 3 пункты... Давай подсчитаем количество твоих телодвижений на С диез:


[skip]

B>Этот класс без единого аспекта, или если разработчики языка предусмотрят механизм затирания предыдущих аспектов, то тогда конечно да, но насколько я понимаю об этом никто еще в серьёз не задумывается...


О! Вот ты уже и думаешь в правильном направлении, нужен развитый механизм применения аспектов и всё. После этого все твои дальнейшие рассуждения становяться излишними

B>Либо нужно выдумывать динамический байнд атрибутов( аспектов ) на твои типы, типа сказать что с классом Point примени сейчас аспект номер один а теперь аспект номер 2 + номер 5. Но в таком случае создание инстанса класса уже не будет выглядеть так празднично как ты показывал:


При чём тут создание инстанса? Ты опять сам ответил на свой вопрос — шарповские атрибуты почти идеальный способ указания к чему применять, а к чему не применять атрибуты.

B>Что касается комбинирования "аспектов" в моем случае, то хотелось бы устранить недопонимание, для того что бы создать UIPointWithLock я должен определить класс PointBase, и два аспекта, которые надеваются один на другой совершенно без ограничений, по принципу:


B>
B>typedef    Aspect1<Type>    Type1;
B>typedef    Aspect2<Type>    Type2;
B>typedef    Aspect1<Type2>    Type3;
B>typedef    Aspect3<Type3>    Type4;
B>....
B>


Ну сколько можно повторять У этого решения есть один серьёзный недостаток. Мне никто не мешает использовать Type напрямую. Если для тебя это не проблема, то для меня проблема и довольно большая. Я сегодня потратил пол часа на то, чтобы выяснить, что один тупой китаец использовал вот такой вот Type вместо TypeProxy. А стоять постоянно рядом с линейкой и... "объяснять ему каждый раз где и в чём он не прав" у меня нет никакого желания. Мне проще было бы сделать так, что бы он просто физически не мог ошибиться.

B>Теперь понятно что ограничений нет ни каких, а так же прекрасно видно кто больше должен ваять классов и аспектов, вся фишка в том, что слово typedef умеет порождать тип из предложенных шаблонов, в AspectJ таких конструкций к сожалению пока что нет...


Ну, во-первых, typedef никаких новых типов не порождает, элиас он и в африке элиас. А, во-вторых, мы не обсуждаем зедсь конкретную реализацию AOP, каковой является AspectJ.

B>Мне кажется самое время подвести черту под этим спором, АОП пока что ценна исключительно идеологически, применять это можно и нужно существующими средствами, думаю что после прочтения этой скандальной темы у многих изменятся требования к этим средствам.


Я уже говорил, что выражение AOP существующим средствами — это всё равно что эмулировать OOP на голом C. Это делать можно и даже нужно, даже Страуструп начинал с препроцессора, который назывался C with classes, но настоящим ООП языком C от этого так и не стал.

Если же говорить о тех академических языках, которые сейчас реализуют AOP, то в них невооружённым взглядом видно как минимум две больших проблемы:

1. Слабые средства для описания применения атрибута к конкретному классу/методу.
2. Полное отсутствие средств работы с метадатой компилируемого кода.

Если найти красивые решения для этих проблем, то реализация того же C# with aspects представляется не такой уж неосуществимой задачей
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: Ответ
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.01.04 13:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>Если найти красивые решения для этих проблем, то реализация того же C# with aspects представляется не такой уж неосуществимой задачей

Ну так велком ту здесь!
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[23]: Ответ
От: IT Россия linq2db.com
Дата: 30.01.04 14:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

IT>>Если найти красивые решения для этих проблем, то реализация того же C# with aspects представляется не такой уж неосуществимой задачей

S>Ну так велком ту здесь!

Всё под контролем. Пусть там сначала мужики бурьян порубят, площадку спланируют, котлован выроют и фундамент зальют
Если нам не помогут, то мы тоже никого не пощадим.
Re[24]: Ответ
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.04 16:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Всё под контролем. Пусть там сначала мужики бурьян порубят, площадку спланируют, котлован выроют и фундамент зальют


Так эта... ужо. Порубили, спланировали... даже альфа парсера пашет.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Ответ
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.01.04 21:34
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Это вы пока котлован роете. А вот как начнете обсуждение, в какую сторону расширять и углублять C# — вот тут-то и пойдет заливка фундамента. Кровью и слюнями .


Видишь ли какое дело — улучшение шарпа дело десятое. Пока задача номер один — создание "синтаксического препроцессора". А уж на основе него будут реализовываться и расширения шарпа и АОП и много чего еще.
... << RSDN@Home 1.1.3 beta 1 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[2]: Бардак ещё не аргумент
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 03.02.04 09:26
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>Что-то я не понял выделенной фразы. Причём тут бедность или богатство? А... кажется дошло. Это только бедные думают и работают... Хм. А богатые что делают?


VD>О!!!... У них есть одна большая задача. Они думают как не работать.


Ну... тоже ведь думают как-никак... Что-то совсем я запутался...
... << RSDN@Home 1.1.2 beta 2 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Оффтоп, в общем-то
От: Eugals Россия  
Дата: 05.02.04 12:37
Оценка:
Почему-то мой Janus упорно не хочет эту тему закачивать, а обсуждение получилось довольно интересное...
Пишу данное сообщение в надежде, что хоть в этом случае янус обратит сюда внимание...

Ну, а чтобы уж не совсем бесполезное сообщение было, скажу пару слов "в тему"
Вот тут многие соглашались, что "нормальной" реализации АОП сейчас фактически не существует.
Может оно и так, только хочу напомнить про язык Python — в нем возможность существования сквозной функциональности была заложена изначально. уже почти 10 лет как.
А после доработок (в работе метаклассов) сделанных в версиях 2.0-2.2 всё и вовсе стало почти идеально
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.