Основная цель состоит в предоставлении средств опосредованного представления и доступа к объектам. Это означает, что программист имеет возможность описать не только структуру и функции объектов, но также структуру и функции ссылок, которые используются для их представления. В КОП ссылки являются таким же полноценным элементом программы, как и объекты.
Для описания объектов и ссылок предлагается новая конструкция, называемая концептом. Концепт это пара классов, состоящая из одного класса объектов и одного класса ссылок. Концепт без класса ссылки это самый обычный класс из ООП. Экземпляры класса объектов называются объектами и передаются только по ссылке (формат которой в КОП может определяться программистом). Экземпляры класса ссылок передаются только по значению и предназначены для представления объектов. В концептно-ориентированной программе концепты используются вместо классов.
Концепты связаны отношением включения, которое обобщает наследование. Объект концепта представляется ссылками его базового концепта, В общем случае объект представляется последовательностью ссылок всех своих базовых концептов. Это то же самое, что и иерархическая адресация, например, почтовые адреса. Во время выполнения объекты живут внутри иерархии, т.е. иерархии существует не только во время компиляции, но и сохраняется и поддерживается во время выполнения. В контексте каждого объекта может существовать множество дочерних объектов. В этом смысле каждый объект работает как контейнер или жизненное пространство для внутренних объектов (за которые он в ответе).
Зачем это нужно? Делается общее предположение, объекты живут в структурированном пространстве, разделенные границами. Доступ в этом случае всегда опосредован, т.е. прямого доступа не существует. Чтобы достать объект, скажем, выполнить его метод, необходимо пересечь промежуточные границы. На этих границах в процессе доступа выполняется множество важных и полезных функций. Задачей программиста в этом случае (в КОП) является описание того, как объекты представляются, и что будет происходить при доступе к ним.
Здравствуйте, savinov, Вы писали:
S>Концепты связаны отношением включения, которое обобщает наследование. Объект концепта представляется ссылками его базового концепта, В общем случае объект представляется последовательностью ссылок всех своих базовых концептов. Это то же самое, что и иерархическая адресация, например, почтовые адреса. Во время выполнения объекты живут внутри иерархии, т.е. иерархии существует не только во время компиляции, но и сохраняется и поддерживается во время выполнения. В контексте каждого объекта может существовать множество дочерних объектов. В этом смысле каждый объект работает как контейнер или жизненное пространство для внутренних объектов (за которые он в ответе).
S>Зачем это нужно? Делается общее предположение, объекты живут в структурированном пространстве, разделенные границами. Доступ в этом случае всегда опосредован, т.е. прямого доступа не существует. Чтобы достать объект, скажем, выполнить его метод, необходимо пересечь промежуточные границы. На этих границах в процессе доступа выполняется множество важных и полезных функций. Задачей программиста в этом случае (в КОП) является описание того, как объекты представляются, и что будет происходить при доступе к ним.
Фреймы Мински что-ли? Я из этого описания отличий не вижу...
Здравствуйте, buriy, Вы писали:
B>Здравствуйте, savinov, Вы писали:
S>>Концепты связаны отношением включения, которое обобщает наследование. Объект концепта представляется ссылками его базового концепта, В общем случае объект представляется последовательностью ссылок всех своих базовых концептов. Это то же самое, что и иерархическая адресация, например, почтовые адреса. Во время выполнения объекты живут внутри иерархии, т.е. иерархии существует не только во время компиляции, но и сохраняется и поддерживается во время выполнения. В контексте каждого объекта может существовать множество дочерних объектов. В этом смысле каждый объект работает как контейнер или жизненное пространство для внутренних объектов (за которые он в ответе).
S>>Зачем это нужно? Делается общее предположение, объекты живут в структурированном пространстве, разделенные границами. Доступ в этом случае всегда опосредован, т.е. прямого доступа не существует. Чтобы достать объект, скажем, выполнить его метод, необходимо пересечь промежуточные границы. На этих границах в процессе доступа выполняется множество важных и полезных функций. Задачей программиста в этом случае (в КОП) является описание того, как объекты представляются, и что будет происходить при доступе к ним.
B>Фреймы Мински что-ли? Я из этого описания отличий не вижу...
Насколько я понимаю, фреймы задумывались для представления знаний, тогда как КОП это подход к программированию, так что особой связи не вижу (хотя и не могу исключать, что таковая имеется).
В статье явным образом не описано, для решения какой проблемы предназначен этот новый подход.
В частности, модульное программирование было придумано для упрощения разработки за счёт разбивки программного текста на модули. ООП — для упрощения моделирования поведения объектов реального мира (в котором, как утветждается, всё является объектами), АОП — для упрощения добавления "сквозной" функциональности.
Всё-таки, для чего предназначен КОП? Для "предоставления средств опосредованного представления и доступа к объектам"? Извините, но мне пока непонятно, зачем мне в принципе может потребоваться опосредованный доступ.
Думаю, прежде, чем предлагать решение проблемы, имело бы смысл эту проблему обозначить. Может быть, Виндовс совсем бы не глючил и не тормозил, если бы он был написан с использованием опосредованного доступа к объектам Может быть, возможность "вклиниться" в оператор разыменования — это именно то, чего мне так не хватало?
B>>Фреймы Мински что-ли? Я из этого описания отличий не вижу...
S>Насколько я понимаю, фреймы задумывались для представления знаний, тогда как КОП это подход к программированию, так что особой связи не вижу (хотя и не могу исключать, что таковая имеется).
Ладно, давай тогда по программированию.
Во многих динамически-типизированных языках (напр. Python, Ruby, Smalltalk) есть возможность естественным образом делать действия перед вызовом метода объекта и перед использованием атрибута объекта. Во многих главным-образом-статически-типизированных языках есть возможность при необходимости использовать proxy вместо объектов (напр. Java, C#). Делаем вывод, что в большинстве языков уже реализованы возможности концептно-ориентированного программирования, но они просто так не называются. ВОпрос, нужно ли этим возможностям такое громкое название? Или это лишь мелкая фича, не заслуживающая рассмотрения?
p.s. Похожий вопрос, что нового дает этот подход, уже поднят тов. Voblin'ом в соседней ветке, так что если ответишь там, то здесь можешь не отвечать.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>Неформальное введение в концептно-ориентированное программирование S>>[list] S>> HTML: http://conceptoriented.com/papers/CopInformalIntroduction-ru.html
V>В статье явным образом не описано, для решения какой проблемы предназначен этот новый подход.
V>В частности, модульное программирование было придумано для упрощения разработки за счёт разбивки программного текста на модули. ООП — для упрощения моделирования поведения объектов реального мира (в котором, как утветждается, всё является объектами), АОП — для упрощения добавления "сквозной" функциональности.
V>Всё-таки, для чего предназначен КОП? Для "предоставления средств опосредованного представления и доступа к объектам"? Извините, но мне пока непонятно, зачем мне в принципе может потребоваться опосредованный доступ.
Дело не в том, может ли опосредованный доступ понадобится или нет. А в том, что любой доступ всегда предполагается опосредованным. Другими словами, просто так достать объект невозможно, поскольку он представлен каким-то куском данных, а значит, кто-то где-то должен знать, как эти данные интерпретировать и использовать для перемещения запроса к объекту. Соответственно, вопрос состоит в том, можем ли мы из программы контролировать как представляются наши объекты и как к них осуществляется доступ. Я таких языков не знаю (хотя может они и есть).
Наверное, с тезисом, что прямого доступа не существует по определению никто спорить не будет. Тогда просто необходимо прикинуть, действительно ли это так важно. Ведь до сих пор эти задачи как-то решались (вручную). Но в этом плане сложно кого-то убедить, и каждый решает сам за себя. В КОП предполагаетя, что описание средств представления и доступа к объектам не менее важно, чем описание самих объектов. Вся программа это два мира: мир объектов и мир ссылок.
V>Думаю, прежде, чем предлагать решение проблемы, имело бы смысл эту проблему обозначить.
В простейшем виде проблема формулируется очень просто: опишите с помощью вашего любимого языка программирования свой собственный формат ссылок и используйте для пары разных классов так, чтобы этой подмены не было видно.
V>Может быть, Виндовс совсем бы не глючил и не тормозил, если бы он был написан с использованием опосредованного доступа к объектам Может быть, возможность "вклиниться" в оператор разыменования — это именно то, чего мне так не хватало?
А он и написан с помощью средств опосредованного доступа, поскольку в практически любой более или менее сложной программе надо сразу думать как будут представляться объекты и о логике доступа к ним. Далее это можно реализовать вручную, а можно как-то автоматизировать. КОП как раз и предлагает такую автоматизацию. Например, когда строят дом, то в нем делают дверь, а там сажают вахтера и нагружают его определенными полномочиями. Теперь просто так никто туда не войдет, причем независимо от цели (т.е. от вызванного целевого метода). То же самое с объектами. Я хочу контролировать доступ к объектам, чтобы никто не вломился на мой комп, в мой файл или еще куда-то. Обычно для этого при каждом доступе в 1000 мест в программе ставят проверки, но в 1001 месте забывают с печальными последствиями. В КОП поступают иначе. Мы просто вкладываем целевой класс в какой-то концепт, а далее его объекты будут представляться как нужно и доступаться как нужно. Т.е. у нас появляется вахтер, который знает, как интерпретировать ссылки и что делать при попытке доступа. Преимущество: мы используем объекты как обычно и не должны знать об этих деталях, но при этом гарантируется, что любой доступ находится под принудительным контролем.
Здравствуйте, buriy, Вы писали:
B>>>Фреймы Мински что-ли? Я из этого описания отличий не вижу...
S>>Насколько я понимаю, фреймы задумывались для представления знаний, тогда как КОП это подход к программированию, так что особой связи не вижу (хотя и не могу исключать, что таковая имеется).
B>Ладно, давай тогда по программированию.
B>Во многих динамически-типизированных языках (напр. Python, Ruby, Smalltalk) есть возможность естественным образом делать действия перед вызовом метода объекта и перед использованием атрибута объекта. Во многих главным-образом-статически-типизированных языках есть возможность при необходимости использовать proxy вместо объектов (напр. Java, C#). Делаем вывод, что в большинстве языков уже реализованы возможности концептно-ориентированного программирования, но они просто так не называются. ВОпрос, нужно ли этим возможностям такое громкое название? Или это лишь мелкая фича, не заслуживающая рассмотрения?
Зачатки подхода безусловно существуют. В частности, сильно развиты средства перехвата доступа. Вот чего точно нет:
Определение собственного формата ссылок, который далее приписывается для использования разными целевыми классами объектов с сохранением прозрачности доступа.
Собственный означает, что я сам определяю его в своей программе для обслуживания своих объектов. Это аналогично введению собственной системы адресации. Например, я не хочу пользоваться почтовым адресом в виде Город-Улица-Дом, а хочу что-то свое, скажем, свою адресацию внутри свой организации. Так же и в программе, зачем мне использовать универсальные ссылки Явы, если я знаю, что объекты какого-то класса живут только 5 минут, занимают не более 10 байт памяти и имеют еще какие-то спец. свойства? Ясно, что нужны особые средства обозначения и управления такими объектами. Можно сделать это вручную, но можно автоматизировать с помощью КОП. Результат: объекты этого (и других выбранных) классов будут использоваться как обычно, т.е. myObject.myMethod(), но на самом деле система позаботится о том, чтобы они обозначались правильными ссылками и правильно доступалсиь.
Прокси имеет два главных недостатка. Во-первых, это никак не решает проблему с произвольным форматом ссылок. Во-вторых, прокси заточен под один целевой класс. В любом случае, прокси знает о целевом классе и его функциях. В результате в программе мы используем непосредственно сам прокси: myProxy.myMethod(). Нам же надо все наоборот: мы хотим использовать целевом объект, а перехватчик должен встревать незаметно для глаза. Вахтер не должен знать, что происходит внутри здание и его функции. Его задача ограничивается функциями проверки, маршрутизации и т.п., а бизнес-логика уже будет выполнена другими объектами внутри здания (которые не должны быть связаны с функциями вахтера).
B>p.s. Похожий вопрос, что нового дает этот подход, уже поднят тов. Voblin'ом в соседней ветке, так что если ответишь там, то здесь можешь не отвечать.
Коротко: мы можем моделировать не только объекты, но их представление с доступом. (ссылки и их функции)
Например, как понимается следующий вызов:
myAccount.getBalance()
Обычно предполагается, что просто происходит вызов метода. Просто здесь означает как раз непосредственный (прямой) доступ к объекту. В КОП это не так. Ссылка myAccount вполне может быть толстой и включать кучу информации о реальном расположении объекта. В конце концов, кто сказал, что этот счет находится на моем компе в куче? Может быть это счет марсианина в марсианском банке на Марсе. Но с другой стороны, мне в общем, безразлично, чей это счет и где он находится, поскольку я хочу просто получить остаток. Соответственно, в КОП этот вызов может означать кучу промежуточных (автоматически выполненных) действий, связанных с доступом на Марс. Но суть в том, что внешне выглядит это как обычный метод, т.е. все эти детали эффективно скрыты. Кроме того, этот же механизм доступа на Марс я могу использовать и для других классов, поскольку он разрабатывается независимо от того, кого обслуживает. Действительно, космическому кораблю должно быть без разницы кого везти на Марс. Ну и еще одно свойство. Мы по-прежнему используем сам целевой объект, а не его заместителя (как в прокси).
Здравствуйте, savinov, Вы писали:
S>...Т.е. у нас появляется вахтер, который знает, как интерпретировать ссылки и что делать при попытке доступа. Преимущество: мы используем объекты как обычно и не должны знать об этих деталях, но при этом гарантируется, что любой доступ находится под принудительным контролем.
И?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, savinov, Вы писали:
E>>Очень много там всего написано и вообще складывается впечатление, что жизнь в "концептно-ориентированном программировании" бьет ключем. А реально это где-нибудь воплощено? Так сказать "в железе", в каких-нибудь языках, инструментах?
S>Нет не воплощено. И планов таковых нет. А зачем собственно воплощать? От этого только все хуже станет.
Так в чем смысл?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, savinov, Вы писали:
S>Коротко: мы можем моделировать не только объекты, но их представление с доступом. (ссылки и их функции)
S>Например, как понимается следующий вызов: S>
myAccount.getBalance()
S>... S>Соответственно, в КОП этот вызов может означать кучу промежуточных (автоматически выполненных) действий, связанных с доступом на Марс. Но суть в том, что внешне выглядит это как обычный метод, т.е. все эти детали эффективно скрыты.
Но это же тот самый прокси, который описан в GoF и знаком многим тысячам программистов!!! И зачем это называть новой парадигмой программирования?
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
E>>>Очень много там всего написано и вообще складывается впечатление, что жизнь в "концептно-ориентированном программировании" бьет ключем. А реально это где-нибудь воплощено? Так сказать "в железе", в каких-нибудь языках, инструментах?
S>>Нет не воплощено. И планов таковых нет. А зачем собственно воплощать? От этого только все хуже станет.
E>Так в чем смысл?
Я не знаю. У каждого свой. Некоторые говорят, что смысла вообще нет, а есть секс, и в этом весь секс Ну а если серьезно, то конечно реализовать это было бы интересно, но просто всему свое время и для всего свои люди. У меня есть документ с дизайном и спецификацией языка, но для реализации еще рано. Есть ряд проблем, которые надо решить, ну и конечно нужны ресурсы. В общем, это совершено другая задача и для нее нужно свое, время свои люди и спрос.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, savinov, Вы писали:
S>>Нет не воплощено. И планов таковых нет. А зачем собственно воплощать? От этого только все хуже станет.
FDS> Ответ достойный форума "философия программирования". Для чего же тогда вы тогда эту тему вытащили, если только хуже станет?
Ну как для чего? С целью информирования. Мало ли, может кому-то понравится, и он захочет поковыряться в этом. Ну или где-то есть что-то подобное. В общем, без всякой задней мысли.
Здравствуйте, savinov, Вы писали:
S>Дело не в том, может ли опосредованный доступ понадобится или нет. А в том, что любой доступ всегда предполагается опосредованным. Другими словами, просто так достать объект невозможно, поскольку он представлен каким-то куском данных, а значит, кто-то где-то должен знать, как эти данные интерпретировать и использовать для перемещения запроса к объекту.
В классике предполагается, что каждый объект характеризуется OID и доступ к его внутренностям идёт после того, как этот самый объект по этому самому OID получен. Если мы говорим об экземплярах класса в C++, то адрес в памяти и является этим самым OID. Иногда, конечно, это бывает не удобно. Классический пример — программы, работающие с базой данных, где, записи, представляющие объекты, как правило уже имеют свой OID (первичный ключ).
S>В КОП предполагаетя, что описание средств представления и доступа к объектам не менее важно, чем описание самих объектов. Вся программа это два мира: мир объектов и мир ссылок.
До сих пор я думал, что вся программа — это алгоритмы и структуры данных (с) Н.Вирт
S>В простейшем виде проблема формулируется очень просто: опишите с помощью вашего любимого языка программирования свой собственный формат ссылок и используйте для пары разных классов так, чтобы этой подмены не было видно.
Всё же, всё же... Зачем мне это может понадобиться? Я даже более-менее подходящий пример придумать не могу!
V>>Может быть, Виндовс совсем бы не глючил и не тормозил, если бы он был написан с использованием опосредованного доступа к объектам Может быть, возможность "вклиниться" в оператор разыменования — это именно то, чего мне так не хватало?
S>А он и написан с помощью средств опосредованного доступа, поскольку в практически любой более или менее сложной программе надо сразу думать как будут представляться объекты и о логике доступа к ним. Далее это можно реализовать вручную, а можно как-то автоматизировать. КОП как раз и предлагает такую автоматизацию.
Мне больше нравится такая автоматизация:
Set xls = CreateObject("Excel.Application")
wb = xls.Workbooks.Open"C:\MyFile.xls"
И всем (и особенно мне) от этого ХОРОШО
S>Т.е. у нас появляется вахтер, который знает, как интерпретировать ссылки и что делать при попытке доступа. Преимущество: мы используем объекты как обычно и не должны знать об этих деталях, но при этом гарантируется, что любой доступ находится под принудительным контролем.
Это не вахтёр, а прямо профессор какой-то! Он не только досконально знает всё, что происходит в доме, но и знает всю подноготную о тех, кто в принципе туда может войти.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>Коротко: мы можем моделировать не только объекты, но их представление с доступом. (ссылки и их функции)
S>>Например, как понимается следующий вызов: S>>
myAccount.getBalance()
S>>... S>>Соответственно, в КОП этот вызов может означать кучу промежуточных (автоматически выполненных) действий, связанных с доступом на Марс. Но суть в том, что внешне выглядит это как обычный метод, т.е. все эти детали эффективно скрыты. V>Но это же тот самый прокси, который описан в GoF и знаком многим тысячам программистов!!! И зачем это называть новой парадигмой программирования?
Я здесь прокси в упор не вижу. Я уже отметил и в статье и в предыдущих постах, что с помощью прокси это нельзя сделать по следующим причинам:
Невозможно описать свой формат ссылок. Вы можете описать промежуточный объект, который является объектом, а не ссылкой, а потому сам имеет какую-то ссылку и с ним возникают те же проблемы, что и с обычными объектами.
Прокси заточен под целевой класс, т.е. он явно о нем знает и не может без него существовать. Т.е. первым мы разрабатываем целевой класс (поскольку ему не нужен прокси -- он о нем ничего не знает), а потом уже прокси. Одно очень паршивое следствие состоит в том, что при каждом изменении целевого класса необходимо следить за прокси (откуда ошибки).
Нельзя использовать один прокси для многих целевых классов. Например, мы хотим разработать прокси ProxyForMarsObjects, а затем использовать его для доступа к объектам на Марсе, имеющих самый разный класс, который заранее не известен. Как это сделать? Я такого способа не знаю. Если знаете, то опишите, пожалуйста (а также см. п.1).
Ну и в программе мы хотим использовать непосредственно целевые объекты, например, myAccount.getBalance(), тогда как в прокси мы вынуждены работать с посредником: myAccountProxy.getBalance(). Чувствуете разницу? Я ведь знать не хочу сколько и какие там есть посредники. Я хочу иметь ссылку на счет и получить баланс. А прокси предлагает мне использовать какой-то другой объект. А вдруг в будущем этот счет будет представляться по-другому? Тогда в прокси-варианте я должен буду по всей программе поменять MarsProxy на LunaProxy. А в КОП я всегда работаю с целевым классов независимо от способа представления.
Разберитесь, пожалуйста, в этом списке. Он очень важен. Даже если Вам не нравится КОП, то необходимо понимать принципы и недостатки прокси. В каком-то смысле прокси это весьма кривой способ реализовать опосредование с помощью обычных языков программирования. (Я уже не говорю о том, что наличие большого числа паттернов есть признак кризиса в теории.)
Здравствуйте, savinov, Вы писали:
S>Ну как для чего? С целью информирования. Мало ли, может кому-то понравится, и он захочет поковыряться в этом. Ну или где-то есть что-то подобное. В общем, без всякой задней мысли.
Дедушка Фрейд посмеялся бы от души над этой фразой и по форме, и по содержанию.
А если серьёзно, то без всякой задней мысли даже комар не кусает. Если есть идея сделать тему диссертабельной, то рекомендуется сразу задуматься над разделами "Актуальность темы исследования", "Степень научной разработанности проблемы" и "Научная новизна и практическая значимость".
Пока нет чётко сформулированного ответа на вопрос "А зачем, собственно, всё это великолепие нужно для построения светлого коммуни... тьфу! постиндустриального будущего?", не стоит даже пытаться парить мозги уважаемым членам диссертационного совета (или как он там нынче называется?). Съедят и даже косточками не подавятся. И, по-правде сказать, будут правы!
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>Дело не в том, может ли опосредованный доступ понадобится или нет. А в том, что любой доступ всегда предполагается опосредованным. Другими словами, просто так достать объект невозможно, поскольку он представлен каким-то куском данных, а значит, кто-то где-то должен знать, как эти данные интерпретировать и использовать для перемещения запроса к объекту. V>В классике предполагается, что каждый объект характеризуется OID и доступ к его внутренностям идёт после того, как этот самый объект по этому самому OID получен. Если мы говорим об экземплярах класса в C++, то адрес в памяти и является этим самым OID. Иногда, конечно, это бывает не удобно. Классический пример — программы, работающие с базой данных, где, записи, представляющие объекты, как правило уже имеют свой OID (первичный ключ).
Т.е. происходит что-то вроде этого:
Lock(memHandle);
mem =Resolve(memHandle);
mem->myMethod();
Unlock(memHandle);
Такой подход имеет следующие недостатки. Один и тот же код повторяется по всей программе (а что если что-то изменится в последовательности доступа). Я вовсе не хочу заниматься какими-то вспомогательными процедурами, а просто хочу вызвать метод по ссылке. Зачем такие сложности. Ну и кроме того, получение разрешенной ссылки в контекст, где она используется это очень плохо (небезопасно). Внутреннее представление должно храниться и использоваться внутри, а извне надо использовать внешнее представление. В КОП это выглядело бы так:
memHandle->myMethod();
Преимущества. Мы просто применяем метод к ссылке. Внутренний идентификатор (адрес в памяти) не попадает к нам, и мы не можем ничего испортить. Всегда можно изменить механизм доступа без изменения того, где он используется. Например, можно добавить начало и конец транзакции.
S>>В КОП предполагаетя, что описание средств представления и доступа к объектам не менее важно, чем описание самих объектов. Вся программа это два мира: мир объектов и мир ссылок. V>До сих пор я думал, что вся программа — это алгоритмы и структуры данных (с) Н.Вирт
Так можно до Аристотеля добраться Почему бы не определить программу на компьютере как организованный набор атомов? Общее определение – зато никто не докопается.
S>>В простейшем виде проблема формулируется очень просто: опишите с помощью вашего любимого языка программирования свой собственный формат ссылок и используйте для пары разных классов так, чтобы этой подмены не было видно. V>Всё же, всё же... Зачем мне это может понадобиться? Я даже более-менее подходящий пример придумать не могу!
Вы уже описали такой пример в начале этого поста. Пусть ваши объекты хранятся в БД и имеют ключ в качестве идентификатора. Проблема: вызвать метод можно только по системной ссылке, тогда в наличии имеется только первичный ключ. Тут-то и поможет КОП. Вы описываете класс ссылки, который хранит этот самый ключ. А далее он используется вместо системной ссылки. Например,
myAccount.getBalance();
Кто сказал, что этот объект в памяти или в БД? Это м.б. вовсе не так, поскольку из этой строки это неизвестно. Способ представления объектов класса описывается в самом классе, т.е. в классе Account. Другими словами, мы объявляем в классе Account, что его объекты будут представляться по-особому (нашими ссылками в виде ключа из БД), а после этого каждый доступ окружается в промежуточный метод (который берется из класса ссылки). Этот метод загружает запись, размещает ее в памяти, после чего делает то, что вызывает целевой метод.
V>>>Может быть, Виндовс совсем бы не глючил и не тормозил, если бы он был написан с использованием опосредованного доступа к объектам Может быть, возможность "вклиниться" в оператор разыменования — это именно то, чего мне так не хватало?
S>>А он и написан с помощью средств опосредованного доступа, поскольку в практически любой более или менее сложной программе надо сразу думать как будут представляться объекты и о логике доступа к ним. Далее это можно реализовать вручную, а можно как-то автоматизировать. КОП как раз и предлагает такую автоматизацию. V>Мне больше нравится такая автоматизация: V>
V> Set xls = CreateObject("Excel.Application")
V> wb = xls.Workbooks.Open"C:\MyFile.xls"
V>
V>И всем (и особенно мне) от этого ХОРОШО
Хорошо только до определенного момента (обычно это проходит для малых или средних программ). А что, если этот объект должен находиться в БД? А если он д.б. на другом компе? А если он слишком большой для памяти? А если он слишком мелкий и их очень много? А если им может пользоваться только один процесс? Этот список бесконечен и для всех этих случаев надо писать свой контейнер, а потом вручную управлять объектами в нем. В КОП мы используем объекты точно так, как в этом примере, но при этом они могут находиться где угодно и доступ осуществляться как угодно (что описывается в данной программе).
S>>Т.е. у нас появляется вахтер, который знает, как интерпретировать ссылки и что делать при попытке доступа. Преимущество: мы используем объекты как обычно и не должны знать об этих деталях, но при этом гарантируется, что любой доступ находится под принудительным контролем. V>Это не вахтёр, а прямо профессор какой-то! Он не только досконально знает всё, что происходит в доме, но и знает всю подноготную о тех, кто в принципе туда может войти.
V>А, может быть, не вахтёр, а начальник тюрьмы?
Это государство, т.е., по определению классика, инструмент насилия. В зависимости от того, где объект родился и живет, к нему применяются разные законы. В частности, разные средства обозначения, разный жизненный цикл, разную степень открытости, разное наказание, разные ресурсы и т.п. Как раз на построение такого государства объектов и нацелено КОП. Мы описываем его структуру, законы, границы и т.п. И все это может функционировать сам по себе без объектов.
Здравствуйте, savinov, Вы писали:
S> S> Невозможно описать свой формат ссылок.
Не правда! Прокси может при своей инициализации получить что-то вроде такого:
CAbstractProxy myBalance = new CAbstractProxy("Balance", "MarsComBank", "V.Pupkin");
Сладкая парочка "MarsComBank" и "V.Pupkin" — это и есть совсем новый формат ссылки! S> Прокси заточен под целевой класс, т.е. он явно о нем знает и не может без него существовать. Т.е. первым мы разрабатываем целевой класс (поскольку ему не нужен прокси -- он о нем ничего не знает), а потом уже прокси. Одно очень паршивое следствие состоит в том, что при каждом изменении целевого класса необходимо следить за прокси (откуда ошибки).
Или поручить эту задачу компилятору S> Нельзя использовать один прокси для многих целевых классов. Например, мы хотим разработать прокси ProxyForMarsObjects, а затем использовать его для доступа к объектам на Марсе, имеющих самый разный класс, который заранее не известен. Как это сделать? Я такого способа не знаю. Если знаете, то опишите, пожалуйста (а также см. п.1).
Ну, абстрагироваться от источника данных — это довольно легко. Помнится, ещё лет шесть-семь назад я написал прогу, которая в штатном режиме работала с SQL-сервером, а когда он оказывался недоступным (модем выключили), со вздохом лезла в локальный DBF-кэш. Что характерно, основная логика программы даже не догадывалась, что вместо сиськи теперь у неё соска. И всё это безо всяких КОП. И даже без Design Patterns. На старом добром Дельфи. S> Ну и в программе мы хотим использовать непосредственно целевые объекты, например, myAccount.getBalance(), тогда как в прокси мы вынуждены работать с посредником: myAccountProxy.getBalance(). Чувствуете разницу?
Чувствую. И особенно почувствуют те, кто будет дорабатывать и обезглючивать мою программу. Если в "нормальной" программе глючит myAccount.getBalance(), то я открываю исходник этого самого myAccount.getBalance() и ищу багу там. Но если где-то рядышком болтается ещё куча каких-то непонятных личностей, которые как им заблагорассудится перехватывают вызовы до, после, а также вместо отработки собственно "тела" getBalance(), то я просто сойду с ума! S>
S>Я уже не говорю о том, что наличие большого числа паттернов есть признак кризиса в теории. Согласен
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
E>>>Очень много там всего написано и вообще складывается впечатление, что жизнь в "концептно-ориентированном программировании" бьет ключем. А реально это где-нибудь воплощено? Так сказать "в железе", в каких-нибудь языках, инструментах?
S>>Нет не воплощено. И планов таковых нет. А зачем собственно воплощать? От этого только все хуже станет.
E>Так в чем смысл?
В диссере...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
S>>>Нет не воплощено. И планов таковых нет. А зачем собственно воплощать? От этого только все хуже станет.
E>>Так в чем смысл? LVV>В диссере...
А что сейчас для защиты в области информатики внедрения уже не нужны?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
S>Такой подход имеет следующие недостатки. Один и тот же код повторяется по всей программе (а что если что-то изменится в последовательности доступа). Я вовсе не хочу заниматься какими-то вспомогательными процедурами, а просто хочу вызвать метод по ссылке. Зачем такие сложности. Ну и кроме того, получение разрешенной ссылки в контекст, где она используется это очень плохо (небезопасно). Внутреннее представление должно храниться и использоваться внутри, а извне надо использовать внешнее представление. В КОП это выглядело бы так: S>
S>memHandle->myMethod();
S>
S>Преимущества. Мы просто применяем метод к ссылке. Внутренний идентификатор (адрес в памяти) не попадает к нам, и мы не можем ничего испортить. Всегда можно изменить механизм доступа без изменения того, где он используется. Например, можно добавить начало и конец транзакции.
Может стоит познакомится с динамическими языками? Там подобные перехваты легко реализуются.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>> Невозможно описать свой формат ссылок. V>Не правда! Прокси может при своей инициализации получить что-то вроде такого: V>
V>CAbstractProxy myBalance = new CAbstractProxy("Balance", "MarsComBank", "V.Pupkin");
V>
V>Сладкая парочка "MarsComBank" и "V.Pupkin" — это и есть совсем новый формат ссылки!
Тут видимо какое-то недопонимание что есть ссылка и что есть объект. Ссылка это то, что хранится внутри самой переменной myBalance (а не в объекте, который она представляет). В данном примере там скорее всего хранится целое число, например, 0x12345. Ссылка всегда передается по значению и представляет другие объекты. Соответственно, сама ссылка не является объектом, поскольку не имеет собственной ссылки (она представляет сама себя без посредников в чем мать родила). Ну а формат это тип того, что используется для представления объектов. В вышеприведенном примере, оператор new передает все ту же стандартную системную ссылку. Никаких средств для изменения ее формата у нас нет (а в КОП есть).
Далее, в этом примере мы использовали некий класс CAbstractProxy, который, судя по названию, является общим (не связан с Account). Как тогда потом осуществлять вызов методов из Account? Ведь этих методов в этом прокси нет.
S>> Прокси заточен под целевой класс, т.е. он явно о нем знает и не может без него существовать. Т.е. первым мы разрабатываем целевой класс (поскольку ему не нужен прокси -- он о нем ничего не знает), а потом уже прокси. Одно очень паршивое следствие состоит в том, что при каждом изменении целевого класса необходимо следить за прокси (откуда ошибки). V>Или поручить эту задачу компилятору
Правильный ход мысли. Но тогда надо ее развить дальше. Компилятор должен знать что с чем связано, т.е. какой прокси представляет какой класс. Т.е. надо в исходном тексте ввести какие-то указания. А это собственно уже будет новый язык программирования, где явно поддерживаются такие связи. Возможно: даже очень хороший язык. Но ведь его пока нет.
S>> Нельзя использовать один прокси для многих целевых классов. Например, мы хотим разработать прокси ProxyForMarsObjects, а затем использовать его для доступа к объектам на Марсе, имеющих самый разный класс, который заранее не известен. Как это сделать? Я такого способа не знаю. Если знаете, то опишите, пожалуйста (а также см. п.1). V>Ну, абстрагироваться от источника данных — это довольно легко. Помнится, ещё лет шесть-семь назад я написал прогу, которая в штатном режиме работала с SQL-сервером, а когда он оказывался недоступным (модем выключили), со вздохом лезла в локальный DBF-кэш. Что характерно, основная логика программы даже не догадывалась, что вместо сиськи теперь у неё соска. И всё это безо всяких КОП. И даже без Design Patterns. На старом добром Дельфи.
Остается только описать суть решения, а то на слово как-то не верится. А то потом окажется, что это вовсе не SQL-сервер был, да и не на Дельфи написано было
S>> Ну и в программе мы хотим использовать непосредственно целевые объекты, например, myAccount.getBalance(), тогда как в прокси мы вынуждены работать с посредником: myAccountProxy.getBalance(). Чувствуете разницу? V>Чувствую. И особенно почувствуют те, кто будет дорабатывать и обезглючивать мою программу. Если в "нормальной" программе глючит myAccount.getBalance(), то я открываю исходник этого самого myAccount.getBalance() и ищу багу там. Но если где-то рядышком болтается ещё куча каких-то непонятных личностей, которые как им заблагорассудится перехватывают вызовы до, после, а также вместо отработки собственно "тела" getBalance(), то я просто сойду с ума!
Ну никто же не жалуется, что при вызове figure.draw() в ООП будет на самом деле отрабатываться незивестно какая процедура. Даже брейк-поинт неизвестно где поставить. А перехват доступа происходит всегда и везде (прямого доступа нет), так лучше поставить этот механизм под контроль, чем вообще не знать, что происходит в программе. Кстати, доступ в КОП происходит по вполне понятным и естественным правилам, аналогичным доставке почты. Сперва идем в нужный город, потом в контексте города доходим до улицы и т.д. до цели. Ничего сложного здесь нет. Если метод не достиг цели, то ищи причину в базовых концептах.
S>>[/list]
S>>Я уже не говорю о том, что наличие большого числа паттернов есть признак кризиса в теории. V>Согласен
S>>Такой подход имеет следующие недостатки. Один и тот же код повторяется по всей программе (а что если что-то изменится в последовательности доступа). Я вовсе не хочу заниматься какими-то вспомогательными процедурами, а просто хочу вызвать метод по ссылке. Зачем такие сложности. Ну и кроме того, получение разрешенной ссылки в контекст, где она используется это очень плохо (небезопасно). Внутреннее представление должно храниться и использоваться внутри, а извне надо использовать внешнее представление. В КОП это выглядело бы так: S>>
S>>memHandle->myMethod();
S>>
S>>Преимущества. Мы просто применяем метод к ссылке. Внутренний идентификатор (адрес в памяти) не попадает к нам, и мы не можем ничего испортить. Всегда можно изменить механизм доступа без изменения того, где он используется. Например, можно добавить начало и конец транзакции.
FR>Может стоит познакомится с динамическими языками? Там подобные перехваты легко реализуются.
Думаю стоит, но нет подходящих ссылок.
Но как я уже где-то отметил, перехват довольно распространенный механизм. Правда обычно только как механизм, т.е. полноценной теории, где бы это рассматривалось как главное свойство я не знаю. Другой момент, что просто перехвата иметь мало -- нужы правильные свойства. КОП в этом смысле это один из возможных подходов, где перехват это свойство ссылок, которые по своему определению опосредуют доступ. Соответственно имеет иерархию перехватчиков, начиная от базовых классов и заканчивая целью.
Здравствуйте, savinov, Вы писали:
S>В КОП это выглядело бы так: S>
S>memHandle->myMethod();
S>
S>Преимущества. Мы просто применяем метод к ссылке. Внутренний идентификатор (адрес в памяти) не попадает к нам, и мы не можем ничего испортить. Всегда можно изменить механизм доступа без изменения того, где он используется. Например, можно добавить начало и конец транзакции.
Во-первых, приведённый выше memHandle наверняка сначала инициализируется. Как-нибудь вот так:
memHandle.SetRef(MyWonderfulOID);
На мой взгляд, это не сильно проще, чем такое:
CCustomer *memHandle = new CCustomer(MyWonderfulOID); // При инициализации полезет в БД и вытащит кустомера в память
memHandle->myMethod(); // Сделает с кустомером что-то
Во-вторых, напрямую управляя получением/уничтожением "настоящего" объекта, мы можем выиграть в скорости. Например, если после myMethod() сразу вызывается myNextMethod(), то КОП сделает следующее:
1. Вытащит объект из БД.
2. Вызовет ему myMethod().
3. Выкинет объект из памяти.
4. Вытащит объект из БД ещё раз.
5. Вызовет ему myNewMethod().
6. Выкинет объект из памяти.
Итак, в базу слазили два раза. А так как залезание в базу — наверняка самая ресурсоёмкая здесь операция, то программа на ровном месте стормозила почти в два раза.
V>>До сих пор я думал, что вся программа — это алгоритмы и структуры данных (с) Н.Вирт S>Так можно до Аристотеля добраться Почему бы не определить программу на компьютере как организованный набор атомов? Общее определение – зато никто не докопается.
Иногда и до Аристотеля полезно бывает добираться. В нашем ремесле так уж повелось, что, если мы не трепемся в RSDNе, то выдумываем алгоритмы и структуры данных. Чтобы задачу поставленную решить. Иногда, конечно, приходится и задачу самому ставить, но это уже совсем другая тема.
V>>Всё же, всё же... Зачем мне это может понадобиться? Я даже более-менее подходящий пример придумать не могу! S>Вы уже описали такой пример в начале этого поста. Пусть ваши объекты хранятся в БД и имеют ключ в качестве идентификатора. Проблема: вызвать метод можно только по системной ссылке, тогда в наличии имеется только первичный ключ. Тут-то и поможет КОП.
Как я выше показал, можно и без КОП. По-моему, даже ещё и красивее получилось. И главное — всё под контролем. Моим контролем, а не какого-то там посредника.
V>>Мне больше нравится такая автоматизация: V>>
V>> Set xls = CreateObject("Excel.Application")
V>> wb = xls.Workbooks.Open"C:\MyFile.xls"
V>>
V>>И всем (и особенно мне) от этого ХОРОШО
S>Хорошо только до определенного момента (обычно это проходит для малых или средних программ).
Вот как раз для особо больших программ и важно, чтобы я имел возможность легко и быстро (вечный дэдлайн!) программировать логику, не задумываясь о задействованных механизмах. Пусть Excel.Application думает о том, насколько у него большой MyFile.xls, и как много у него маленьких клеточек внутри!
V>>А, может быть, не вахтёр, а начальник тюрьмы?
S>Это государство, т.е., по определению классика, инструмент насилия. В зависимости от того, где объект родился и живет, к нему применяются разные законы. В частности, разные средства обозначения, разный жизненный цикл, разную степень открытости, разное наказание, разные ресурсы и т.п. Как раз на построение такого государства объектов и нацелено КОП. Мы описываем его структуру, законы, границы и т.п. И все это может функционировать сам по себе без объектов.
Моё твёрдое убеждение, что стандартных ограничений видимости (private, public и иже с ними) для этих целей достаточно, и больше ничего выдумывать не надо. Мне, по крайней мере, хватало. Или я не прав?
S>Но как я уже где-то отметил, перехват довольно распространенный механизм. Правда обычно только как механизм, т.е. полноценной теории, где бы это рассматривалось как главное свойство я не знаю. Другой момент, что просто перехвата иметь мало -- нужы правильные свойства. КОП в этом смысле это один из возможных подходов, где перехват это свойство ссылок, которые по своему определению опосредуют доступ. Соответственно имеет иерархию перехватчиков, начиная от базовых классов и заканчивая целью.
Теории нет, но на практике давно используются подобные приемы. И вообще почему именно нужен перхеват ссылок? Например таких же результатов позволяют добится метаклассы в питоне, но не за счет прокси а за счет того что мы можем вмешивастя в конструирование объектов (и классов) и при необходимости подменить почти все, при этом клиентский код не меняется и вообще не подозревает об этих манипуляциях.
Здравствуйте, savinov, Вы писали:
S>Остается только описать суть решения, а то на слово как-то не верится. А то потом окажется, что это вовсе не SQL-сервер был, да и не на Дельфи написано было
Да нет, всё-таки MS SQL и Дельфи. Программка была, которая показывала остатки товаров на разных складах. Так как нужна она была и там, где соединение с головным офисом происходило два раза в день через модем, пришлось сделать финт с локальным кэшем.
S>>> Ну и в программе мы хотим использовать непосредственно целевые объекты, например, myAccount.getBalance(), тогда как в прокси мы вынуждены работать с посредником: myAccountProxy.getBalance(). Чувствуете разницу? V>>Чувствую. И особенно почувствуют те, кто будет дорабатывать и обезглючивать мою программу. Если в "нормальной" программе глючит myAccount.getBalance(), то я открываю исходник этого самого myAccount.getBalance() и ищу багу там. Но если где-то рядышком болтается ещё куча каких-то непонятных личностей, которые как им заблагорассудится перехватывают вызовы до, после, а также вместо отработки собственно "тела" getBalance(), то я просто сойду с ума!
S>Ну никто же не жалуется, что при вызове figure.draw() в ООП будет на самом деле отрабатываться незивестно какая процедура. Даже брейк-поинт неизвестно где поставить.
Если криво рисуется линия, то см. line.draw(), а если круг, то circle.draw(). Что ж не понятно? S>А перехват доступа происходит всегда и везде (прямого доступа нет)
... и известно как! S>так лучше поставить этот механизм под контроль, чем вообще не знать, что происходит в программе.
То есть отдать в кривые ручки программера? Это называется "поставить под контроль"?
Кстати, я заметил, что вместо расхожей фразочки "Защита от дурака", всё чаще начинаю применять "Защита от себя, дурака". Потому как программер, не до конца разобравшийся в тонкостях программных вызовов (или просто забывший какую-то, казалось бы, мелочь) несёт для системы большую угрозу, чем юзер, швырнувший на клавиатуру валенок.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>В КОП это выглядело бы так: S>>
S>>memHandle->myMethod();
S>>
S>>Преимущества. Мы просто применяем метод к ссылке. Внутренний идентификатор (адрес в памяти) не попадает к нам, и мы не можем ничего испортить. Всегда можно изменить механизм доступа без изменения того, где он используется. Например, можно добавить начало и конец транзакции. V>Во-первых, приведённый выше memHandle наверняка сначала инициализируется. Как-нибудь вот так: V>
V>memHandle.SetRef(MyWonderfulOID);
V>
V>На мой взгляд, это не сильно проще, чем такое: V>
V>CCustomer *memHandle = new CCustomer(MyWonderfulOID); // При инициализации полезет в БД и вытащит кустомера в память
V>memHandle->myMethod(); // Сделает с кустомером что-то
V>
Не согласен. Представим, что теперь пришел начальник и говорит, что все мол, хватит баловаться, объекты будут храниться в XML на моем домашнем компе. Хочешь или не хочешь, а надо переписывать класс CCustomer. А причина в том, что вместо того, чтобы описывать структуру и функции заказчика, туда загнали еще персистенс, который к заказчикам не имеет никакого отношения. В КОП CCustomer включает исключительно повадки заказчиков, а где он будет находиться (в куче, в БД или на др. компе) заранее неизвестно. Способ представления определяется в объявлении этого класса и реализуется в родительских концептах.
V>Во-вторых, напрямую управляя получением/уничтожением "настоящего" объекта, мы можем выиграть в скорости. Например, если после myMethod() сразу вызывается myNextMethod(), то КОП сделает следующее: V>1. Вытащит объект из БД. V>2. Вызовет ему myMethod(). V>3. Выкинет объект из памяти. V>4. Вытащит объект из БД ещё раз. V>5. Вызовет ему myNewMethod(). V>6. Выкинет объект из памяти. V>Итак, в базу слазили два раза. А так как залезание в базу — наверняка самая ресурсоёмкая здесь операция, то программа на ровном месте стормозила почти в два раза.
Не совсем так. Все зависит от реализации. Например, очевидно, что загруженные объекты лучше сохранять (кэш) в предположении, что кто-то другой захочет с ними работать. Но в целом ясно, что ручная реализация будет всегда быстрее.
V>>>До сих пор я думал, что вся программа — это алгоритмы и структуры данных (с) Н.Вирт S>>Так можно до Аристотеля добраться Почему бы не определить программу на компьютере как организованный набор атомов? Общее определение – зато никто не докопается. V>Иногда и до Аристотеля полезно бывает добираться. В нашем ремесле так уж повелось, что, если мы не трепемся в RSDNе, то выдумываем алгоритмы и структуры данных. Чтобы задачу поставленную решить. Иногда, конечно, приходится и задачу самому ставить, но это уже совсем другая тема.
V>>>Всё же, всё же... Зачем мне это может понадобиться? Я даже более-менее подходящий пример придумать не могу! S>>Вы уже описали такой пример в начале этого поста. Пусть ваши объекты хранятся в БД и имеют ключ в качестве идентификатора. Проблема: вызвать метод можно только по системной ссылке, тогда в наличии имеется только первичный ключ. Тут-то и поможет КОП. V>Как я выше показал, можно и без КОП. По-моему, даже ещё и красивее получилось. И главное — всё под контролем. Моим контролем, а не какого-то там посредника.
Конечно можно без КОП, но просто криво получается. Хочу описать заказчика, а должен заниматься доступ к БД. И где же здесь смысл? Опять его нет.
V>>>Мне больше нравится такая автоматизация: V>>>
V>>> Set xls = CreateObject("Excel.Application")
V>>> wb = xls.Workbooks.Open"C:\MyFile.xls"
V>>>
V>>>И всем (и особенно мне) от этого ХОРОШО
S>>Хорошо только до определенного момента (обычно это проходит для малых или средних программ). V>Вот как раз для особо больших программ и важно, чтобы я имел возможность легко и быстро (вечный дэдлайн!) программировать логику, не задумываясь о задействованных механизмах. Пусть Excel.Application думает о том, насколько у него большой MyFile.xls, и как много у него маленьких клеточек внутри!
Ну а теперь представим, что стандартные средства нас не устраивают. Тогда надо написать свои средства представления и доступа к объектам, которые учитывают их специфику.
С другой стороны, даже Б. Гейтс нас не спасет, поскольку все объекты в этом примере имеют стандартные системные ссылки. А раз стандартные, значит не очень хорошие (ссылки на все случаи жизни не бывает). И тут мы опять захотим разработать то, что нужно нам, а не что предлагает Excel. (У вас есть туалетная бумага? Нет, но зато у нас есть наждачная.)
V>>>А, может быть, не вахтёр, а начальник тюрьмы?
S>>Это государство, т.е., по определению классика, инструмент насилия. В зависимости от того, где объект родился и живет, к нему применяются разные законы. В частности, разные средства обозначения, разный жизненный цикл, разную степень открытости, разное наказание, разные ресурсы и т.п. Как раз на построение такого государства объектов и нацелено КОП. Мы описываем его структуру, законы, границы и т.п. И все это может функционировать сам по себе без объектов. V>Моё твёрдое убеждение, что стандартных ограничений видимости (private, public и иже с ними) для этих целей достаточно, и больше ничего выдумывать не надо. Мне, по крайней мере, хватало. Или я не прав?
А мне даже этого много. Ограничение доступа обычно приносит больше вреда, чем пользы. Сперва надо все двери открыть и работать без ограничений. И только в конце, когда будет ясно, что собственно надо охранять, надо какие-то комнаты прикрыть. Но проблема вся в том, что как раз до такого конечного состояния завершенности доходит очень редкий проект. А закрытые двери очень сильно мешают, поскольку народ бегает, суетится и толпится перед ними, не зная, какой очередной идиот закрыт дверь и ушел (хотя охранять там особо нечего). А вообще, надо оценить, что хуже, когда хороший человек не может попасть в комнату, либо когда плохой человек может туда попасть. Лучшее лекарство это выставить оборону на как можно дальнем расстоянии так, чтобы внутри все было открыто. Например, на уровне отдела кадров, который подбирает только хороших сотрудников. Тогда внутри все можно открыть, что сильно повышает производительность.
Но в КОП проверки и безопасность это всего лишь частный случай. Программист может там написать все что угодно. Например, просто диагностическую запись выдать, что мол, такой-то процесс зашел в охраняемую зону с такими-то параметрами.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, savinov, Вы писали:
FR>>>Может стоит познакомится с динамическими языками? Там подобные перехваты легко реализуются.
S>>Думаю стоит, но нет подходящих ссылок.
FR>Тут думаю парой ссылок не обойтись, нужно смотреть и изучать эти языки, некторые примеры можешь посмотреть тут Re[5]: Питон наступает :)
S>>Но как я уже где-то отметил, перехват довольно распространенный механизм. Правда обычно только как механизм, т.е. полноценной теории, где бы это рассматривалось как главное свойство я не знаю. Другой момент, что просто перехвата иметь мало -- нужы правильные свойства. КОП в этом смысле это один из возможных подходов, где перехват это свойство ссылок, которые по своему определению опосредуют доступ. Соответственно имеет иерархию перехватчиков, начиная от базовых классов и заканчивая целью.
FR>Теории нет, но на практике давно используются подобные приемы. И вообще почему именно нужен перхеват ссылок?
Перехват ссылок нужен потому, что так устроен этот подход, ну т.е. он основан на понятии ссылки как на одном из двух первичных элементов программы (есть объекты и есть ссылки). Ну а перехват не является самоцелью. Потребность исходит из необходимости разрешать ссылки при доступе. Ясно, что сперва надо разрешить ссылку, а уже потом вызвать целевой метод. Ну а далее просто развиваетя эта идея. Метод разрешения приобретает более общий смысл. В общем, я вижу преимуществом то, что концепт в КОП очень хорошо обощает класс, а не является просто еще одни дополнением.
FR>Например таких же результатов позволяют добится метаклассы в питоне, но не за счет прокси а за счет того что мы можем вмешивастя в конструирование объектов (и классов) и при необходимости подменить почти все, при этом клиентский код не меняется и вообще не подозревает об этих манипуляциях.
Ну если это так, то тогда это весьма интересный подход, который надо подробно посмотреть. Про метаклассы я читал, но что-то старое, а как оно реально работает не знаю. В целом у меня сложилось впечатление, что это правильный подход, как раз потому, что можно менять то, чем собственно хочешь пользоваться на более высоком уровне.
Здравствуйте, savinov, Вы писали:
S>Правильный ход мысли. Но тогда надо ее развить дальше. Компилятор должен знать что с чем связано, т.е. какой прокси представляет какой класс. Т.е. надо в исходном тексте ввести какие-то указания. А это собственно уже будет новый язык программирования, где явно поддерживаются такие связи. Возможно: даже очень хороший язык. Но ведь его пока нет.
nemerle.org при помощи его макросов можно сделать что угодно.
S>Остается только описать суть решения, а то на слово как-то не верится. А то потом окажется, что это вовсе не SQL-сервер был, да и не на Дельфи написано было
Да банально это делается:
class MyObject
{
public int Id;
...
}
interface IDataLayer
{
MyObject GetMyObject(int id);
}
class SQLDataLayer : IDataLayer
{
public MyObject GetMyObject(int id)
{
...
}
public bool IsAvailable
{
get { ... }
}
}
class DBFDataLayer : IDataLayer
{
public MyObject GetMyObject(int id)
{
...
}
}
class SelectiveDataLayer : IDataLayer
{
readonly SQLDataLayer m_SQLDataLayer;
readonly DBFDataLayer m_DBFDataLayer;
public SelectiveDataLayer(SQLDataLayer _SQLDataLayer, DBFDataLayer _DBFDataLayer)
{
m_SQLDataLayer = _SQLDataLayer;
m_DBFDataLayer = _DBFDataLayer;
}
IDataLayer DataLayer
{
get
{
if (m_SQLDataLayer.IsAvailable)
return m_SQLDataLayer;
else
return m_DBFDataLayer;
}
}
public MyObject GetMyObject(int id)
{
return DataLayer.GetMyObject(id);
}
}
На дельфе делается один в один.
В нормальной IDE механической работы практически не будет.
А если использовать язык с метарограммированием то вобще все просто как не учить уроки.
Например на nemerle это будет выглядить както так
[Record]
[InterfaceImpl(IDataLayer, DataLayer)]
class SelectiveDataLayer : IDataLayer
{
m_SQLDataLayer : SQLDataLayer;
m_DBFDataLayer : DBFDataLayer;
DataLayer : IDataLayer
{
get
{
if (m_SQLDataLayer.IsAvailable)
m_SQLDataLayer;
else
m_DBFDataLayer;
}
}
}
Макрос InterfaceImpl переправит все вызовы интерфейса IDataLayer свойству DataLayer, а стандартный макрос Record сгенерирует конструктор те нам вобще ничего делать не нужно будет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, savinov, Вы писали:
S>А мне даже этого много. Ограничение доступа обычно приносит больше вреда, чем пользы. Сперва надо все двери открыть и работать без ограничений. И только в конце, когда будет ясно, что собственно надо охранять, надо какие-то комнаты прикрыть.
А может нужно проектировать систему, а не писать как попало?
Вот мне почемуто сразу ясно что открыть, а что не нужно.
Просто нужно сразу выделять интерфейс объекта и ни при каких обстоятельствах не мешать его с реализацией.
Также жизненно важно разбивать систему на уровни: Уровень данных. Уровень бизнес логики. Уровень пользовательского интерфейса. (это самое примитивное деление)
И ни в коем случае не смешивать их. Ибо если один раз смешал то дальше это будет наростать как снежный клубок. А распутать этот клубок потом будет очень не просто.
S>Но проблема вся в том, что как раз до такого конечного состояния завершенности доходит очень редкий проект. А закрытые двери очень сильно мешают, поскольку народ бегает, суетится и толпится перед ними, не зная, какой очередной идиот закрыт дверь и ушел (хотя охранять там особо нечего). А вообще, надо оценить, что хуже, когда хороший человек не может попасть в комнату, либо когда плохой человек может туда попасть. Лучшее лекарство это выставить оборону на как можно дальнем расстоянии так, чтобы внутри все было открыто. Например, на уровне отдела кадров, который подбирает только хороших сотрудников. Тогда внутри все можно открыть, что сильно повышает производительность.
Нет лучшее лекарство это организовать работу так чтобы народу ненужно было ломится куда попало.
Вот на прошлой работе в здании было 4 этажа, сотни комнат... А мне нужна было только одна (не считая коридоров, туалета и столовой) и от того закрыты или открыты другие комнаты моя производительность труда вобще никак не зависила.
S>Но в КОП проверки и безопасность это всего лишь частный случай. Программист может там написать все что угодно. Например, просто диагностическую запись выдать, что мол, такой-то процесс зашел в охраняемую зону с такими-то параметрами.
Както весь этот твой КОП выглядит очень искуственно и натянуто. Даже еще болие искуственно и натянуто чем Оберон...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, savinov, Вы писали:
S>Зачатки подхода безусловно существуют. В частности, сильно развиты средства перехвата доступа. Вот чего точно нет:
S>
Определение собственного формата ссылок, который далее приписывается для использования разными целевыми классами объектов с сохранением прозрачности доступа.
Парадигма — это не набор спецификаций. Парадигма — это удобный способ решения огромного класса задач.
Отдельной строковой константы "5" тоже ни в одном языке программирования нет. Значит, нужно придумывать новый подход, в котором эта константа будет? Ведь эта константа пригодится многим разработчикам во всем мире!
(!) Кстати, с этой точки зрения твой подход ждет успех.
Нужно лишь отказаться от ключевого слова "концепт" как
ключевого слова языка, найти уже имеющиеся элементы
твоего подхода в других языках, опубликовать и
популяризовать решения, обеспечивающие поддержку
концептов в языках, и ярко-ярко вспыхнуть в новостях!
Например, ООП и паттерны проектирования используются для удобного решения задач, сводимых к объектной декомпозиции: есть классы объектов, у каждого класса есть свое поведение, описываемое некоторым "контрактом" — набором свойств, методов и правил доступа.
В свою очередь АОП позволяет уменьшить объем кода при построении любой многослойной логики (авторизация при необходимости, кэширование на лету, проверка прав доступа на лету и т.п.).
У тебя пока кроме задачи проксирования никакой другой задачи не вижу. А эта задача для больших систем уже была решена на много раз, самый известный пример, наверное, это Microsoft с технологией COM еще в глубоком 1995м году (или около того). MS Office и MSIE тому наглядное свидетельство.
Вот весь твой КОП на питоне 2.4. Ссылочка взята с первого попавшегося мне на глаза по запросу "python proxy pattern" документа http://www.python.org/workshops/1997-10/proceedings/savikko.html (да, похоже, 1997 год)
Ну и где тут твоя необходимость изменять проксик вместе с изменениями объекта?
Здравствуйте, savinov, Вы писали:
S>Правильный ход мысли. Но тогда надо ее развить дальше. Компилятор должен знать что с чем связано, т.е. какой прокси представляет какой класс. Т.е. надо в исходном тексте ввести какие-то указания. А это собственно уже будет новый язык программирования, где явно поддерживаются такие связи. Возможно: даже очень хороший язык. Но ведь его пока нет.
Хотите "мега-идею"? Поместите кусок компилятора, знающего про координационные примитивы КОП, в рантайм. Он будет динамически патчить код доступа при изменении взаимного положения взаимодействующих компонентов. Т.е. то, что разнесено по разным ммм... контекстам, будет взаимодействовать через прокси-заменители. А все остальное -- традиционным способом.
Здравствуйте, savinov, Вы писали:
S>Не согласен. Представим, что теперь пришел начальник и говорит, что все мол, хватит баловаться, объекты будут храниться в XML на моем домашнем компе. Хочешь или не хочешь, а надо переписывать класс CCustomer. А причина в том, что вместо того, чтобы описывать структуру и функции заказчика, туда загнали еще персистенс, который к заказчикам не имеет никакого отношения. В КОП CCustomer включает исключительно повадки заказчиков, а где он будет находиться (в куче, в БД или на др. компе) заранее неизвестно. Способ представления определяется в объявлении этого класса и реализуется в родительских концептах.
Вот потом после такого винда тормозит при входе в систему, когда сеть недоступна и подключены сетевые диски. После этого виндовс эксплорер виснет, когда пытается доступиться на сетевые диски или FTP, но со связью проблемы.
Методы доступа всегда накладывают свои ограничения, часто нефункциональные, например, "время доступа" или "необходимость /вред от кеширования данных для ускорения работы", "прокси с авторизацией по паролю". Попытка их игнорировать — признак неопытности. (подробнее — Джоэл Спольски, "Leaky abstractions". Хотя, я думаю, все уже эту статью прочитали.)
Поэтому заменить класс, от которого наследуется (если это ООП) customer, придется. К счастью, все нормальные архитекторы понимают, какие части системы трудно будет изменить, и поэтому особо тщательно их прописывают в архитектуре. Менять их потом теоретически возможно, но не рекомендуется. В силу именно нефункциональных ограничений.
В случае баз данных — основная причина — скорость — тоже нефункциональная. И ORM-мапперы тут не помогут. Только автоматический переписыватель SQL-запросов и хранимых процедур (девелопер БД) . Представил сложность?
Есть еще и экономическая причина — уменьшение трудоемкости задачи. Попробуй писать большую программу, переносимую на linux, win32 и win64, имея только компилятор для win32 и возможность проверки на win32. Слабо?
p.s. А начальники такие никогда не переведутся. И ведь они в чем-то правы — деньги-то они платят за твою работу, какой бы тупой она не была. А за твое безделье ни один начальник денег не заплатит.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, savinov, Вы писали:
S>>А мне даже этого много. Ограничение доступа обычно приносит больше вреда, чем пользы. Сперва надо все двери открыть и работать без ограничений. И только в конце, когда будет ясно, что собственно надо охранять, надо какие-то комнаты прикрыть. WH>А может нужно проектировать систему, а не писать как попало?
Хороший совет. А главное очень конструктивный. Типа того, что для того, чтобы хорошо жить надо много работать. Это все правильно, но имеет значение только с педагогической точки зрения, поскольку в жизни все к сожалению не так. Почему? Ну например, потому, что проектировать систему можно по-разному, т.е. существует множество разных подходов и еще больше их модификаций.
WH>Вот мне почемуто сразу ясно что открыть, а что не нужно.
А вот мне чем дальше, тем менее ясным становится.
WH>Просто нужно сразу выделять интерфейс объекта и ни при каких обстоятельствах не мешать его с реализацией.
Как я выше отметил, есть разные подходы к проектированию и такое разделение это всего лишь один из них (не самый лучший).
WH>Также жизненно важно разбивать систему на уровни: Уровень данных. Уровень бизнес логики. Уровень пользовательского интерфейса. (это самое примитивное деление) WH>И ни в коем случае не смешивать их. Ибо если один раз смешал то дальше это будет наростать как снежный клубок. А распутать этот клубок потом будет очень не просто.
Вот это мне нравится. Вот только как описать уровни? Какие средства для этого использовать? В настоящее время таковых практически нет (в смысле поддержки в языках программирования). А в КОП это одна из основных целей, поскольку слоеная организация системы это основное предположение. Каждый уровень имеет свой способ представления и доступа, свои средства защиты и т.д. Т.е. это свое пространство со своими правилами игры.
S>>Но проблема вся в том, что как раз до такого конечного состояния завершенности доходит очень редкий проект. А закрытые двери очень сильно мешают, поскольку народ бегает, суетится и толпится перед ними, не зная, какой очередной идиот закрыт дверь и ушел (хотя охранять там особо нечего). А вообще, надо оценить, что хуже, когда хороший человек не может попасть в комнату, либо когда плохой человек может туда попасть. Лучшее лекарство это выставить оборону на как можно дальнем расстоянии так, чтобы внутри все было открыто. Например, на уровне отдела кадров, который подбирает только хороших сотрудников. Тогда внутри все можно открыть, что сильно повышает производительность. WH>Нет лучшее лекарство это организовать работу так чтобы народу ненужно было ломится куда попало. WH>Вот на прошлой работе в здании было 4 этажа, сотни комнат... А мне нужна было только одна (не считая коридоров, туалета и столовой) и от того закрыты или открыты другие комнаты моя производительность труда вобще никак не зависила.
S>>Но в КОП проверки и безопасность это всего лишь частный случай. Программист может там написать все что угодно. Например, просто диагностическую запись выдать, что мол, такой-то процесс зашел в охраняемую зону с такими-то параметрами. WH>Както весь этот твой КОП выглядит очень искуственно и натянуто. Даже еще болие искуственно и натянуто чем Оберон...
Здравствуйте, buriy, Вы писали:
B>Здравствуйте, savinov, Вы писали:
S>>Зачатки подхода безусловно существуют. В частности, сильно развиты средства перехвата доступа. Вот чего точно нет:
S>>
Определение собственного формата ссылок, который далее приписывается для использования разными целевыми классами объектов с сохранением прозрачности доступа.
B>Парадигма — это не набор спецификаций. Парадигма — это удобный способ решения огромного класса задач.
Именно такой способ и предлагается.
B>Например, ООП и паттерны проектирования используются для удобного решения задач, сводимых к объектной декомпозиции: есть классы объектов, у каждого класса есть свое поведение, описываемое некоторым "контрактом" — набором свойств, методов и правил доступа.
В КОП сложность (большой) системы объясняется вовсе не поведением объектов, а промежуточной функциональностью, которая к объектам не имеет никакого отношения. Проще говоря, даже если объектов вообще нет, или их функции примитивны, то система может проявлять довольно сложное поведение. Поэтому прежде всего для большой систему необходимо ответить на вопрос как будут представляться ее объекты, т.е. разработать структуру ее внутреннего пространства, а это довольно сложные функции (не связанные с поведением объектов, поскольку объектов еще нет). И только потом мы можем засадить это пространство объектами как в ООП.
Кстати, правил доступа в ООП нет, если не считать статические ограничители доступа. Доступ и представление это прерогатива КОП.
B>В свою очередь АОП позволяет уменьшить объем кода при построении любой многослойной логики (авторизация при необходимости, кэширование на лету, проверка прав доступа на лету и т.п.).
Известно, что АОП это довольно кривой способ со множеством проблем. Например, аспект это дополнительный элемент, привинченный сбоку к ООП (который того и гляди отвалится). Проблемы с иерархией и т.п.
B>У тебя пока кроме задачи проксирования никакой другой задачи не вижу. А эта задача для больших систем уже была решена на много раз, самый известный пример, наверное, это Microsoft с технологией COM еще в глубоком 1995м году (или около того). MS Office и MSIE тому наглядное свидетельство.
Задачи проксирования в КОП нет. Это просто механизм, который обычно предлагают вместо КОП при первом знакомстве, а потому можно с ним сравнивать. Кроме того, COM, MS Office и MSIE от Микрософта это НЕ языки программирования, соответственно и разговора никакого нет (не вижу связи).
B>Вот весь твой КОП на питоне 2.4. Ссылочка взята с первого попавшегося мне на глаза по запросу "python proxy pattern" документа http://www.python.org/workshops/1997-10/proceedings/savikko.html (да, похоже, 1997 год) B>Ну и где тут твоя необходимость изменять проксик вместе с изменениями объекта?
Да, действительно так. Питон оказывается может как хамелеон имитировать другой класс. Это заслуга Питона (но не ООП, очевидно). Не хочу тебя расстраивать, но это мало что меняет. Во-первых, ты по-прежнему должен работать с прокси, т.е. надо писать так:
>>> proxy = Proxy( rgb )
>>> proxy.Green()
Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать
>>> rgb = RGB( 100, 192, 240 )
>>> rgb.Red()
и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит, а потому нужно пригласить КОП, который это умеет делать.
Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. Например, даже если мы напишем
>>> proxy = Proxy( rgb )
>>> proxy.Green()
то все равно наша ссылка это обычная системная ссылка. Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает. Че тогда будешь делать? Методов на самом деле кучу, но просто все это надо будет делать руками. Но хуже всего то, что это сразу приводит к размножению кода. Например, пусть у меня объекты хранятся на разных компах. Тогда нужна ссылка:
reference {
String compName;
int port;
int objectId;
}
А далее я хочу все свои имеющиеся и будущие классы представлять такими ссылками, но пользоваться ими как обычными объектами, например:
Customer cust = new Customer();
Account acc = new Account(cust);
double acc.setBalance(1000);
}
Здесь все ссылки имеют сложный формат из трех полей. Но используются объекты как обычно. Если в будущем изменится формат ссылок, способ хранения объектов или что-то еще в механизме доступа, то этот код останется таким же. Круто?
Здравствуйте, A.Lokotkov, Вы писали:
AL>Здравствуйте, savinov, Вы писали:
S>>Правильный ход мысли. Но тогда надо ее развить дальше. Компилятор должен знать что с чем связано, т.е. какой прокси представляет какой класс. Т.е. надо в исходном тексте ввести какие-то указания. А это собственно уже будет новый язык программирования, где явно поддерживаются такие связи. Возможно: даже очень хороший язык. Но ведь его пока нет.
AL>Хотите "мега-идею"? Поместите кусок компилятора, знающего про координационные примитивы КОП, в рантайм.
Хорошая идея и я ее разрабатываю. Это ведет примерно в сторону т.н. языково-ориентированного программирования.
AL>Он будет динамически патчить код доступа при изменении взаимного положения взаимодействующих компонентов. Т.е. то, что разнесено по разным ммм... контекстам, будет взаимодействовать через прокси-заменители. А все остальное -- традиционным способом.
Вот здесь я не понял. Дело в том, что объекты не могут в принципе изменить своего положения. Ссылка дается раз и навсегда при рождении и до смерти. А ссылка это и есть положение объекта (его адрес во внутренней структуре пространств). Соответственно, менять процедуру доступа во время выполнения не надо -- она известна во время компиляции.
Здравствуйте, savinov, Вы писали:
S>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом?
Если хочешь — работай. Хочешь через прокси — работай через прокси. Или ты хочешь заставить себя работать с прокси даже тогда, когда хочешь работать с конечным объектом? S>Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>
>>>> rgb = RGB( 100, 192, 240 )
>>>> rgb.Red()
S>
S>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит
Подсказка: никто не мешает запроксировать сам вызов RGB, который вернет то, что нужно. Точнее, мешает, но об этом далее.
S>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. Например, даже если мы напишем S>
>>>> proxy = Proxy( rgb )
>>>> proxy.Green()
S>
S>то все равно наша ссылка это обычная системная ссылка.
Ну и что? S>Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает. Че тогда будешь делать?
То же самое. Вот, в дотнете поддерживается прозрачное проксирование объектов через границу доменов. Никаких проблем — все достает. Статическая типизация ограничивает удобство написания универсальных прокси; для питона это не проблема. S>Методов на самом деле кучу, но просто все это надо будет делать руками. Но хуже всего то, что это сразу приводит к размножению кода. Например, пусть у меня объекты хранятся на разных компах. Тогда нужна ссылка: S>
S>reference {
S> String compName;
S> int port;
S> int objectId;
S>}
S>
S>А далее я хочу все свои имеющиеся и будущие классы представлять такими ссылками, но пользоваться ими как обычными объектами, например: S>
S> Customer cust = new Customer();
S> Account acc = new Account(cust);
S> double acc.setBalance(1000);
S>}
S>
S>Здесь все ссылки имеют сложный формат из трех полей.
Пардон, а откуда берутся значения этих полей? Злая магия подставляет имя компьютера и порт? S>Но используются объекты как обычно. Если в будущем изменится формат ссылок, способ хранения объектов или что-то еще в механизме доступа, то этот код останется таким же. Круто?
А особенно круто — то, что это уже есть и доступно. В 100% сред это доступно при отказе от использования оператора new в прикладном коде — вместо этого используются вызовы фабрик, которые в свою очередь проксируются в одном месте.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, eao197, Вы писали: E>А что сейчас для защиты в области информатики внедрения уже не нужны?
Это для к.т.н. нужны. А если к.ф-м.н — то достаточно "уникального вклада в науку".
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
S>Да, действительно так. Питон оказывается может как хамелеон имитировать другой класс. Это заслуга Питона (но не ООП, очевидно). Не хочу тебя расстраивать, но это мало что меняет. Во-первых, ты по-прежнему должен работать с прокси, т.е. надо писать так: S>
>>>> proxy = Proxy( rgb )
>>>> proxy.Green()
S>
S>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>
>>>> rgb = RGB( 100, 192, 240 )
>>>> rgb.Red()
S>
S>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит, а потому нужно пригласить КОП, который это умеет делать.
С помощью метаклассов можно сделать что будет именно целевой объект, а прокси вклинится совершенно незаметно.
S>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
Метаклассы это обычные классы, так что и иерархия и все остальное есть.
S>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. Например, даже если мы напишем
А зачем их моделировать? Того же самого можно добится метаклассами в питоне, макросами в лиспе и немерле.
Здравствуйте, Sinclair, Вы писали:
E>>А что сейчас для защиты в области информатики внедрения уже не нужны? S>Это для к.т.н. нужны. А если к.ф-м.н — то достаточно "уникального вклада в науку".
Теперь понятно, почему реализация КОП может все сделать только хуже -- тогда ведь такая стройная теория накроется. Короче, "вся библия нафиг" ((С) Оба-на).
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, savinov, Вы писали:
AL>>Здравствуйте, savinov, Вы писали:
S>Вот здесь я не понял. Дело в том, что объекты не могут в принципе изменить своего положения. Ссылка дается раз и навсегда при рождении и до смерти. А ссылка это и есть положение объекта (его адрес во внутренней структуре пространств). Соответственно, менять процедуру доступа во время выполнения не надо -- она известна во время компиляции.
Если делать предположение, что взаимное положение известно во время компиляции, то никакого jit-а примитивов координационного слоя в рантайме не требуется. Поскольку сами примитивы там становятся ненужными. Только это как-то неинтересно
Здравствуйте, A.Lokotkov, Вы писали:
AL>Здравствуйте, savinov, Вы писали:
AL>>>Здравствуйте, savinov, Вы писали:
S>>Вот здесь я не понял. Дело в том, что объекты не могут в принципе изменить своего положения. Ссылка дается раз и навсегда при рождении и до смерти. А ссылка это и есть положение объекта (его адрес во внутренней структуре пространств). Соответственно, менять процедуру доступа во время выполнения не надо -- она известна во время компиляции.
AL>Если делать предположение, что взаимное положение известно во время компиляции, то никакого jit-а примитивов координационного слоя в рантайме не требуется. Поскольку сами примитивы там становятся ненужными. Только это как-то неинтересно
Да, это менее интересно, но ведь есть много других интересных проблем. Кроме того, произвольный (неизвестный во время компиляци) формат ссылки (=структура адреса, =расположение объекта) встречается в любом более или менее сложном приложении, например, при реализации БД. Язык позволяет автоматизировать только простые вещи, а в общем случае работу с ссылками надо реализовывать самому. Например, представим, что объекты хранятся в иерархическом контейнере, каждый локальный адрес это целое число. Тогда полная ссылка это последовательность целвых чисел. Но автоматизировать работу с такими ссылками языковыми средствами нельзя (сложно), а потому надо реализовать поддержку во время выполнения. Я думаю, что эта тема относится к анализу и дизайну систем. Вообще, я считаю, что вопрос представления и доступа является первичным при дизайне системы, т.е. надо определить где будут жить объекты, какие границы пересекаются при доступа, как они обозначаются и т.п. Ну а в языках дается поддержка только базовых средства.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, savinov, Вы писали:
S>>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? S>Если хочешь — работай. Хочешь через прокси — работай через прокси. Или ты хочешь заставить себя работать с прокси даже тогда, когда хочешь работать с конечным объектом?
Нет, конечно. Я вовсе не против прокси. Я просто хочу подчеркнуть принципиальную разницу между двумя подходами к организации опосредования: традициооные прокси (замещающие объекты), и
КОП
Есть и другие средства, например, можно использовать АОП, и там будут свои свойства. Их просто понимать и использовать по назначению.
S>>Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>>
S>>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит S>Подсказка: никто не мешает запроксировать сам вызов RGB, который вернет то, что нужно. Точнее, мешает, но об этом далее.
S>>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. Например, даже если мы напишем S>>
S>>то все равно наша ссылка это обычная системная ссылка. S>Ну и что?
Если это системная ссылка, то отсюда все ограничения стандартных ссылок, которые предоставляются средой и не контролируются. Недостатки см. ниже.
S>>Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает. Че тогда будешь делать? S>То же самое. Вот, в дотнете поддерживается прозрачное проксирование объектов через границу доменов. Никаких проблем — все достает. Статическая типизация ограничивает удобство написания универсальных прокси; для питона это не проблема.
Возможно (я не знаком с этим). Я как раз утверждаю, что многие средства опосредованного доступа реализованы в том или ином виде в разных языках или платформах. Но проблема состоит в том, что хочется разработать теоретически правильные средства, основанные на базовых принципах и далее реализованные в каких-то специальных языковых конструкциях. Я привел критерии такого механизма и предложил решение. Конечно, есть пересечения с тем, что уже сделано. Например, мало кто знает, но в С++ есть старый метод, с помощью которого можно реализовать свой формат ссылок с помощью шаблонов. Весьма интересный и полезный метод. Но ведь это даже не паттерн, а просто трюк! А нам хочется иметь красивый, простой, естественный и общий подход. Кроме того, есть множество библиотек или платформ, предоставляющих толстые ссылки для своих объектов и средства опосредования, но ведь это тоже средства заточенные для решения определенных задач. А нам хочется иметь возможность построить в своей программе свою систему координат, свою средства обозначения объектов (своя почта).
S>>Методов на самом деле кучу, но просто все это надо будет делать руками. Но хуже всего то, что это сразу приводит к размножению кода. Например, пусть у меня объекты хранятся на разных компах. Тогда нужна ссылка: S>>
S>>reference {
S>> String compName;
S>> int port;
S>> int objectId;
S>>}
S>>
S>>А далее я хочу все свои имеющиеся и будущие классы представлять такими ссылками, но пользоваться ими как обычными объектами, например: S>>
S>> Customer cust = new Customer();
S>> Account acc = new Account(cust);
S>> double acc.setBalance(1000);
S>>}
S>>
S>>Здесь все ссылки имеют сложный формат из трех полей. S>Пардон, а откуда берутся значения этих полей? Злая магия подставляет имя компьютера и порт? S>>Но используются объекты как обычно. Если в будущем изменится формат ссылок, способ хранения объектов или что-то еще в механизме доступа, то этот код останется таким же. Круто?
S>А особенно круто — то, что это уже есть и доступно. В 100% сред это доступно при отказе от использования оператора new в прикладном коде — вместо этого используются вызовы фабрик, которые в свою очередь проксируются в одном месте.
Мне таких решений не известно. Я думаю, что это либо платформы, либо какие-то элементы решения. Наличие таких частичных решений лишь подчеркивает актуальность задачи. А в КОП предлагается простое и принципиальное решение на уровне языка програмирования.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, savinov, Вы писали:
S>>Да, действительно так. Питон оказывается может как хамелеон имитировать другой класс. Это заслуга Питона (но не ООП, очевидно). Не хочу тебя расстраивать, но это мало что меняет. Во-первых, ты по-прежнему должен работать с прокси, т.е. надо писать так: S>>
S>>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>>
S>>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит, а потому нужно пригласить КОП, который это умеет делать.
FR>С помощью метаклассов можно сделать что будет именно целевой объект, а прокси вклинится совершенно незаметно.
S>>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
FR>Метаклассы это обычные классы, так что и иерархия и все остальное есть.
S>>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. Например, даже если мы напишем
FR>А зачем их моделировать? Того же самого можно добится метаклассами в питоне, макросами в лиспе и немерле.
Ну значит метаклассы это неплохая вещь. Я уже отмечал, что элементы решения предлагаются в самых разных подходах. Вопрос тогда состоит в сравнении разных подходов, в частности, метаклассов и КОП. Если какой-то эксперт по метаклассам мог сказать что-то конкретное по этому поводу, было бы весьма интересно. (А я тем временем, попытаюсь сам разобраться.) Кстати, насколько я помню, метаклассы зародились еще до АОП, и были толчком к развитию АОП. Значит ли это, что в метаклассах нашли какие-то недостатки, которые попытались исправить в АОП? Вообше, по большому счету, КОП движется именно в этом большом направлении, где мы хотим создать для себя свою собственную среду, т.е. изменить законы функционирования программы и объектов внутри этой же самой прораммы. В КОП каждый объект это с одной стороны просто объект, а с другой это среда для других (внутренних) объектов.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Sinclair, Вы писали:
E>>>А что сейчас для защиты в области информатики внедрения уже не нужны? S>>Это для к.т.н. нужны. А если к.ф-м.н — то достаточно "уникального вклада в науку".
E>Теперь понятно, почему реализация КОП может все сделать только хуже -- тогда ведь такая стройная теория накроется. Короче, "вся библия нафиг" ((С) Оба-на).
E>)
Совершенно верно. Но это касается любой теории. Когда надо ее реализовать, то красота и изящность пропадает. Правда появляются другие радости, например, возможность что-то подрогать.
В любом случае, цель КОП не является прагматический. Это просто свободное творчество, за которое никто не платит (к сожалению). Соответственно, времени на реализацию нет. А погружаться в кучу реальных проблем, когда есть множество более интересных задач в области дизайна КО языка или КО базы данных охоты нет.
Здравствуйте, savinov, Вы писали:
E>>Теперь понятно, почему реализация КОП может все сделать только хуже -- тогда ведь такая стройная теория накроется. Короче, "вся библия нафиг" ((С) Оба-на).
E>>)
S>Совершенно верно. Но это касается любой теории. Когда надо ее реализовать, то красота и изящность пропадает. Правда появляются другие радости, например, возможность что-то подрогать.
S>В любом случае, цель КОП не является прагматический. Это просто свободное творчество, за которое никто не платит (к сожалению). Соответственно, времени на реализацию нет. А погружаться в кучу реальных проблем, когда есть множество более интересных задач в области дизайна КО языка или КО базы данных охоты нет.
По простому это называется пудрить людям мозги.
Хотя, имхо, в области образования предпочитают другой термин: заниматься наукой.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
E>>>Теперь понятно, почему реализация КОП может все сделать только хуже -- тогда ведь такая стройная теория накроется. Короче, "вся библия нафиг" ((С) Оба-на).
E>>>)
S>>Совершенно верно. Но это касается любой теории. Когда надо ее реализовать, то красота и изящность пропадает. Правда появляются другие радости, например, возможность что-то подрогать.
S>>В любом случае, цель КОП не является прагматический. Это просто свободное творчество, за которое никто не платит (к сожалению). Соответственно, времени на реализацию нет. А погружаться в кучу реальных проблем, когда есть множество более интересных задач в области дизайна КО языка или КО базы данных охоты нет.
E>По простому это называется пудрить людям мозги. E>Хотя, имхо, в области образования предпочитают другой термин: заниматься наукой.
Ну можно и так сказать. Но только давай будем честными до конца: тов. GoF тоже пудрит людям мозги (пример случайный). Таким образом, важно не то, что пудрят мозги или нет, а является ли это полезным в конце концов.
Здравствуйте, savinov, Вы писали:
E>>По простому это называется пудрить людям мозги. E>>Хотя, имхо, в области образования предпочитают другой термин: заниматься наукой.
S>Ну можно и так сказать. Но только давай будем честными до конца: тов. GoF тоже пудрит людям мозги (пример случайный). Таким образом, важно не то, что пудрят мозги или нет, а является ли это полезным в конце концов.
Ну и какая полезность в предлагаемой вами КОП? Не для вас (для вас это научная работа), а для, например, читателей RSDN?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
S>Да, действительно так. Питон оказывается может как хамелеон имитировать другой класс. Это заслуга Питона (но не ООП, очевидно).
ООП об этом хамелеонстве ничего не говорит. Более того, если мы говорим о чистом ООП, то погляди в Smalltalk, где те же самые методы применяются еще более часто, чем в Питоне.
Не хочу тебя расстраивать, но это мало что меняет. Во-первых, ты по-прежнему должен работать с прокси, т.е. надо писать так: S>
>>>> proxy = Proxy( rgb )
>>>> proxy.Green()
S>
S>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>
>>>> rgb = RGB( 100, 192, 240 )
>>>> rgb.Red()
S>
S>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит, а потому нужно пригласить КОП, который это умеет делать.
rgb = RGB( 100, 192, 240 )
а будет подставляться прокси.
S>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
Че, на те объекты тоже нужны прокси? Или автоматический проксификатор? Ну сделай, правда это чуточку посложнее будет. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496741
S>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы.
Да можно. Переименуй мой класс Proxy в класс Concept, добавь ему необходимые тебе методы, и будет тебе счастье!
Например, даже если мы напишем S>
>>>> proxy = Proxy( rgb )
>>>> proxy.Green()
S>
S>то все равно наша ссылка это обычная системная ссылка.
Ну да, потому что процессор это обычный системный процессор. Значит системная ссылка обязательно где-то будет! Ну и по логике вещей она будет указывать на этот прокси, который будет проверять границы так, как тебе нужно. Все это можно реализовать в любом языке с интроспекцией, даже в Java и C#. Просто на питоне эти действия будут более простыми, поскольку он ближе к чистому ООП. SmallTalk еще ближе, там это делается еще проще.
Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает.
Ну да, прокси должен доставать объект откуда надо. Например, между машинами, как в CORBA и DCOM.
Для питона есть, например, такое: http://pyro.sourceforge.net/ (это аналог Java RMI)
Но есть еще и такое: http://pybuild.sourceforge.net/pyinvoke.html
В итоге ты абсолютно прозрачно работаешь с объектами, а они на самом деле могут быть на другой машине.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
E>>>По простому это называется пудрить людям мозги. E>>>Хотя, имхо, в области образования предпочитают другой термин: заниматься наукой.
S>>Ну можно и так сказать. Но только давай будем честными до конца: тов. GoF тоже пудрит людям мозги (пример случайный). Таким образом, важно не то, что пудрят мозги или нет, а является ли это полезным в конце концов.
E>Ну и какая полезность в предлагаемой вами КОП? Не для вас (для вас это научная работа), а для, например, читателей RSDN?
Полезность мы вряд ли сможем определить -- это может сделать только время.
Для меня это вовсе не научная работа (иначе это было бы довольно бесполезно). Я уже упомянул, что это что-то вроде свободного творчества, хобби. Именно из-за отсутствия заказчика (который есть также в науке), можно сделать все правильно, а не так как требуется для отчета, для оппонента или др. типа заказчика. Именно по этой причине мне не надо это продвигать или пропагандировать (я делаю это для себя самого). Так что ситуация как в open source: нравится — пользуйся, а не нравится — не ешь. Наличие публикаций это всего лишь мотивация что-то закончить, т.е. подвести черту и завершить этап — иначе процесс продолжается до бесконечности. Примерно как наличие версий и этапов при разработке ПО. Ни для чего другого (к счастью) они мне не нужны.
savinov wrote: > Полезность мы вряд ли сможем определить -- это может сделать только время. > Для меня это вовсе не научная работа (иначе это было бы довольно > бесполезно). Я уже упомянул, что это что-то вроде свободного творчества, > хобби.
Тогда это называется "графоманство".
Здравствуйте, buriy, Вы писали:
S>>Да, действительно так. Питон оказывается может как хамелеон имитировать другой класс. Это заслуга Питона (но не ООП, очевидно). B>ООП об этом хамелеонстве ничего не говорит. Более того, если мы говорим о чистом ООП, то погляди в Smalltalk, где те же самые методы применяются еще более часто, чем в Питоне. B>Не хочу тебя расстраивать, но это мало что меняет. Во-первых, ты по-прежнему должен работать с прокси, т.е. надо писать так: S>>
S>>Ну а теперь объясни, будь добр, зачем мне это надо, если я хочу работать не с прокси, а с конечным объектом? Могу только повторить, что переменные должны иметь класс целевого объекта независимо от того, кто, как и когда встрянет потом между ними (кстати, это выполняется в АОП, что есть хорошо). Вот если бы можно было написать S>>
S>>и при этом ссылка rgb указывала бы на прокси, то это было бы немного ближе к нашей великой цели. Но этого не происходит, а потому нужно пригласить КОП, который это умеет делать.
B>Ну сделай
B>Тогда потом можно спокойно использовать
B>rgb = RGB( 100, 192, 240 ) B>а будет подставляться прокси.
Верю. Но сколько для этого надо было написать кода! Отсюда ясно, что язык не предназначен для таких задач (хотя и может описать какие-то механизмы более или менее удобно). Это хороший пример реализации какого-то паттерна или приема без прямой языковой поддержки. Так можно было то же самое написать на ассемблере или Си, но это бы заняло еще больше строй кода.
S>>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
B>Че, на те объекты тоже нужны прокси? Или автоматический проксификатор? Ну сделай, правда это чуточку посложнее будет. B>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496741
Немного сложнее это мягко сказано. Но идея в том, что проксификация часто имеет вложенный характер. Это уже вряд ли можно назвать прокси в чистом виде, но я и не применял этот термин, а говорил об опосредовании. Здесь ближе паттерн chain of responsibility (http://www.python.org/workshops/1997-10/proceedings/savikko.html). В КОП является принципом, что вызов метода это путь к цели, а не конечный шаг. Дело в том, что любой объект в общем случае является удаленным, поскольку представляется произвольной ссылкой. Чтобы его достичь, надо проделать путь, который проходит через объекты, представляющие границы пространств (где живут объекты). Каждый их этих промежуточных объектов опосредует доступ, т.е. вносит свой вклад в обработку запроса. И только в самом конце выполняется вызываемый метод. Если назвать эти промежуточные объекты прокси, тогда получаем вложенное проксирование. В КОП это делается за пару строк, поскольку не только встроено в язык, но заложены в принципы программирования. Создай структуру пространств ("прокси") и только потом помещай туда объекты. Обычный же подход говорит, что надо создать сперва объекты, а потом создавать для них посредников в виде прокси (хотя бы потому, что прокси без целевых объектов просто не могут быть созданы). Это принципиальное отличие, понимание которого необходимо (что первично, а что вторично).
S>>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. B>Да можно. Переименуй мой класс Proxy в класс Concept, добавь ему необходимые тебе методы, и будет тебе счастье!
Есть ли в Питоне передача объектов по значению? Если как и в Яве нет, тогда и говорить не о чем, поскольку ссылка всегда передается только по значению. Ссылка не имеет своей собственно ссылки и это ее отличие от объекта. Но даже если есть передача объектов по значению, как в С++, то сделать из таких объектов ссылки весьма сложно. Нужно очень сильно постараться, чтобы прилепить такого горбатого к стенке. Например, в С++ можно использовать шаблоны и smart pointers.
B>Например, даже если мы напишем S>>
S>>то все равно наша ссылка это обычная системная ссылка. B>Ну да, потому что процессор это обычный системный процессор. Значит системная ссылка обязательно где-то будет! Ну и по логике вещей она будет указывать на этот прокси, который будет проверять границы так, как тебе нужно. Все это можно реализовать в любом языке с интроспекцией, даже в Java и C#. Просто на питоне эти действия будут более простыми, поскольку он ближе к чистому ООП. SmallTalk еще ближе, там это делается еще проще.
Ссылка может иметь любой формат и не должна быть объектом. Если ссылка является объектом, то это уже симулирование ссылки, что можно с большим или меньшим успехом сделать с помощью прокси. А я хочу иметь нормальные ссылки в моем собственном формате, а не объект, который ведет себя как ссылка. Объект это объект, а ссылка это ссылка. Это двойственные понятия и их функции в системе ортогональны (взаимно пересекаются). Например, я хочу определить свои толстые ссылки (но не прокси), чтобы далее их использовать как самые обычные системные ссылки. Зачем? Ну затем же, для чего Ява использует свой формат ссылок, а не адреса в памяти. Затем же, для чего ты используешь имена компов, а не их IP-адрес, затем же для чего ты используешь имя файла, а не его номер блока на диске. Я бы сказал, что все программирование сводится просто к разработке такой системы опосредвоаня. Это нужно, что отвязаться от реальности и добиться виртуальности. Виртуализация это другой популярный термин. Мы хотим работать в виртуальной системе координат, а быть привязаны к физической реальности. Например, зачем в процессорах ввели виртуальную адресацию? Ведь это только замедляет доступ, поскольку каждый раз процессор (менеджер памяти) должен пересчитывать где в физической памяти находится элемент. Правильно, для того, чтобы отвязаться от физической памяти, поскольку это придает гибкость. То же самое в программировании. КОП предназначено для разработки своей виртуальной системы обозначений к объектам и прозрачного доступа к ним. В отличие от других языков, где некоторые вещи также можно реализовать, это является первичной и главной целью этого подхода. Убедил?
B>Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает. B>Ну да, прокси должен доставать объект откуда надо. Например, между машинами, как в CORBA и DCOM. B>Для питона есть, например, такое: http://pyro.sourceforge.net/ (это аналог Java RMI) B>Но есть еще и такое: http://pybuild.sourceforge.net/pyinvoke.html B>В итоге ты абсолютно прозрачно работаешь с объектами, а они на самом деле могут быть на другой машине.
Совершенно верно, но все-таки это как раз то, что мы хотим избежать! Это ведь не поддержка на уровне языка, а просто библиотека или какой-то специальный механизм, заточенный под определенный вид задача (в данном случае под удаленные объекты). Такая поддержка существует уже десятки лет в самых разных формах: на уровне ОС, middleware, библиотек и др. штуковин.
Наша цель состоит в том, чтобы предоставить универсальные средства на уровне языка программирования. Например, что мне делать, если меня не устраивает Pyro, RMI или CORBA? Ведь это универсальные средства, которые м.б. либо слишком сложными либо слишком простыми, либо слишком небезопасными либо вообще делать не то что нужно. Пусть я хочу, чтобы в удаленное ссылке было еще одно поле с какой-то инфой. В этом смысле КОП как раз и дает языковые средства для описания произвольной системы обозначений обозначений объектов в программе.
Здравствуйте, Cyberax, Вы писали:
C>savinov wrote: >> Полезность мы вряд ли сможем определить -- это может сделать только время. >> Для меня это вовсе не научная работа (иначе это было бы довольно >> бесполезно). Я уже упомянул, что это что-то вроде свободного творчества, >> хобби. C>Тогда это называется "графоманство".
Ну хорошо, я не против. Называйте это как хотите, мне это безразлично, и я меньше всего об этом думаю.
В общем, все свелось к обсуждению как это называется и не преследует ли автор каких-то корыстных целей. Это очевидно, защитная реакция организма, который боится, что его сейчас перепрограммируют или переведут в другую веру (естественная, кстати, реакция). Интересно, что все возможные варианты ответов на вопрос зачем это делается имеют негативную оценку. Если для науки, то плохо. Если не для науки, то тоже плохо. Если из-за денег, то еще хуже. Выберите вариант ответа, который вас устроит и я так и отвчу Ну, впрочем, это форум, и другого здесь не может быть...
Здравствуйте, savinov, Вы писали:
S>Верю. Но сколько для этого надо было написать кода! Отсюда ясно, что язык не предназначен для таких задач (хотя и может описать какие-то механизмы более или менее удобно). Это хороший пример реализации какого-то паттерна или приема без прямой языковой поддержки. Так можно было то же самое написать на ассемблере или Си, но это бы заняло еще больше строй кода.
При использовании код писать вообще не придется. На си это сделать вообще не получится, только если препроцессором.
S>>>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
B>>Че, на те объекты тоже нужны прокси? Или автоматический проксификатор? Ну сделай, правда это чуточку посложнее будет. B>>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496741
S>Немного сложнее это мягко сказано. Но идея в том, что проксификация часто имеет вложенный характер. Это уже вряд ли можно назвать прокси в чистом виде, но я и не применял этот термин, а говорил об опосредовании. Здесь ближе паттерн chain of responsibility (http://www.python.org/workshops/1997-10/proceedings/savikko.html). В КОП является принципом, что вызов метода это путь к цели, а не конечный шаг. Дело в том, что любой объект в общем случае является удаленным, поскольку представляется произвольной ссылкой. Чтобы его достичь, надо проделать путь, который проходит через объекты, представляющие границы пространств (где живут объекты). Каждый их этих промежуточных объектов опосредует доступ, т.е. вносит свой вклад в обработку запроса. И только в самом конце выполняется вызываемый метод. Если назвать эти промежуточные объекты прокси, тогда получаем вложенное проксирование. В КОП это делается за пару строк, поскольку не только встроено в язык, но заложены в принципы программирования. Создай структуру пространств ("прокси") и только потом помещай туда объекты. Обычный же подход говорит, что надо создать сперва объекты, а потом создавать для них посредников в виде прокси (хотя бы потому, что прокси без целевых объектов просто не могут быть созданы). Это принципиальное отличие, понимание которого необходимо (что первично, а что вторично).
Сделать путь не проблема как и любой уровень вложености для прокси.
В общем я думаю твой КОП вполне реализуем на динамических и макросоподерживающих языках в виде библиотеки. И использование тоже будет в пару строк.
S>>>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. B>>Да можно. Переименуй мой класс Proxy в класс Concept, добавь ему необходимые тебе методы, и будет тебе счастье!
S>Есть ли в Питоне передача объектов по значению? Если как и в Яве нет, тогда и говорить не о чем, поскольку ссылка всегда передается только по значению. Ссылка не имеет своей собственно ссылки и это ее отличие от объекта. Но даже если есть передача объектов по значению, как в С++, то сделать из таких объектов ссылки весьма сложно. Нужно очень сильно постараться, чтобы прилепить такого горбатого к стенке. Например, в С++ можно использовать шаблоны и smart pointers.
В питоне есть гораздо более мощные средства обобщения чем шаблоны и умные указатели.
S>Ссылка может иметь любой формат и не должна быть объектом. Если ссылка является объектом, то это уже симулирование ссылки, что можно с большим или меньшим успехом сделать с помощью прокси. А я хочу иметь нормальные ссылки в моем собственном формате, а не объект, который ведет себя как ссылка. Объект это объект, а ссылка это ссылка. Это двойственные понятия и их функции в системе ортогональны (взаимно пересекаются). Например, я хочу определить свои толстые ссылки (но не прокси), чтобы далее их использовать как самые обычные системные ссылки. Зачем? Ну затем же, для чего Ява использует свой формат ссылок, а не адреса в памяти. Затем же, для чего ты используешь имена компов, а не их IP-адрес, затем же для чего ты используешь имя файла, а не его номер блока на диске. Я бы сказал, что все программирование сводится просто к разработке такой системы опосредвоаня. Это нужно, что отвязаться от реальности и добиться виртуальности. Виртуализация это другой популярный термин. Мы хотим работать в виртуальной системе координат, а быть привязаны к физической реальности. Например, зачем в процессорах ввели виртуальную адресацию? Ведь это только замедляет доступ, поскольку каждый раз процессор (менеджер памяти) должен пересчитывать где в физической памяти находится элемент. Правильно, для того, чтобы отвязаться от физической памяти, поскольку это придает гибкость. То же самое в программировании. КОП предназначено для разработки своей виртуальной системы обозначений к объектам и прозрачного доступа к ним. В отличие от других языков, где некоторые вещи также можно реализовать, это является первичной и главной целью этого подхода. Убедил?
В питоне все является объектом. Так что сделать ссылку не объект не получится. Аналогии по моему очень натянутые. Вообще если бы ты показал хоть один пример как твой КОП помогает решить конкретную проблему или задачу было бы намного продуктивнее, а так пока чистая вода.
S>Совершенно верно, но все-таки это как раз то, что мы хотим избежать! Это ведь не поддержка на уровне языка, а просто библиотека или какой-то специальный механизм, заточенный под определенный вид задача (в данном случае под удаленные объекты). Такая поддержка существует уже десятки лет в самых разных формах: на уровне ОС, middleware, библиотек и др. штуковин.
S>Наша цель состоит в том, чтобы предоставить универсальные средства на уровне языка программирования. Например, что мне делать, если меня не устраивает Pyro, RMI или CORBA? Ведь это универсальные средства, которые м.б. либо слишком сложными либо слишком простыми, либо слишком небезопасными либо вообще делать не то что нужно. Пусть я хочу, чтобы в удаленное ссылке было еще одно поле с какой-то инфой. В этом смысле КОП как раз и дает языковые средства для описания произвольной системы обозначений обозначений объектов в программе.
Добавить поле в динамических языках без проблем. Вообще поищи про утиную типизацию и динамическое добавление методов, тут много на эту тему ругались, то есть обсуждали
Здравствуйте, savinov, Вы писали:
S>В общем, все свелось к обсуждению как это называется и не преследует ли автор каких-то корыстных целей. Это очевидно, защитная реакция организма, который боится, что его сейчас перепрограммируют или переведут в другую веру (естественная, кстати, реакция). Интересно, что все возможные варианты ответов на вопрос зачем это делается имеют негативную оценку. Если для науки, то плохо. Если не для науки, то тоже плохо. Если из-за денег, то еще хуже. Выберите вариант ответа, который вас устроит и я так и отвчу Ну, впрочем, это форум, и другого здесь не может быть...
Если бы ты показал конкретный пример использования или хотя бы примеры решения проблем а не воду, было бы совсем другое обсуждение
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, savinov, Вы писали:
S>>В общем, все свелось к обсуждению как это называется и не преследует ли автор каких-то корыстных целей. Это очевидно, защитная реакция организма, который боится, что его сейчас перепрограммируют или переведут в другую веру (естественная, кстати, реакция). Интересно, что все возможные варианты ответов на вопрос зачем это делается имеют негативную оценку. Если для науки, то плохо. Если не для науки, то тоже плохо. Если из-за денег, то еще хуже. Выберите вариант ответа, который вас устроит и я так и отвчу Ну, впрочем, это форум, и другого здесь не может быть...
FR>Если бы ты показал конкретный пример использования или хотя бы примеры решения проблем а не воду, было бы совсем другое обсуждение
Вот тогда как раз было бы уже нечего обсуждать — все и так было бы ясно. Но в целом я согласен конечно, что нужны хорошие примеры. Но поскльку дисер мне не нужен, деньги тоже на этом не заработаешь, то и заниматься рутиной (что и так очевидно) мне нет охоты. Поэтому если все это не совсем ясно, или совсем не ясно, то я вполне могу понять, но изменить ничего не могу. Кроме того, я уверен, что даже пары хороших примеров будет недостаточно, поскольку это связано с религиозными воззрениями граждан, которые так просто не изменить. Так что пусть будет как будет. Пусть КОП сам пробивает себе дорогу в жизнь
Здравствуйте, savinov, Вы писали:
FR>>Если бы ты показал конкретный пример использования или хотя бы примеры решения проблем а не воду, было бы совсем другое обсуждение
S>Вот тогда как раз было бы уже нечего обсуждать — все и так было бы ясно. Но в целом я согласен конечно, что нужны хорошие примеры. Но поскльку дисер мне не нужен, деньги тоже на этом не заработаешь, то и заниматься рутиной (что и так очевидно) мне нет охоты. Поэтому если все это не совсем ясно, или совсем не ясно, то я вполне могу понять, но изменить ничего не могу. Кроме того, я уверен, что даже пары хороших примеров будет недостаточно, поскольку это связано с религиозными воззрениями граждан, которые так просто не изменить. Так что пусть будет как будет. Пусть КОП сам пробивает себе дорогу в жизнь
На консилиуме ученых и военных...
Входит в кабинет секритарша и гворит:
— Тут к вам рвется какой-то товарищь... я его сдержать немогу, говоит что дело государственной важности...
— Ну, что же впустите.
— Здравствуйте! Я изобретатель! Дайте рассказать про свою идею.
— Ну, что же говорите, раз все равно ворвались.
— Значичь идея такова... Вражеские самалеты подетаютк к нашей границе и вдруг переворачиваются и падают. Здорово?!
— Здорово! И как же это все работеат?!
— Не, ну, вы же ученые? Вам и думать как реализовать. А мое дело идею предложить!!!
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
FR>>>Если бы ты показал конкретный пример использования или хотя бы примеры решения проблем а не воду, было бы совсем другое обсуждение
S>>Вот тогда как раз было бы уже нечего обсуждать — все и так было бы ясно. Но в целом я согласен конечно, что нужны хорошие примеры. Но поскльку дисер мне не нужен, деньги тоже на этом не заработаешь, то и заниматься рутиной (что и так очевидно) мне нет охоты. Поэтому если все это не совсем ясно, или совсем не ясно, то я вполне могу понять, но изменить ничего не могу. Кроме того, я уверен, что даже пары хороших примеров будет недостаточно, поскольку это связано с религиозными воззрениями граждан, которые так просто не изменить. Так что пусть будет как будет. Пусть КОП сам пробивает себе дорогу в жизнь
E>Имхо, уместно повторить здесь анекдот, расказанный VladD2
E>На консилиуме ученых и военных...
E>Входит в кабинет секритарша и гворит:
E>— Тут к вам рвется какой-то товарищь... я его сдержать немогу, говоит что дело государственной важности...
E>— Ну, что же впустите.
E>— Здравствуйте! Я изобретатель! Дайте рассказать про свою идею.
E>— Ну, что же говорите, раз все равно ворвались.
E>— Значичь идея такова... Вражеские самалеты подетаютк к нашей границе и вдруг переворачиваются и падают. Здорово?!
E>— Здорово! И как же это все работеат?!
E>— Не, ну, вы же ученые? Вам и думать как реализовать. А мое дело идею предложить!!!
А мне почему-то сразу вспоминаетя другая ситуация. Когда разрабатывался JBoss где-то на 2-ой или 3-ей версии, то постоянно вламывались какие-то товарици, стучали кулаком по столу и требовали предоставить подробную документацию. Мол так писать системы нельзя, нужна документация, а то пользователям трудно жить. Им вежливо (а иногда и не очень) пытались объяснить, мол, проект бесплатный. Хочешь, смотри в исходники, напряги мозги и реши проблему сам. А лучше будет, если ты вот сам возьмешь и напишешь документацию. Но это доходило очень плохо — есть сорт людей, которые делать ничего не хотят, и особенно бесплатно. Но главное, если такому дать доку, то он выдвинет новые причины, почему он не может использовать систему, т.е. это процесс бесконечный: не так надо было писать программу, ребята, а по-другому! Т.е. критиков всегда больше, и они всегда знают, почему что-то НЕ будет работать, но никогда не знают, а как собственно заставить это работать. Чтобы въехать, скажем в АОП, надо довольно много времени. Для среднего профессора это может занять год (для студента существенно меньше). Это другая парадигма, которая требует изменить взгляд на устройство программы, а потому быстро это не сделать. И жаловаться на трудные условия и объектывные причины здесь бесполезно.
Здравствуйте, savinov, Вы писали:
S>А мне почему-то сразу вспоминаетя другая ситуация. Когда разрабатывался JBoss где-то на 2-ой или 3-ей версии, то постоянно вламывались какие-то товарици, стучали кулаком по столу и требовали предоставить подробную документацию. Мол так писать системы нельзя, нужна документация, а то пользователям трудно жить. Им вежливо (а иногда и не очень) пытались объяснить, мол, проект бесплатный.
Кстати, не понятно почему именно эта история вспоминается. У JBoss-а был продукт, и не было документации, которая бы упростила использование этого продукта. И, что важно, было понятно, что это за продукт, для каких целей он предназначен и какие задачи решает.
В вашем же случае нет продукта, но есть обширное описание чего-то, что предназначено не понятно для чего и может (может ли?) быть использовано не понятно как.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
savinov wrote: > А мне почему-то сразу вспоминаетя другая ситуация. Когда разрабатывался > JBoss где-то на 2-ой или 3-ей версии, то постоянно вламывались какие-то > товарици, стучали кулаком по столу и требовали предоставить подробную > документацию.
Вообще-то по JBoss всегда была очень хорошая и подробная
документация.
Просто до недавнего времени она была платная. То есть надо было
покупать PDFки с докой или их бумажные копии.
> Для среднего профессора это может занять > год (для студента существенно меньше). Это другая парадигма, которая > требует изменить взгляд на устройство программы, а потому быстро это не > сделать.
А я еще могу анекдот вспомнить:
Приходят зайцы к мудрой сове с просьбой:
— Нас едят орлы, волки и лисы. Расскажи, что сделать?
— Ну.. Станьте ежиками.
— А как?
— Не знаю, я стратег, а не тактик.
Если хочется что-то серьезное сделать — то требуется не дикая идея
(которая оказывается просто смесью нескольких паттернов), а хотя
бы подробная проработка решения. Те же паттерны GoF были выделены
после анализа реального кода, а не в результате пустых теоризирований.
Причем водиночку вполне реально сделать интересные вещи — достаточно
посмотреть на mxx_ru или SObjectiser у eao197.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
S>>А мне почему-то сразу вспоминаетя другая ситуация. Когда разрабатывался JBoss где-то на 2-ой или 3-ей версии, то постоянно вламывались какие-то товарици, стучали кулаком по столу и требовали предоставить подробную документацию. Мол так писать системы нельзя, нужна документация, а то пользователям трудно жить. Им вежливо (а иногда и не очень) пытались объяснить, мол, проект бесплатный.
E>Кстати, не понятно почему именно эта история вспоминается. У JBoss-а был продукт, и не было документации, которая бы упростила использование этого продукта. И, что важно, было понятно, что это за продукт, для каких целей он предназначен и какие задачи решает.
Да в том-то и дело, что продукт был относительно новый и с чем его едят было не ясно (широкой аудитории по крайней мере). Без документации по серверу приложений работать крайне трудно, поскольку всегда много "особенностей". Но дело не в этом. А в том, что всегда найдутся недовольные, которые почему-то требуют, чтобы их убедили в чем-то или предоставили что-то. И это раздражает. Если что-то не нравится, то не ешь, либо приготовь это бдюдо лучше.
E>В вашем же случае нет продукта, но есть обширное описание чего-то, что предназначено не понятно для чего и может (может ли?) быть использовано не понятно как.
Предлагается совершенно конкретный механизм. Описание далеко от идеала, это правда. Но ведь и предмет тоже не простой. Я не зря привел пример АОР, поскольку там тоже на первый взгляд не ясно, для чего это все нужно. Я абсолютно уверен, что за несколько дней в КОП точно ничего не понять. И в любом случае надо приложить значительные усилия. Я напрмер, честно пытался разобраться в программе на Питоне. Впечатление тяжелое, но ведь я не плююсь в разработчиков — я уверен, что они сделали свою работу хорошо. Надо просто сделать еще несколько попыток, а там дело пойдет легче.
Впрочем, это нормальная реакция форума. Народ поглазеет, посмеется, поругается и пойдет дальше. Если найдется один другой кто заинтересуется, то задачу можно считать выполненной.
Здравствуйте, Cyberax, Вы писали:
C>Причем водиночку вполне реально сделать интересные вещи — достаточно C>посмотреть на mxx_ru или SObjectiser у eao197.
SObjectizer -- это далеко не в одиночку. Его принципы и идеология была разработана очень, очень мощным коллективом, где я был всего лишь подмастерьем.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Cyberax, Вы писали:
C>>Причем водиночку вполне реально сделать интересные вещи — достаточно C>>посмотреть на mxx_ru или SObjectiser у eao197.
Правильно, принцип простой: если хочешь что-то сделать, то делай, а не критикуй.
E>SObjectizer -- это далеко не в одиночку. Его принципы и идеология была разработана очень, очень мощным коллективом, где я был всего лишь подмастерьем.
Смею предположить, что кто-то за это платил... Но дело не в этом. Представь, что кто-то сейчас в форуме встрянет, и начнет грузить тебя, что сделал ты все не так, делать надо было по-другому, и вообще мне не понятно, что ты там настрогал, а потом будь добр, убеди меня в своей праводе. (Проще говоря, ты козел, но можешь попытаться меня убедить, что это не так.) Я могу представить что ты ему ответишь.
Здравствуйте, savinov, Вы писали:
S>Хороший совет. А главное очень конструктивный. Типа того, что для того, чтобы хорошо жить надо много работать. Это все правильно, но имеет значение только с педагогической точки зрения, поскольку в жизни все к сожалению не так. Почему? Ну например, потому, что проектировать систему можно по-разному, т.е. существует множество разных подходов и еще больше их модификаций.
Есть только один подход это зравый смысл.
Все остальное от лукавого.
WH>>Вот мне почемуто сразу ясно что открыть, а что не нужно. S>А вот мне чем дальше, тем менее ясным становится.
Так может просто поучится проектировать?
S>Как я выше отметил, есть разные подходы к проектированию и такое разделение это всего лишь один из них (не самый лучший).
О как?! А какой по твоему лучший? Делать монолитный клубок? В лес!
S>Вот это мне нравится. Вот только как описать уровни? Какие средства для этого использовать?
А зачем их формально описывать?
Что это нам дает? Какие задачи решает?
S>В настоящее время таковых практически нет (в смысле поддержки в языках программирования).
И не надо. S>А в КОП это одна из основных целей, поскольку слоеная организация системы это основное предположение.
Те КОП ради КОП? В лес! S>Каждый уровень имеет свой способ представления и доступа, свои средства защиты и т.д. Т.е. это свое пространство со своими правилами игры.
Зачем?
От неправильной архитектуры это всеравно не спасет. Это к гадалке не ходи.
От неправильной архитектуры спасает только правильный архитектор. И никакой язык не поможет неправильному архитектору создать правильную архитектуру.
Прокси, а весь твой КОП это прокси в языке, нужны очень редко. И делаются в любом языке не напрягаясь. А в языках с метапрограммированием таких как nemerle делается написанием простенького макроса(не путать с макросами С/С++).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, savinov, Вы писали:
S>Да в том-то и дело, что продукт был относительно новый и с чем его едят было не ясно (широкой аудитории по крайней мере). Без документации по серверу приложений работать крайне трудно, поскольку всегда много "особенностей". Но дело не в этом. А в том, что всегда найдутся недовольные, которые почему-то требуют, чтобы их убедили в чем-то или предоставили что-то. И это раздражает. Если что-то не нравится, то не ешь, либо приготовь это бдюдо лучше.
При чем тут давольние или не довольные. Ты объясни зачем оно нужно?
Я понимаю зачем нужно структурное программирование, зачем нужно ООП, зачем нужно функциональное программирование, зачем нужно метапрограммирование. Я даже понимаю адептов динамически типизированных языков хотя и не согласен с их точкой зрения.
А зачем нужен твой КОП понять не могу.
S>Предлагается совершенно конкретный механизм. Описание далеко от идеала, это правда. Но ведь и предмет тоже не простой.
Все что понятно из твоего описания это то что язык поддерживает генерацию проксей.
Но зачем мне это если есть языки с метапрограммированием?
Ведь я могу написать простенькую метапрограмму которая все это сделает. S>Я не зря привел пример АОР, поскольку там тоже на первый взгляд не ясно, для чего это все нужно.
С АОП все просто и понятно. Это всего лишь частный случай метапрограммирования. А оно появилось еще в Lisp'е если не раньше.
А зачем нужен частный случай если можно иметь общий? S>Я абсолютно уверен, что за несколько дней в КОП точно ничего не понять.
Боюсь мне никогда не понять зачем нужен еще один частный случай метапрограммирования встроенный в язык.
S>Впрочем, это нормальная реакция форума. Народ поглазеет, посмеется, поругается и пойдет дальше. Если найдется один другой кто заинтересуется, то задачу можно считать выполненной.
Ну так бы сразу и сказал что очередной свидетель Оберона...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, savinov, Вы писали:
S>>Да в том-то и дело, что продукт был относительно новый и с чем его едят было не ясно (широкой аудитории по крайней мере). Без документации по серверу приложений работать крайне трудно, поскольку всегда много "особенностей". Но дело не в этом. А в том, что всегда найдутся недовольные, которые почему-то требуют, чтобы их убедили в чем-то или предоставили что-то. И это раздражает. Если что-то не нравится, то не ешь, либо приготовь это бдюдо лучше. WH>При чем тут давольние или не довольные. Ты объясни зачем оно нужно? WH>Я понимаю зачем нужно структурное программирование, зачем нужно ООП, зачем нужно функциональное программирование, зачем нужно метапрограммирование. Я даже понимаю адептов динамически типизированных языков хотя и не согласен с их точкой зрения. WH>А зачем нужен твой КОП понять не могу.
Он позволяет описывать опосредованные представление и доступ к объектам. Проще говоря, мы можем моделировать ссылки и их функции. Это нужно для описания внутренней системы координат и внутренней структуры программы. Чего здесь может быть не ясного.
S>>Предлагается совершенно конкретный механизм. Описание далеко от идеала, это правда. Но ведь и предмет тоже не простой. WH>Все что понятно из твоего описания это то что язык поддерживает генерацию проксей. WH>Но зачем мне это если есть языки с метапрограммированием? WH>Ведь я могу написать простенькую метапрограмму которая все это сделает.
Забудь про прокси. Просто всем не угодишь и каждому надо объяснять на том спец. языке, который он знает. Прокси это один из возможных способов опосредования, т.е. способ вставить посредника. В КОП главная цель состоит в описании общего и максимально универсальноо механизма доступа, т.е. надо научиться моделировать ссылки и их функции. Это позволяет отвязаться от реальности и работать в своем собственном виртуальном пространстве, где живут объекты. Теперь это не объекты в памяти или БД. Это объекты в некотором виртуальном пространстве, где у них свои обозначени, свой жизненный цикл и т.п. Но пользуемся мы ими совершенно так же как и всегда. По моему, более конкретно задачу уже не сформулировать. Если нет, то объясни что не ясно.
S>>Я не зря привел пример АОР, поскольку там тоже на первый взгляд не ясно, для чего это все нужно. WH>С АОП все просто и понятно. Это всего лишь частный случай метапрограммирования. А оно появилось еще в Lisp'е если не раньше. WH>А зачем нужен частный случай если можно иметь общий?
Ну ясно зачем. Поскольку в метапрограммировании есть серьезные дефекты. С помощью АОП их попытались исправить. Причем довольно успешно (отсюда популярность). Но все равно даже в АОП остались серьезные проблемы, а потому ИМХО будущего у него нет.
S>>Я абсолютно уверен, что за несколько дней в КОП точно ничего не понять. WH>Боюсь мне никогда не понять зачем нужен еще один частный случай метапрограммирования встроенный в язык.
S>>Впрочем, это нормальная реакция форума. Народ поглазеет, посмеется, поругается и пойдет дальше. Если найдется один другой кто заинтересуется, то задачу можно считать выполненной. WH>Ну так бы сразу и сказал что очередной свидетель Оберона...
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, savinov, Вы писали:
S>>Хороший совет. А главное очень конструктивный. Типа того, что для того, чтобы хорошо жить надо много работать. Это все правильно, но имеет значение только с педагогической точки зрения, поскольку в жизни все к сожалению не так. Почему? Ну например, потому, что проектировать систему можно по-разному, т.е. существует множество разных подходов и еще больше их модификаций. WH>Есть только один подход это зравый смысл. WH>Все остальное от лукавого.
WH>>>Вот мне почемуто сразу ясно что открыть, а что не нужно. S>>А вот мне чем дальше, тем менее ясным становится. WH>Так может просто поучится проектировать?
Так это от обучения собственно и происходит. Чем больше узнаешь, тем больше сомнений в правильности существующих правил и теорий. Вот раньше было хорошо: ничего не знал и жил спокойно А теперь вот сомнения грызут и хочется что-то человеческое придумать.
S>>Как я выше отметил, есть разные подходы к проектированию и такое разделение это всего лишь один из них (не самый лучший). WH>О как?! А какой по твоему лучший? Делать монолитный клубок? В лес!
Ты говоришь правильные вещи, но это детский сад (выделение интерфейсов и т.п.), т.е. хорошо для преподавания. Ну а правильного подхода не сущестует. Есть просто адекватные и неадекватные, умело применяемые или неумело и т.д. Я бы например начал проектирование системы с построения жилища для объектов, системы их обслуживания и поддержания в нормальном состоянии.
S>>Вот это мне нравится. Вот только как описать уровни? Какие средства для этого использовать? WH>А зачем их формально описывать? WH>Что это нам дает? Какие задачи решает?
Описание уровня это сама первая и главная задача в проектировании. Здесь происходит разделение функций, ответственности, правил безопасности, формат обозначения объектов (ссылок), формат представления объектов и многое другое. В сложной системе основные функции сосредоточены на границах, а не в объектах (не в бизнес-логике). Немного преувеличивая большая система это и есть структура уровней — все остальное это уже мелочи.
S>>В настоящее время таковых практически нет (в смысле поддержки в языках программирования). WH>И не надо.
Кому как. Если получается без этого, то конечно не надо ничего искать нового. У меня например не получается, а потому я построил для себя новую теорию.
S>>А в КОП это одна из основных целей, поскольку слоеная организация системы это основное предположение. WH>Те КОП ради КОП? В лес! S>>Каждый уровень имеет свой способ представления и доступа, свои средства защиты и т.д. Т.е. это свое пространство со своими правилами игры. WH>Зачем? WH>От неправильной архитектуры это всеравно не спасет. Это к гадалке не ходи. WH>От неправильной архитектуры спасает только правильный архитектор. И никакой язык не поможет неправильному архитектору создать правильную архитектуру.
Ну это ясно, никто не спорит. КОП это инструмент, который позволяет автоматизировать определенные задачи и все. А неправильно его использовать никто не запретит. Можно также и без него все правильно сделать. Так, чтобы программировать в стиле ООП совершенно не нужен ОО язык.
WH>Прокси, а весь твой КОП это прокси в языке, нужны очень редко. И делаются в любом языке не напрягаясь. А в языках с метапрограммированием таких как nemerle делается написанием простенького макроса(не путать с макросами С/С++).
Нет, в КОП нет прокси. Я просто сделал сравнение для тех, кто больше ничего не знает. КОП позволяет моделировать ссылки и их функции.
Здравствуйте, savinov, Вы писали:
S>Он позволяет описывать опосредованные представление и доступ к объектам. Проще говоря, мы можем моделировать ссылки и их функции. Это нужно для описания внутренней системы координат и внутренней структуры программы. Чего здесь может быть не ясного.
Не ясно зачем это нужно.
Что это дает?
S>Забудь про прокси. Просто всем не угодишь и каждому надо объяснять на том спец. языке, который он знает.
Я знаю много языков. В данном форуме наверное вобще нет людей которые знают только один язык.
Так что можешь объяснять на любом. В том числе на псевдокоде.
Покажи как все плохо при использованиее традиционных средств и как все хорошо при использовании твоего КОП. Ведь если ты понимаешь какие плюсы дает КОП то и пример тебе не составит труда привести.
А если КОП ничего не дает то на кой черт он нужен? Зачем мне не нужные абстракции? S>Прокси это один из возможных способов опосредования, т.е. способ вставить посредника. В КОП главная цель состоит в описании общего и максимально универсальноо механизма доступа, т.е. надо научиться моделировать ссылки и их функции. Это позволяет отвязаться от реальности и работать в своем собственном виртуальном пространстве, где живут объекты. Теперь это не объекты в памяти или БД. Это объекты в некотором виртуальном пространстве, где у них свои обозначени, свой жизненный цикл и т.п. Но пользуемся мы ими совершенно так же как и всегда. По моему, более конкретно задачу уже не сформулировать. Если нет, то объясни что не ясно.
Ну и чем это отличается от проксей реализующих некоторый интерфейс?
Метапрограммированием можно легко устранить всю ручную работу.
Болие того практика показывает что работать прозрачно с объектами лежащими черт знает где вобще получается очень плохо. И никакие КОП тут не помогут.
Вобще единственный способ построить надежную распределенную или даже просто многопоточную систему это асинхронная посылка сообщений.
Любые другие методы создают массу проблем (хотя иногда они работают) и синтаксическим сахаром их не решить.
S>Ну ясно зачем. Поскольку в метапрограммировании есть серьезные дефекты. С помощью АОП их попытались исправить. Причем довольно успешно (отсюда популярность). Но все равно даже в АОП остались серьезные проблемы, а потому ИМХО будущего у него нет.
А вот с этого места по подробней пожалуйста.
Мне очень интересно знать какие фатальные недостатки есть у метапрограммирования и как их решает АОП.
Ну и о недостатках АОП тоже хочется услышать.
У меня есть свое мнение на этот счет вот только что-то мне подсказывает что оно не совпадает с твоим.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, savinov, Вы писали:
S>Так это от обучения собственно и происходит. Чем больше узнаешь, тем больше сомнений в правильности существующих правил и теорий. Вот раньше было хорошо: ничего не знал и жил спокойно А теперь вот сомнения грызут и хочется что-то человеческое придумать.
А меня уже давно ничего не грызет ибо я всех волков сам давно загрыз... Я просто пишу код и все. Есть сильно распиареное экстримальное программирование так вот я роботаю в сверх экстримальном режиме. Я просто пишу и постоянно рефокторю код. После чего пишу даже не тесты, а фиксаторы поведения системы для того чтобы можно было легко засечь изменение поведения.
После чего перехожу к другой части системы.
S>Ты говоришь правильные вещи, но это детский сад (выделение интерфейсов и т.п.), т.е. хорошо для преподавания. Ну а правильного подхода не сущестует. Есть просто адекватные и неадекватные, умело применяемые или неумело и т.д. Я бы например начал проектирование системы с построения жилища для объектов, системы их обслуживания и поддержания в нормальном состоянии.
Те с "правильного" подхода которого не существует.
S>Описание уровня это сама первая и главная задача в проектировании. Здесь происходит разделение функций, ответственности, правил безопасности, формат обозначения объектов (ссылок), формат представления объектов и многое другое. В сложной системе основные функции сосредоточены на границах, а не в объектах (не в бизнес-логике). Немного преувеличивая большая система это и есть структура уровней — все остальное это уже мелочи.
Те система ради системы? Мне кажется что тебе деньги не за это платят.
Деньги платят за решение задач, а не за устраивание супер сложных границ системы.
S>Кому как. Если получается без этого, то конечно не надо ничего искать нового. У меня например не получается, а потому я построил для себя новую теорию.
А может нужно было просто научится использовать существующие инструменты?
Они прекрасно работаю. А куда можно засунуть твой КОП вобще не понятно.
S>Ну это ясно, никто не спорит. КОП это инструмент, который позволяет автоматизировать определенные задачи и все. А неправильно его использовать никто не запретит. Можно также и без него все правильно сделать. Так, чтобы программировать в стиле ООП совершенно не нужен ОО язык.
Так ты мне объясни какие преймущества дает КОП.
С ООП все понятно. С функциональным программированием тоже. А вот чето дает КОП не понятно.
S>Нет, в КОП нет прокси. Я просто сделал сравнение для тех, кто больше ничего не знает. КОП позволяет моделировать ссылки и их функции.
Зачем? Приведи пример.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, savinov, Вы писали:
S>>Он позволяет описывать опосредованные представление и доступ к объектам. Проще говоря, мы можем моделировать ссылки и их функции. Это нужно для описания внутренней системы координат и внутренней структуры программы. Чего здесь может быть не ясного. WH>Не ясно зачем это нужно. WH>Что это дает?
Это я уже не в состоянии формально объяснить. Это все равно что пытаться объяснить зачем нужно ООП тому, кто всегда применял процедурное программирование. Т.е. что такое ООП он с трудом, но сможет понять, но зачем это нужно — никогда. Для этого нужно только время и большое число примеров. КОП в только в начале пути и этого нет. Поэтому пока я расчитывают только на тех, кто уже интуитивно чувствует, что это дает. Мой личный опыть показывает, что в больших глобальных системах (не только программных) проблемы возникают на стыках пространств (слоев, контейнеров), поэтому этим и надо заниматься. Что такое вообще объект? Этого никто никогда не знает, поскольку объект это ссылка. Есть ссылка — есть объект. Нет ссылки — нет объекта (даже если он есть). Поэтому надо сфокусироваться на ссылках, а не объектах. Это и есть главное смещение в приоритетах. Но я уже сказал, что это вопрос во многом религиозных и многие просто это не воспримут. Тут я помочь не смогу (и никто другой тоже).
S>>Забудь про прокси. Просто всем не угодишь и каждому надо объяснять на том спец. языке, который он знает. WH>Я знаю много языков. В данном форуме наверное вобще нет людей которые знают только один язык. WH>Так что можешь объяснять на любом. В том числе на псевдокоде. WH>Покажи как все плохо при использованиее традиционных средств и как все хорошо при использовании твоего КОП. Ведь если ты понимаешь какие плюсы дает КОП то и пример тебе не составит труда привести. WH>А если КОП ничего не дает то на кой черт он нужен? Зачем мне не нужные абстракции?
Так я привел примеры и показал недостатки прокси. Кроме того, я уже упомянул, что КОП это средство проксирования. Это средство виртуализации и отвязки от реальности. Это средство построения здания в котором живут объекты.
S>>Прокси это один из возможных способов опосредования, т.е. способ вставить посредника. В КОП главная цель состоит в описании общего и максимально универсальноо механизма доступа, т.е. надо научиться моделировать ссылки и их функции. Это позволяет отвязаться от реальности и работать в своем собственном виртуальном пространстве, где живут объекты. Теперь это не объекты в памяти или БД. Это объекты в некотором виртуальном пространстве, где у них свои обозначени, свой жизненный цикл и т.п. Но пользуемся мы ими совершенно так же как и всегда. По моему, более конкретно задачу уже не сформулировать. Если нет, то объясни что не ясно. WH>Ну и чем это отличается от проксей реализующих некоторый интерфейс?
Прокси — это объект, а в КОП мы моделируем ссылки, которые объектами не являются. Таким образом, главная проблема (похоже, я начинаю понимать в чем трудность) в понимании отличия между ссылками и объектами. Ссылки это не менее важные сущности чем объекты, а потому заслуживают таких же средств поддержки. Еще раз:
Есть ссылки и есть объекты.
Объекты не есть ссылки, а ссылки не есть объекты.
Для описания объектов — ООП, для описания ссылок (вместе с объектами) — КОП.
В программе информацию передаются только с помощью ссылок и никак иначе — объекты находятся где-то неизвестно где и никто не знает что это такое.
WH>Метапрограммированием можно легко устранить всю ручную работу. WH>Болие того практика показывает что работать прозрачно с объектами лежащими черт знает где вобще получается очень плохо. И никакие КОП тут не помогут.
Поможет, поскольку именно для этого предназначено. Ну а все абсолютно задачи никто не может решить.
WH>Вобще единственный способ построить надежную распределенную или даже просто многопоточную систему это асинхронная посылка сообщений.
Это уже другая тема. Можно синхронно, можно асинхронно.
WH>Любые другие методы создают массу проблем (хотя иногда они работают) и синтаксическим сахаром их не решить.
Нет тут никако сахара. Все в чистом виде без примесей как в аптеке. Сахар потом появится, когда модификации начнутся.
S>>Ну ясно зачем. Поскольку в метапрограммировании есть серьезные дефекты. С помощью АОП их попытались исправить. Причем довольно успешно (отсюда популярность). Но все равно даже в АОП остались серьезные проблемы, а потому ИМХО будущего у него нет. WH>А вот с этого места по подробней пожалуйста.
Сожалению, но я не эксперт, и знакомился поверхностно. Просто у меня создалось такое впечатление. Возможо, неверное.
WH>Мне очень интересно знать какие фатальные недостатки есть у метапрограммирования и как их решает АОП. WH>Ну и о недостатках АОП тоже хочется услышать. WH>У меня есть свое мнение на этот счет вот только что-то мне подсказывает что оно не совпадает с твоим.
Описывать целевые точки (join points) внутри аспкта это принципиально неправильно (неествественно).
Аспект это дополнение к ООП, т.е. красиво все-таки не удалось сделать. Есит классы и есть аспкты. Два главных элемента это уже слишком сложно. В идеале должен быть только один элемент. Все остальное из него должно получаться.
Ну как следствие проблемы с последовательностью инжекции кода. Например, а что если один аспкт меняет другой аспект, который меняет третий. А что если цикл? Вообще, на каких принципах строить систему? Мне например не ясно, т.е. у меня отторжение.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, savinov, Вы писали:
S>>Так это от обучения собственно и происходит. Чем больше узнаешь, тем больше сомнений в правильности существующих правил и теорий. Вот раньше было хорошо: ничего не знал и жил спокойно А теперь вот сомнения грызут и хочется что-то человеческое придумать. WH>А меня уже давно ничего не грызет ибо я всех волков сам давно загрыз... Я просто пишу код и все. Есть сильно распиареное экстримальное программирование так вот я роботаю в сверх экстримальном режиме. Я просто пишу и постоянно рефокторю код. После чего пишу даже не тесты, а фиксаторы поведения системы для того чтобы можно было легко засечь изменение поведения. WH>После чего перехожу к другой части системы.
И это называется правильный подход к программированию? А потом мучаться угрызениями совести за бесцельно написанные строки?
S>>Ты говоришь правильные вещи, но это детский сад (выделение интерфейсов и т.п.), т.е. хорошо для преподавания. Ну а правильного подхода не сущестует. Есть просто адекватные и неадекватные, умело применяемые или неумело и т.д. Я бы например начал проектирование системы с построения жилища для объектов, системы их обслуживания и поддержания в нормальном состоянии. WH>Те с "правильного" подхода которого не существует.
Люблю диалектику, однако
А правильный подход у каждого свой.
S>>Описание уровня это сама первая и главная задача в проектировании. Здесь происходит разделение функций, ответственности, правил безопасности, формат обозначения объектов (ссылок), формат представления объектов и многое другое. В сложной системе основные функции сосредоточены на границах, а не в объектах (не в бизнес-логике). Немного преувеличивая большая система это и есть структура уровней — все остальное это уже мелочи. WH>Те система ради системы? Мне кажется что тебе деньги не за это платят. WH>Деньги платят за решение задач, а не за устраивание супер сложных границ системы.
Суперсложные границы существуют в предметной области, а нам надо просто это представить в виде программы. А для этого нужны адекватные средства.
S>>Кому как. Если получается без этого, то конечно не надо ничего искать нового. У меня например не получается, а потому я построил для себя новую теорию. WH>А может нужно было просто научится использовать существующие инструменты? WH>Они прекрасно работаю. А куда можно засунуть твой КОП вобще не понятно.
Куда можно засунуть это как раз понятно А вот объяснить как его использовать гораздо для меня сложнее. Вот небольшой пример. Пусть ты хочешь для определенного класса объектов создать свой пул. Ты знаешь опредленные их свойства, например, они не очень большие. Ты не хочешь использовать кучу, поскольку это слишком медленно. Кроме того, ты хочешь этот пул сбрасывать в файл. Но объекты должны использоваться как обычно, т.е. ссылки и метод. В пуле они идентифицируются целым числом, а сами объекты могут перемещаться в буфере (для дефрагментации). Как это сделать? Обычными средствами довольно сложно и неестественно. А в КОП очень просто.
S>>Ну это ясно, никто не спорит. КОП это инструмент, который позволяет автоматизировать определенные задачи и все. А неправильно его использовать никто не запретит. Можно также и без него все правильно сделать. Так, чтобы программировать в стиле ООП совершенно не нужен ОО язык. WH>Так ты мне объясни какие преймущества дает КОП. WH>С ООП все понятно. С функциональным программированием тоже. А вот чето дает КОП не понятно.
Он позволяет моделировать ссылки и виртуализировать представление объектов. Виртуализация позволяет отделить бизнес-логику (в объектах) от промежуточной и вспомогательной бодяги. В ООП это все будет перемешано.
S>>Нет, в КОП нет прокси. Я просто сделал сравнение для тех, кто больше ничего не знает. КОП позволяет моделировать ссылки и их функции. WH>Зачем? Приведи пример.
См. выше.
Другие примеры:
Диагности при доступе к объектам из одного места (логи).
Транзакции (открыть при доступе, закрыть при выходе).
Персистенс (загрузить при доступе, сбросить обратно при выходе).
Удаленность (переслать запрос на др. комп и вернуть результат).
Собственный контейнер для объектов с нужными функциями поддержки жизни.
... (список бесконечен)
Во всех этих случах все эти промежуточные функции принципиально отделены от целевых методов, но описывюатся в самой программе. Оригинальность в том, что мы моделируем ссылки и их функции.
S>Другие примеры: S>Диагности при доступе к объектам из одного места (логи). S>Транзакции (открыть при доступе, закрыть при выходе). S>Персистенс (загрузить при доступе, сбросить обратно при выходе). S>Удаленность (переслать запрос на др. комп и вернуть результат). S>Собственный контейнер для объектов с нужными функциями поддержки жизни. S>... (список бесконечен)
S>Во всех этих случах все эти промежуточные функции принципиально отделены от целевых методов, но описывюатся в самой программе. Оригинальность в том, что мы моделируем ссылки и их функции.
S>Ну как, впечатляет?
Если знаком с метапрограммированием (и тем более с его помощью уже реализовывал подобные вещи) то не впечатляет.
Вот еще пару статей. Они были приняты на одну конфу, но запланированная поездка сорвалась, поэтому это просто драфт, который я где-то должен пристроить. Так что любые комментарии приветствуются.
Последняя статья на любителя, это про концептно-ориентированную модель данных. КОП и КОМ развиваются параллельно, так что может быть интересно (на сайте есть более понятное введение).
B>>Тогда потом можно спокойно использовать
B>>rgb = RGB( 100, 192, 240 ) B>>а будет подставляться прокси.
S>Верю. Но сколько для этого надо было написать кода! Отсюда ясно, что язык не предназначен для таких задач (хотя и может описать какие-то механизмы более или менее удобно). Это хороший пример реализации какого-то паттерна или приема без прямой языковой поддержки. Так можно было то же самое написать на ассемблере или Си, но это бы заняло еще больше строй кода.
1) С каких это пор 10 строк кода это много?
2) А нужна ли языковая поддержка для этого приема, или ему место в библиотеке?
Ну а теперь перетащи это дело в библиотеку, обзови это какой-нибудь функцией. Тогда это будет выглядеть, например, так:
class AbstractConcept:
def __init__(self, propagate=True):
self.propagate=propagate
def accept(self, object): #which objects should be wrappedreturn type(object) is DOMNode
def adapt(self, object):
#навешивает адаптерreturn adapted_object
def __methodhook__(self, object, method, *args, **kw):
if self.propagate:
adapt_args = map(self.adapt, args)
adapt_kw = adaptDict(self.adapt, kw)
return getattr(object, method).__call__(adapt_args, adapt_kw)
else:
class MethodHookConcept(AbstractConcept):
def __init__(self, hooker):
AbstractConcept.__init__(self, True)
self.hooker = hooker
def adapt(self, object):
AbstractConcept.adapt(self)
def __methodhook__(self, object, method, *args, **kw):
AbstractConcept.
hooker.pre(object, method, *args, **kw) #пре-хук на вызов метода
result = AbstractConcept.__methodhook(self, object, method, *args, **kw)
hooker.post(object, method, result) #пост-хук на вызов методаreturn result
начнет работать система по обеспечению перехвата вызова всех методов для узлов DOM какой-нибудь разбираемой HTML. Остальные HTML останутся не связанными.
Кстати, я тут сообразил, как в Java решаются твои задачи — разнообразные механизмы Adapter'ов и INodeAdapter в частности. Поэтому такой пример. Кто понял, о чем я, покивайте
Но честно говоря, все мои попытки написать фреймворки для различных моих программ на питоне заканчивались ничем — стандартные методы проще в использовании, чем мои фреймворки. Язык такой
S>>>Следующая, более важная причина. В КОП во время выполнения поддерживается иерархия объектов, а потому т.н. прокси может иметь несколько внутренних объектов (в его области), для которых он выдал ссылки. В этом смысле этот промежуточный объект это граница пространства через которую проходят запросы и где выполняются промежуточные действия (типа паспортного контроля на границе). Отсутствие иерархии это в КОП частный случай, когда ссылки не используются и мы приходим к ООП.
B>>Че, на те объекты тоже нужны прокси? Или автоматический проксификатор? Ну сделай, правда это чуточку посложнее будет. B>>http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496741
S>Немного сложнее это мягко сказано. Но идея в том, что проксификация часто имеет вложенный характер. S>Это уже вряд ли можно назвать прокси в чистом виде, но я и не применял этот термин, а говорил об опосредовании. Здесь ближе паттерн chain of responsibility
Конечно вложенный! Это очень просто реализуется. Просто я не вижу смысла писать больше программный код. Ты, по видимому, сам придумать такой не в состоянии. А зря, получилась бы отличная библиотечка.
S>... Обычный же подход говорит, что надо создать сперва объекты, а потом создавать для них посредников в виде прокси (хотя бы потому, что прокси без целевых объектов просто не могут быть созданы). Это принципиальное отличие, понимание которого необходимо (что первично, а что вторично).
Это еще что за бред? Ты кроме С++ на чем-нибудь программировал? Какие-нибудь большие системы писал?
То, что проксики ты никогда не писал, я уже понял.
S>>>Ну и я уже устал повторять, что с помощью прокси нельзя моделировать сами ссылки, т.е. их структуру и функции, что составляет как минимум половину всей программы. B>>Да можно. Переименуй мой класс Proxy в класс Concept, добавь ему необходимые тебе методы, и будет тебе счастье!
S>Есть ли в Питоне передача объектов по значению? S>Если как и в Яве нет, тогда и говорить не о чем, поскольку ссылка всегда передается только по значению. S>Ссылка не имеет своей собственно ссылки и это ее отличие от объекта. Но даже если есть передача объектов по значению, как в С++, то сделать из таких объектов ссылки весьма сложно. Нужно очень сильно постараться, чтобы прилепить такого горбатого к стенке. Например, в С++ можно использовать шаблоны и smart pointers.
Ссылка на питоновский объект и есть твоя ссылка — передается по значению. А объекты передаются по ссылкам.
B>>Например, даже если мы напишем S>>>
S>>>то все равно наша ссылка это обычная системная ссылка. B>>Ну да, потому что процессор это обычный системный процессор. Значит системная ссылка обязательно где-то будет! Ну и по логике вещей она будет указывать на этот прокси, который будет проверять границы так, как тебе нужно. Все это можно реализовать в любом языке с интроспекцией, даже в Java и C#. Просто на питоне эти действия будут более простыми, поскольку он ближе к чистому ООП. SmallTalk еще ближе, там это делается еще проще.
S>Ссылка может иметь любой формат и не должна быть объектом. Если ссылка является объектом, то это уже симулирование ссылки, что можно с большим или меньшим успехом сделать с помощью прокси. А я хочу иметь нормальные ссылки в моем собственном формате, а не объект, который ведет себя как ссылка. Объект это объект, а ссылка это ссылка. Это двойственные понятия и их функции в системе ортогональны (взаимно пересекаются). Например, я хочу определить свои толстые ссылки (но не прокси), чтобы далее их использовать как самые обычные системные ссылки. Зачем? Ну затем же, для чего Ява использует свой формат ссылок, а не адреса в памяти. Затем же, для чего ты используешь имена компов, а не их IP-адрес, затем же для чего ты используешь имя файла, а не его номер блока на диске. Я бы сказал, что все программирование сводится просто к разработке такой системы опосредвоаня. Это нужно, что отвязаться от реальности и добиться виртуальности. Виртуализация это другой популярный термин. Мы хотим работать в виртуальной системе координат, а быть привязаны к физической реальности. Например, зачем в процессорах ввели виртуальную адресацию? Ведь это только замедляет доступ, поскольку каждый раз процессор (менеджер памяти) должен пересчитывать где в физической памяти находится элемент. Правильно, для того, чтобы отвязаться от физической памяти, поскольку это придает гибкость. То же самое в программировании. КОП предназначено для разработки своей виртуальной системы обозначений к объектам и прозрачного доступа к ним. В отличие от других языков, где некоторые вещи также можно реализовать, это является первичной и главной целью этого подхода. Убедил?
B>>Подумай о том, что этот объект может быть не в системной куче, а где-нибудь в трудно доступном месте, куда даже лучшая зубная щетка не достает. B>>Ну да, прокси должен доставать объект откуда надо. Например, между машинами, как в CORBA и DCOM. B>>Для питона есть, например, такое: http://pyro.sourceforge.net/ (это аналог Java RMI) B>>Но есть еще и такое: http://pybuild.sourceforge.net/pyinvoke.html B>>В итоге ты абсолютно прозрачно работаешь с объектами, а они на самом деле могут быть на другой машине.
S>Совершенно верно, но все-таки это как раз то, что мы хотим избежать! Это ведь не поддержка на уровне языка, а просто библиотека или какой-то специальный механизм, заточенный под определенный вид задача (в данном случае под удаленные объекты). Такая поддержка существует уже десятки лет в самых разных формах: на уровне ОС, middleware, библиотек и др. штуковин.
S>Наша цель состоит в том, чтобы предоставить универсальные средства на уровне языка программирования. Например, что мне делать, если меня не устраивает Pyro, RMI или CORBA? Ведь это универсальные средства, которые м.б. либо слишком сложными либо слишком простыми, либо слишком небезопасными либо вообще делать не то что нужно. Пусть я хочу, чтобы в удаленное ссылке было еще одно поле с какой-то инфой. В этом смысле КОП как раз и дает языковые средства для описания произвольной системы обозначений обозначений объектов в программе.
Ну что, библиотеки для разных языков писать будем? Книжки выпускать, статьи для ламеров?
В АОП поступили именно так и теперь про них многие знают. Хотя АОП ровно настолько же парадигма, насколько и КОП — узкоприменимая и редко нужная вещь.
Да, и еще по поводу АОП, я никогда не использовал и не собираюсь использовать AspectJ, но тем не менее, всегда замечаю использование паттерна АОП — перехвата метода. Только он нужен. А синтаксический сахар АОП мне до лампочки.
А чтобы написать эту штуку, нужно сделать две вещи:
— рассказать, как было плохо без нее
— рассказать, как станет хорошо с ней.
Только тогда народ уверует. Проверено.
А позиция "а я вот тут просто подумал и изобрел красивую концепцию" — очень плохая. Нельзя так.
Здравствуйте, savinov, Вы писали:
WH>>Не ясно зачем это нужно. WH>>Что это дает?
S>Это я уже не в состоянии формально объяснить. Это все равно что пытаться объяснить зачем нужно ООП тому, кто всегда применял процедурное программирование. Т.е. что такое ООП он с трудом, но сможет понять, но зачем это нужно — никогда.
Не правда! К тому времени, когда я взялся за изучение ООП, я уже вполне неплохо владел процедурным программированием. И когда я увидел примерчик с полиморфным методом draw(), я сказал: "ОК. Во всём этом определённо есть смысл". То есть я увидел, что те задачи, с которыми в не-ООП приходилось мучиться, в ООП решаются легко и элегантно.
Применительно же к КОП ни я, ни прочая уважаемая публика не могут понять, от какого же геморроя избавляет предложенная и так смачно названная, не побоюсь этого слова, парадигма.
S> S>Есть ссылки и есть объекты. S>Объекты не есть ссылки, а ссылки не есть объекты. S>Для описания объектов — ООП, для описания ссылок (вместе с объектами) — КОП. S> S>В программе информацию передаются только с помощью ссылок и никак иначе — объекты находятся где-то неизвестно где и никто не знает что это такое.
Есть объекты, есть ссылки, есть ссылки на ссылки, есть объекты, являющиеся коллекциями ссылок, есть ссылки на коллекции ссылок, ... и т.д.
Объекты вообще передаются только с помощью OID. В качестве OID в ран-тайме традиционно используется адрес в оперативной памяти. Это не только автоматически обеспечивает уникальность OID, но и позволяет организовать самый быстрый, какой только может быть, "доступ к телу" объекта. Принципиальную проблему в использовании адреса в качестве OID я вижу только одну: объект уже сам по себе может иметь OID, не являющийся адресом в ОП. Пример — значение первичного ключа в базе данных. Когда мы загружаем объект в ОП, он паразитическим образом получает ещё один OID что, конечно же, не совсем корректно и, как следствие, потенциально чревато. Например, в памяти может одновременно оказаться несколько экземпляров одного и того же объекта.
Вопрос: а как же исключить возможнось появления таких копий? Самый простой и надёжный способ, который сразу же приходит в голову хоть ОО-, хоть процедурно-ориентированному программисту — это пропустить загрузку объектов через некий единый диспетчер, который уже знает, что загружено, а что — нет. Задача диспетчера — используя "родной" OID, загрузить объект (если он ещё не загружен) в ОП и вернуть "честную" ссылку. Но это такой заштатный наворотец, что он не достоин стать предметом статьи даже для ПТУшной многотиражки.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
WH>>>Не ясно зачем это нужно. WH>>>Что это дает?
S>>Это я уже не в состоянии формально объяснить. Это все равно что пытаться объяснить зачем нужно ООП тому, кто всегда применял процедурное программирование. Т.е. что такое ООП он с трудом, но сможет понять, но зачем это нужно — никогда. V>Не правда! К тому времени, когда я взялся за изучение ООП, я уже вполне неплохо владел процедурным программированием. И когда я увидел примерчик с полиморфным методом draw(), я сказал: "ОК. Во всём этом определённо есть смысл". То есть я увидел, что те задачи, с которыми в не-ООП приходилось мучиться, в ООП решаются легко и элегантно.
Да, но к тому времени ООП уже развивался лет этак 10 или больше! Т.е. была уже сформирована база вот таких примеров и написаны книжки. (Я вовсе кстати не снимаю с себя ответственности, т.е. это не оправдание для меня, а просто я хочу чтобы Вы сделали скидку на самый начальный этап.)
V>Применительно же к КОП ни я, ни прочая уважаемая публика не могут понять, от какого же геморроя избавляет предложенная и так смачно названная, не побоюсь этого слова, парадигма.
Ну а мне совершенно не ясно, а что в этом неяснного и что надо добавить к уже сказанному (действительно так — я не могу понять что тут непонятного). Но я буду стараться. Для того и вынес на форум.
S>> S>>Есть ссылки и есть объекты. S>>Объекты не есть ссылки, а ссылки не есть объекты. S>>Для описания объектов — ООП, для описания ссылок (вместе с объектами) — КОП. S>> S>>В программе информацию передаются только с помощью ссылок и никак иначе — объекты находятся где-то неизвестно где и никто не знает что это такое. V>Есть объекты, есть ссылки, есть ссылки на ссылки, есть объекты, являющиеся коллекциями ссылок, есть ссылки на коллекции ссылок, ... и т.д.
Нет. Сссылок на ссылки нет, есть только ссылки на объекты.
V>Объекты вообще передаются только с помощью OID.
Нет не правда. Нет такого слова OID. Объекты передаются с помощью ссылок, а что за ними стоит неизвестно (при использовании объектов). В этом суть ООП. Раньше (до ООП) мы тоже могли передавать информацию о расположении объектов, например, с помощью адреса в памяти. Но важная заслуга ООП состоит в том, что этот уровень был полностью закрыт и создана иллюзия прямого доступа по ссылке. А что внутри ссылки это уже не забота программиста.
V>В качестве OID в ран-тайме традиционно используется адрес в оперативной памяти.
Что такое рантайм? Что такое оперативная память? Нет таких слов. В ООП есть только ссылки и объекты. Может и пмяти нет, а может и рантайма нет. Это Вы сами придумали.
V>Это не только автоматически обеспечивает уникальность OID, но и позволяет организовать самый быстрый, какой только может быть, "доступ к телу" объекта.
Не согласен. За OID стоит очень сложный и крайне медленный механизм. Так они выдаются ОС, что занимает кучу времени. Выделенными объектами надо управлять и следить за распределением памяти. Процессору надо постоянно следить за безопасностью, чтобы кто-то не сунулся в чужой блок памяти. Менеджеру памяти надо при каждом доступе преобразоввывать его в физический адрес. И т.д. и т.п. Это все замедляет доступ, но преимущества окупаются. Идея КОП в том, что каждый может в своей программе построит такой же механизм.
V>Принципиальную проблему в использовании адреса в качестве OID я вижу только одну: объект уже сам по себе может иметь OID, не являющийся адресом в ОП. Пример — значение первичного ключа в базе данных. Когда мы загружаем объект в ОП, он паразитическим образом получает ещё один OID что, конечно же, не совсем корректно и, как следствие, потенциально чревато. Например, в памяти может одновременно оказаться несколько экземпляров одного и того же объекта.
Раз Вы видите эту проблему, значит Вы уже на полпути к КОП. Это действительно принципиальная проблема. Дело в том, что мы хотим манипулировать объектами в вирутальном пространстве, а не в памяти, на диске или в какой-то другой физической среде, которая дана нам свыше. КОП далет нам возможность разработать свои OID для собственных нужд. Даже, если мы не хотим их разрабатывают, КОП дает нам возможность эффективно разделить эти уровни, т.е. кто-то разработает средства представления и доступа, а другой уже логику самих объектов. Без их смешения. В КОП нет памяти и нет диска и нет удаленного компа. Там есть просто объекты, которые доступаютя по ссылками. Полная виртуализация.
V>Вопрос: а как же исключить возможнось появления таких копий? Самый простой и надёжный способ, который сразу же приходит в голову хоть ОО-, хоть процедурно-ориентированному программисту — это пропустить загрузку объектов через некий единый диспетчер, который уже знает, что загружено, а что — нет. Задача диспетчера — используя "родной" OID, загрузить объект (если он ещё не загружен) в ОП и вернуть "честную" ссылку. Но это такой заштатный наворотец, что он не достоин стать предметом статьи даже для ПТУшной многотиражки.
Молодец. Ты уже мыслишь в терминах КОП. Просто еще это не осознаешь. Так же как в терминах ООП начали программировать задолго до того, как появились первые ОО языка.
Здравствуйте, savinov, Вы писали:
S>Да, но к тому времени ООП уже развивался лет этак 10 или больше! Т.е. была уже сформирована база вот таких примеров и написаны книжки. (Я вовсе кстати не снимаю с себя ответственности, т.е. это не оправдание для меня, а просто я хочу чтобы Вы сделали скидку на самый начальный этап.)
Всё зависит от того, каким образом рождается идея. Тут я вижу два возможных сценария.
1. В ходе решения конкретных задач выясняется, что существующие подходы рождают только некрасивые/трудоёмкие/неэффективные решения. Например, у меня вот это родилось из размышлений о том, почему в серьёзных бизнес-системах (всякое там ERP, CRM, бухгалтерия, склад и т.д.) полноценный ОО-подход при проектировании бизнес-логики не применяется. На низком (технологическом) уровне — сплошь и рядом, со всеми наворотами из GoF, а на высоком — облом полный. Ну не проектируется иерархия классов, хоть ты лопни! И это несмотря на то, что полиморфизьм нужен как воздух т.к. без него получается грандиозный copy/paste, рыхлость и кривизна.
При таком сценарии не нужно даже напрягаться по части примеров, т.к. все теоретические выверты оказываются рождёнными в обдумывании примеров.
Вариант этого же сценария — находим пласт задач, которые вообще никто не берётся решать, и придумываем новую науку. Но это — вообще крутизна, которая случается очень редко.
2. Анализируем существующую теорию (технологию, парадигму и т.п.), находим в ней логическую нестыковку, и во всю глотку кричим: "Камрадос! Я знаю, от чего у вас всех геморрой и отсутствие счастья в личной жизни!". При этом есть ненулевая вероятность, что камрадосы не только не поверят, что у них геморрой именно по этой причине, но и не поверят, что эта логическая нестыковочка действительно является нестыковочкой. Что мы, по-видимому, и имеем удовольствие наблюдать в ветке "Концептно-ориентированное прораммирование (КОП)".
Именно при таком развитии событий мы и имеем проблемы с придумыванием примеров.
Желаю удачи в выдумывании убедительных иллюстративных примеров. Придумаете, заходите ещё.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>Да, но к тому времени ООП уже развивался лет этак 10 или больше! Т.е. была уже сформирована база вот таких примеров и написаны книжки. (Я вовсе кстати не снимаю с себя ответственности, т.е. это не оправдание для меня, а просто я хочу чтобы Вы сделали скидку на самый начальный этап.)
V>Всё зависит от того, каким образом рождается идея. Тут я вижу два возможных сценария.
Думаю, что от происхождения идеи ничего не зависит. Важна просто сама идея.
V>1. В ходе решения конкретных задач выясняется, что существующие подходы рождают только некрасивые/трудоёмкие/неэффективные решения. Например, у меня вот это родилось из размышлений о том, почему в серьёзных бизнес-системах (всякое там ERP, CRM, бухгалтерия, склад и т.д.) полноценный ОО-подход при проектировании бизнес-логики не применяется. На низком (технологическом) уровне — сплошь и рядом, со всеми наворотами из GoF, а на высоком — облом полный. Ну не проектируется иерархия классов, хоть ты лопни! И это несмотря на то, что полиморфизьм нужен как воздух т.к. без него получается грандиозный copy/paste, рыхлость и кривизна. V>При таком сценарии не нужно даже напрягаться по части примеров, т.к. все теоретические выверты оказываются рождёнными в обдумывании примеров. V>Вариант этого же сценария — находим пласт задач, которые вообще никто не берётся решать, и придумываем новую науку. Но это — вообще крутизна, которая случается очень редко.
V>2. Анализируем существующую теорию (технологию, парадигму и т.п.), находим в ней логическую нестыковку, и во всю глотку кричим: "Камрадос! Я знаю, от чего у вас всех геморрой и отсутствие счастья в личной жизни!". При этом есть ненулевая вероятность, что камрадосы не только не поверят, что у них геморрой именно по этой причине, но и не поверят, что эта логическая нестыковочка действительно является нестыковочкой. Что мы, по-видимому, и имеем удовольствие наблюдать в ветке "Концептно-ориентированное прораммирование (КОП)". V>Именно при таком развитии событий мы и имеем проблемы с придумыванием примеров.
Странно, почему тогда нет примеров, если КОП возникла как раз по первому варианту развития? Неувязка, однако. Теорией программирования я никогда не занимался, а существующие направления в программировании изучал только для сравнения с альтернативными решениями.
V>Желаю удачи в выдумывании убедительных иллюстративных примеров. Придумаете, заходите ещё.
Спасибо. Если появятся, то обязательно зайду. Но пока эта задача имеет низкий приоритет (так же как написание документации для готовой бесплатной системы, в которой неленивый и так может разобраться).
1) На парадигму, это, извини, не тянет.
2) Это действительно по сути разновидность паттерна Прокси
3) Есть реализации, где проксирование осуществляется автоматически
4) Наиболее близкая к твоим желаниям реализация есть в .NET. Там это называется TransparentProxy/RealProxy. В этом случае RealProxy является как раз тем, что ты называешь ссылкой. Он не реализует никакого интерфейса прикладного слоя и пишется один на некий фреймворк. Подробнее можешь посмотреть здесь.
TransparentProxy это автоматический объект, создаваемый средой исполнения и умеющий на лету менять набор поддерживаемых публичных контрактов. Служит он для прозрачного использования RealProxy в прикладном коде.
Так что твое счастье уже осуществилось
5) Идея с прозрачной заменой локальных коммуникаций на сетевые плохая.
6) Реализация подобных вещей на низком уровне, вроде тех же TP/RP в .NET создает серьезнейшие проблемы в работе оптимизатора.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, savinov, Вы писали:
AVK>1) На парадигму, это, извини, не тянет. AVK>2) Это действительно по сути разновидность паттерна Прокси
Это вовсе не так. Посто ты проецируешь все ниезвестное, на то, что тебе известно (не только ты конечно).
Более конкретно:
— Даже, если прокси эффективно имитирует интерфейс целевого объекта, то все равно в программе мы используем прокси и храним ссылку на прокси. А что, если мы захтим использовать другой прокси? Менять объявления во всей программе? Наверное и это можно как-то автоматизировать. Можно, например, взять паяльник и изменить что-то в процессоре. Но мы же говорим не об этом.
— Прокси является таким же объектом как и все остальные, а потому вместо задачи "как представить наш целевой объекто" мы должны заново решать задачу "как представить наш прокси". Т.е. прокси ничего не решает. Чувствуешь? Совершенно ничего. Вместо ссылки на объект получаем ссылку на прокси. Ну и что? Мне вообще не нужна системная ссылка. Мне нужна моя собственная, в моем собственом формате. А вдруг эта ссылки изменится через пару минут и объект (в т.ч. прокси) будет в другом месте и иметь другую ссылку, что я тогда должен делать?
— Прокси опосредует только один целевой объект, тогда как в КОП много объектов могут жить в контексте, под защитой одного и того же объекта. Другими словами, запросы на доступ ко многим целевым объектам проходят через один и тот же объект (контейнер, граница пространства, scope и т.п.) Ты же понимаешь, что контейнер это вовсе не прокси.
— В КОП целевые объекты могут иметь разные классы и иметь один и тот же тип ссылки. Сделать прокси настолько же универсальным довольно сложно.
— Прокси это не свойство языка (в частности, не часть ООП). Это просто паттерн, который можно реализовать на чем угодно. Например, в Яве есть динамические прокси, в ДотНет есть прозрачные прокси. Это просто сбоку привинченный механизм. КОП же реализует не просто примочку, а определнную концепцию, видение как должна быть устроена система.
— Концепт осуществляет опосредование как через ссылки, так и через объекты (в двух направлениях) с помощью двойственных методов. Один методы для входа внутрь извне, а другие для использования изнутри. В хорошей системе так всегда и проектируется, но просто все вручную. Ну а прокси имеет очень простое предназначение, т.е. это паттерн, а не принцип программирования.
— Цель КОП не состоит в проксировании. Его цель состоит в создании системы обозначений для объектов (и прозрачного доступа по ней). Ясно, что с проки это не связано, хотя прокси наверное можно было бы как-то прилепить.
AVK>3) Есть реализации, где проксирование осуществляется автоматически
Ну и что? Причем тут вообще проксирование. КОП в этом смысле гораздо ближе к АОП, где очень хорошо реализован прозрачный доступ. Ты же не будешь отверждать, что АОП это и есть проксирование? А КОП еще дальше находится от проксирования, чем АОП.
AVK>4) Наиболее близкая к твоим желаниям реализация есть в .NET. Там это называется TransparentProxy/RealProxy. В этом случае RealProxy является как раз тем, что ты называешь ссылкой. Он не реализует никакого интерфейса прикладного слоя и пишется один на некий фреймворк. Подробнее можешь посмотреть здесь.
Спасибо, посмотрел. Это действительно удобный механизм, но предназначенный для других целей (см. выше).
AVK>TransparentProxy это автоматический объект, создаваемый средой исполнения и умеющий на лету менять набор поддерживаемых публичных контрактов. Служит он для прозрачного использования RealProxy в прикладном коде. AVK>Так что твое счастье уже осуществилось
К сожалению, нет
AVK>5) Идея с прозрачной заменой локальных коммуникаций на сетевые плохая.
Речь не идет и конкретных вещах типа сетевые коммуникации или локальные. Речь идет о виртуализации доступа как такового. А лучше эта виртуализация или хуже будет реализована это уже проблема инженеров. Например, при разработке класса Account нужно абстрагироваться от того, где и как он будет храниться, что дает возможность использовать его независимо от этого, например, account.getBalance(). Заметь, в этом коде нет никакх указаний на то, где находится этот счет, но в КОП гарантируется, что он отработает и вернет остаток счета. Более того, это код не изменится, если мы посадим это счет в локальную БД, в сервер приложений, в глобальную/локальную кучу или еще куда-то, куда нам скажут. Ни сам класс Account, ни код, который его использует не знают где объект реально находится и как к нему будет осуществляться доступ.
AVK>6) Реализация подобных вещей на низком уровне, вроде тех же TP/RP в .NET создает серьезнейшие проблемы в работе оптимизатора.
Опять ты проецируешь на то, что тебе известно. Какая мне разница как это будет оптимизировано? Тебя волнует хорошо или плохо оптимизируется код в АОП? Ты пойми сперва принцип, а до оптимизации кода еще очень далеко. А принцип состоит в том, что нужно виртуализировать всю систему и отвязать ее от реальности. Например, скажи, будь добр, что ты будешь делать, если тебя сборщик мусора от твоего любимого ДотНет не устроит? А в КОП ты всегда имеешь возможность организовать свою собственную систему координат для обозначения объектов со своими жизненными принципами. А в соответствии с твоей логикой АОП это тоже простое проксироване, а не парадигма. Парадигм вообще в этом смысле не существует. ООП это просто объявление структуры данных (что было и раньше), а также использование процедура, где первый параметр указывает на целевой объект. Ну а полиморфизм можно реализовать через косвенные вызовы и виртуальную таблицу. Все это было и раньше. Ничего нового нет. Так в чем же тогда проблема. А в том, что ООП это не виртуальные функции, а взгляд на систему как состоящую из объектов. Соответственно КОП как парадигма это взгляд на систему как состоящую из двух типов элементов: объектов и ссылок. Если ты это поймешь, то далее все пойдет гораздо проще. А если будешь думать как реализовать это имеющимися средствами (т.е. проецировать на существующие значиня), то конечно проекция получится вырожденной, т.е. ничего не увидишь.
Здравствуйте, savinov, Вы писали:
AVK>>1) На парадигму, это, извини, не тянет. AVK>>2) Это действительно по сути разновидность паттерна Прокси
S>Это вовсе не так.
Именно так.
S> Посто ты проецируешь все ниезвестное, на то, что тебе известно (не только ты конечно).
Давай ты не будешь делать выводы о том, что и куда я проецирую, тогда я не буду делать выводы о том, что и куда проециркешь ты, ОК? Начни с того, что собеседники как минимум не глупее тебя и способны понять твои идеи.
S>- Даже, если прокси эффективно имитирует интерфейс целевого объекта, то все равно в программе мы используем прокси и храним ссылку на прокси.
Внешне, на уровне исходного кода это никак не заметно.
S> А что, если мы захтим использовать другой прокси?
Зачем? TransparentProxy не содержит никакой логики, это просто инструментальный мост. На уровне конструкций языка его не существует, это фича CLR. Если тебе надо менять прикладной код, который будет стоять на проходе, то это легко и непринужденно реализуется применением соотв. паттернов внутри RealProxy.
S> Менять объявления во всей программе?
Нет.
S> Наверное и это можно как-то автоматизировать. Можно, например, взять паяльник и изменить что-то в процессоре. Но мы же говорим не об этом.
Не надо ничего паяльником, все уже есть.
S>- Прокси является таким же объектом как и все остальные,
Нет, TP объектом не является. Это именно что некоторое подобие динамически типизированной ссылки.
S> а потому вместо задачи "как представить наш целевой объекто" мы должны заново решать задачу "как представить наш прокси".
Нет.
S> Т.е. прокси ничего не решает. Чувствуешь?
Нет.
S> Совершенно ничего. Вместо ссылки на объект получаем ссылку на прокси.
Какая разница что мы там получаем, если для прогрнаммиста это выглядит абсолютно прозрачно? TransparentProxy, на то она и transparent.
S> Ну и что? Мне вообще не нужна системная ссылка. Мне нужна моя собственная, в моем собственом формате.
Зачем? Формат тебе зачем? Тебе шашечки или ехать?
S> А вдруг эта ссылки изменится через пару минут и объект (в т.ч. прокси) будет в другом месте и иметь другую ссылку, что я тогда должен делать?
В примерах к ремоутингу есть и реализация пула объектов, как ты тут рассказывал, и прозрачное перенаправление вызовов от одной и той же ссылки к разным серверам. Ты бы, вместо того чтобы подозревать меня, что я что то там не понял, попробовал бы поверить в то, что я знаю о чем говорю. Еще раз — механика TP/RP на 100% обеспечивает все, о чем ты тут писал и много чего другого.
S>- Прокси опосредует только один целевой объект,
Нет. RP опосредует любые типы, для которых он создал TP. В частности, в ремоутинге для любого типа объектов существует единственная реализация RP, а именно System.Runtime.Remoting.Proxies.RemotingProxy.
S> тогда как в КОП много объектов могут жить в контексте, под защитой одного и того же объекта.
TP/RP это позволяют. А еще они, к примеру, позволяют автоматически, без участия программиста, менять RP в зависимости от некоего внешнего произвольного контекста (курить ContextBoundObject). Ты о чем то подобном задумывался?
S> Другими словами, запросы на доступ ко многим целевым объектам проходят через один и тот же объект (контейнер, граница пространства, scope и т.п.)
Ага. Только что ты описал remoting в .NET.
S> Ты же понимаешь, что контейнер это вовсе не прокси.
Конечно нет. Только вот контейнер намного лучше очерчивать по усмотрению прикладного программиста, а не разрабочика языка, что нам .NET и предоставляет. В remoting контейнером является домен приложения, в CBO контекст формируется специальным атрибутом и т.п.
S>- В КОП целевые объекты могут иметь разные классы и иметь один и тот же тип ссылки.
И в .NET это возможно. А еще там возможно, что тип ссылки на ходу сменится. Потому что castclass TP тоже перехватывается.
S> Сделать прокси настолько же универсальным довольно сложно.
Нет.
S>- Прокси это не свойство языка (в частности, не часть ООП).
В случае .NET это свойство рантайма. Это еще глубже, чем свойство языка.
S>Ну а прокси имеет очень простое предназначение, т.е. это паттерн, а не принцип программирования.
Паттерн от парадигмы (что такое принцип программирования, я не знаю) отличается только универсальностью и известной применимостью. К примеру, ООП в свое время был тоже паттерном, а метаклассы, являясь в некоторых языках первоклассной сущностью, в других являются просто паттерном.
S>- Цель КОП не состоит в проксировании.
А цель и не может состоять в проксировании. Это всего лишь метод..
AVK>>3) Есть реализации, где проксирование осуществляется автоматически
S>Ну и что? Причем тут вообще проксирование.
При том, что это прекрасный метод для достижения означенных тобой целей.
S> КОП в этом смысле гораздо ближе к АОП,
А АОП, как правило, и реализуется ввиде проксей или прямой модификации кода.
S> где очень хорошо реализован прозрачный доступ. Ты же не будешь отверждать, что АОП это и есть проксирование?
А я и не утверждаю, что КОП это проксирование. КОП это паттерн, ровно как и АОП. Видишь ли, паттерн совсем не обязан быть примитивным. В GoF паттерны простые, потому что это азбука. А, к примеру, паттерн MVC уже существенно сложнее и тянет за собой некоторые философские вопросы. Есть и еще более сложные паттерны.
Ты пытаешься, манипулируя терминами, показать, что ты придумал что то новое. Пока же получается, что придумал ты исключительно новый термин.
S>Спасибо, посмотрел. Это действительно удобный механизм, но предназначенный для других целей (см. выше).
Каких других? Целей там масса. Если даже списать большую часть на ремоутинг (он, кстати, как раз соответствует тем примерам применения, что ты приводил), то остается еще ContextBoundObject, который в самом фреймворке никак не используется. Вот что сказано в MSDN:
Objects that reside in a context and are bound to the context rules are called context-bound objects. A context is a set of properties or usage rules that define an environment where a collection of objects resides. The rules are enforced when the objects are entering or leaving a context. Objects that are not context-bound are called agile objects.
Замени контекст на контейнер и получишь то же самое, что ты тут пишешь. Только, в отличие от твоих вариантов, эта механика значительно гибче и позволяет сделать больше.
Но как средство для экспериментов с твоей теорией и создания примеров, демонстрирующих преимущество пропагандируемого тобой подхода, оно подходит превосходно. Все возможности, о которых ты говоришь, оно реализует без проблем.
AVK>>TransparentProxy это автоматический объект, создаваемый средой исполнения и умеющий на лету менять набор поддерживаемых публичных контрактов. Служит он для прозрачного использования RealProxy в прикладном коде. AVK>>Так что твое счастье уже осуществилось
S>К сожалению, нет
К сожалению да
S>Речь не идет и конкретных вещах типа сетевые коммуникации или локальные. Речь идет о виртуализации доступа как такового. А лучше эта виртуализация или хуже будет реализована это уже проблема инженеров.
Дело не в реализации. Проблемы значительно фундаментальнее. И пока латентность и надежность сетевых коммуникаций не приблизится к показателям локальной шины компьютера, никакой реализацией эти проблемы не решить.
S> Например, при разработке класса Account нужно абстрагироваться от того, где и как он будет храниться, что дает возможность использовать его независимо от этого, например, account.getBalance().
Возможности абстракций не безграничны. Абстрагироваться можно от более менее сопоставимых вещей. Когда же параметры среды отличаются на несколько порядков, абстракция ни к чему хорошему не приведет.
S> Заметь, в этом коде нет никакх указаний на то, где находится этот счет, но в КОП гарантируется, что он отработает и вернет остаток счета.
При чем тут КОП? Это базовые вещи в проектировании, о них известно было несколько десятов лет назад. И существует очень много возможностей этого добиться.
AVK>>6) Реализация подобных вещей на низком уровне, вроде тех же TP/RP в .NET создает серьезнейшие проблемы в работе оптимизатора.
S>Опять ты проецируешь на то, что тебе известно.
Опять ты, вместо обсуждения проблемы, скатился на обсуждение моего понимания. Попробуй предположить, что кое чего не видишь именно ты.
S> Какая мне разница как это будет оптимизировано?
Тебе может и никакой. Но забывать об этом не следует. Возможность эффективно и параллельно выполняться то одна из важнейших возможностей любого решения.
S> Тебя волнует хорошо или плохо оптимизируется код в АОП?
Да.
S> Ты пойми сперва принцип, а до оптимизации кода еще очень далеко.
Принцип я уже давно понял.
S> А принцип состоит в том, что нужно виртуализировать всю систему и отвязать ее от реальности.
Знаешь сколько таких слоев виртуализации в типичной программе? Ничего нового в этом нет.
S> Например, скажи, будь добр, что ты будешь делать, если тебя сборщик мусора от твоего любимого ДотНет не устроит?
Не надо делать предположения о моих любимых.
S> А в КОП ты всегда имеешь возможность организовать свою собственную систему координат для обозначения объектов со своими жизненными принципами.
Ага. Вот в ремоутинге так и сделано. Там, вместо сборщика мусора, своя механика lifetime management.
S> А в соответствии с твоей логикой АОП это тоже простое проксироване, а не парадигма.
Нет у меня такой логики, это ты сам придумал.
S>Соответственно КОП как парадигма это взгляд на систему как состоящую из двух типов элементов: объектов и ссылок. Если ты это поймешь, то далее все пойдет гораздо проще.
Да понял я это уже давно. Это ты никак не поймешь, что ничего нового при этом я не увидел. Поверь, скажем функциональная парадигма на порядке дальше от ООП, чем твое предложение, и ничего, большинство тут затруднений с этим не имеет. Так что забудь о принципиальной непонимаемости твоего подхода.
S> А если будешь думать как реализовать это имеющимися средствами (т.е. проецировать на существующие значиня), то конечно проекция получится вырожденной, т.е. ничего не увидишь.
Вот чтобы проекция и не получалась вырожденной, давай, приводи примеры того, где твоя супеконцепция позволит получить бенефит. А потом мы посмотрим, справится ли с этим механика TP/RP. Пока что все приведенные тобой примеры эта механика на 100% реализует.
Здравствуйте, savinov, Вы писали:
S>Думаю, что от происхождения идеи ничего не зависит. Важна просто сама идея.
В серьёзной научной работе в самом начале всегда прямо или косвенно описывается происхождение идеи. Именно такой preface и позволяет определить контекст, к который нужно поместить описываемую дальше измышлятину. Вне контекста в научном мире ничто не существует.
S>Странно, почему тогда нет примеров, если КОП возникла как раз по первому варианту развития?
Тогда нужно просто вспомнить, с чего всё начиналось
V>>Желаю удачи в выдумывании убедительных иллюстративных примеров. Придумаете, заходите ещё. S>Спасибо. Если появятся, то обязательно зайду.
Подкину идейку. Информационные сущности бывают двух видов:
1. Объекты — это то, что может обладать идентичностью (и, следовательно, иметь какой-либо OID).
2. Не-объекты — это такие сущности, которые ничем, кроме как своим содержимым, не идентифицируются. Например: размер заработной платы, длина отрезка, наименование товара.
Такие не-объекты имеют важное свойство: они не умеют существовать самостоятельно. Они всегда существуют в рамках контекста (который, конечно, уже является объектом). Самое смешное, что не-объекты не обязательно принадлежат примитивным типам данных. Например, всякий суммовой показатель, кроме собственно числового значения, как правило, характеризуется валютой. Соответственно, натуральный показатель — единицей измерения. Даже со строками не всё так просто: в принципе, строковое значение может характеризоваться языком, на котором она написана.
Пример: увеличить зарплату (поле Salary) сотрудника emp на increase USD. Предполагается, что сотрудники, кроме всего прочего, характеризуются валютой взаиморасчётов (SalaryCurrency)
"Обычный" подход, в котором не-объекты не имеют структуры и пассивны:
emp->Salary += ConvertMoney(increase, new Currency("USD"), emp->SalaryCurrency);
Проблема в том, что такой метод не является себя-дурака-устойчивым. Рано или поздно забудется, что денежку нужно конвертнуть, и появится строчка типа:
emp->Salary += increase;
, которая будет исправно работать до тех пор, пока все зарплаты исчисляются в USD. При появлении первой рублёвой зарплаты система заглючит.
Можно, конечно, числовое поле Salary завернуть в программный интерфейс, но если таких числовых полей сотни, то это ж будут не классы, а большие коллекции маловразумительных методов. И, в конце концов, кто-нибудь что-нибудь всё равно забудет.
А можно было бы и так:
emp.Salary += Money(increase, new Currency("USD"));
При этом Salary — это, на самом деле не просто числовое поле, а некая обманка, физически состоящая из двух полей (значение и валюта) и принадлежащая к специальному классу Money, на котором определены арифметические операции, которые при необходимости сами конвертят валюты.
Что характерно, эти самые не-объекты — это даже не структуры в привычном понимании этого слова. Например, одно "физическое" поле Currency (валюта взаиморасчётов) может обслуживать и размер зарплаты, и премиальную ставку, и баланс лицевого счёта сотрудника.
-------------------
Короче, дарю этот иллюстративный пример. Если, конечно, он окажется КОПу по зубам.
Саму же идею не-объектов не дарю. Если эта нива ещё никем не вспахана, то пусть она будет моей
Voblin wrote: > Даже со строками не всё так просто: в принципе, > строковое значение может характеризоваться языком, на котором она написана.
Интересно. Сейчас в рамках Boost'а развивается проект Quan — библиотека
для контроля размерности физических величин.
У них пока рассматриваются только физические величины, то есть такой код:
Здравствуйте, Cyberax, Вы писали:
C>Voblin wrote: >> Даже со строками не всё так просто: в принципе, >> строковое значение может характеризоваться языком, на котором она написана. C>Интересно. Сейчас в рамках Boost'а развивается проект Quan — библиотека C>для контроля размерности физических величин.
Здравствуйте, Cyberax, Вы писали:
C>Интересно. Сейчас в рамках Boost'а развивается проект Quan — библиотека C>для контроля размерности физических величин. C>У них пока рассматриваются только физические величины, то есть такой код:
На мой взгляд, прикручивать размерности к C++ — не совсем здравая идея. Может быть, конечно, я и не прав, но мне больше понравился подход, реализованный в Fortress: http://research.sun.com/projects/plrg/fortress0785.pdf.
Кстати, единицами измерения дело не ограничивается. Например, набор атрибутов, составляющих адрес (Country, City, Street,...) тоже логично обрабатывать как единое целое и в рантайме иметь на всё это великолепие одну "псевдоссылку" Address.
Если посмотреть структуру БД, в которой ведутся какие-нибудь закупки/продажи, то очень часто во многих таблицах можно найти такие наборы полей: Price, Quantity, UnitID, Summ, CurrencyID, VATRate, VATSumm. При этом дело осложняется тем, что поля Price, Quantity, UnitID, Summ, VATRate, VATSumm сидят в таблице (и соответствующем ей классе) OrderDetails, а поле CurrencyID — в таблице Orders. Эти поля настолько повязаны взаимозависимостями, что так и хочется их объединить в один класс.
Так что, единицами измерения дело не ограничивается, хотя пара (Значение, Единица измерения) — это самый очевидный пример не-объекта так как любая скалярная величина — это всё-таки величина, и без указания единицы измерения не имеет ни физического, ни любого другого смысла.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, savinov, Вы писали:
AVK>1) На парадигму, это, извини, не тянет. AVK>2) Это действительно по сути разновидность паттерна Прокси
+1
AVK>3) Есть реализации, где проксирование осуществляется автоматически AVK>4) Наиболее близкая к твоим желаниям реализация есть в .NET. Там это называется TransparentProxy/RealProxy. В этом случае RealProxy является как раз тем, что ты называешь ссылкой. Он не реализует никакого интерфейса прикладного слоя и пишется один на некий фреймворк. Подробнее можешь посмотреть здесь. AVK>TransparentProxy это автоматический объект, создаваемый средой исполнения и умеющий на лету менять набор поддерживаемых публичных контрактов. Служит он для прозрачного использования RealProxy в прикладном коде. AVK>Так что твое счастье уже осуществилось
Вот именно.
Автор топика знаком с концепцией умных указателей (здесь), которой уже сто лет в обед?
С помощью перегрузки оператора "->" в C++ можно как раз добиться желаемого эффекта дополнительных промежуточных действий (при этом естественно все это может быть вложенным).
Об этом уже давно писалось в соотв. литературе.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, savinov, Вы писали:
S>> Совершенно ничего. Вместо ссылки на объект получаем ссылку на прокси.
S>> Ну и что? Мне вообще не нужна системная ссылка. Мне нужна моя собственная, в моем собственом формате.
AVK>Зачем? Формат тебе зачем? Тебе шашечки или ехать?
Это ключевой вопрос. Для понимания КОП нужно понять, что такое ссылка и для чего она нужна. Ну а разновидности прокси это всего лишь один из паттернов, наравне с многими другими языковыми и неязыковыми средствами, которые можно как-то приспособить для решения этой задачи. Так что сравнивать КОП с ними не имеет большого смысла. Это все равно, что сравнивать принципы архитектуры с лопатой. Я буду говорить, как надо строить дом, а ты будешь говорить, что все это можно и лопатой сделать. Причем самое интересное, что ты будешь прав, но я к этому мог бы добавить, что кроме лопаты есть еще экскаватор, отбойный молоток и др. средства. Но все это не имеет отношения к предмету разговора.
S>> А вдруг эта ссылки изменится через пару минут и объект (в т.ч. прокси) будет в другом месте и иметь другую ссылку, что я тогда должен делать?
AVK>В примерах к ремоутингу есть и реализация пула объектов, как ты тут рассказывал, и прозрачное перенаправление вызовов от одной и той же ссылки к разным серверам. Ты бы, вместо того чтобы подозревать меня, что я что то там не понял, попробовал бы поверить в то, что я знаю о чем говорю. Еще раз — механика TP/RP на 100% обеспечивает все, о чем ты тут писал и много чего другого.
Я тебя не подозреваю, а просто говорю, что твои познания имеют довольно далекое отношения к предмету обсуждения. У тебя есть один аргумент: это можно реализовать так-то. А я и не спорю, а верю тебе на слово. Более того, я могу еще предложить еще несколько основных и десяток модификаций того, как можно реализовать что-то подобное. Экстремальный пример состоит в использовании ассемблера. Другой пример, использование CORBA. Если хочется что-то свое, то легко можно написать свой moddleware для удаленных объектов. Но ведь это все как раз то, чего нам НЕ нужно, т.е. с чем мы боремся. И пока ты это не воспримешь, то извини, но я не могу сказать, что ты понял хотя бы цели КОП. Цель КОП состоит в описании ссылок и их функций наравне с объектами, которые они представляют.
S>>- Прокси это не свойство языка (в частности, не часть ООП).
AVK>В случае .NET это свойство рантайма. Это еще глубже, чем свойство языка.
Правильно, т.е. как раз то, что нам НЕ нужно. КОП направлен на создание своего собственного рантайма, своего собственного менеджера объектов, своего собственного формата ссылок, своей среды, своих контейнеров, своей виртуальном машины. Только пожалуйста, не отвечай, что это не нужно (ясно, что все эти функции обычно не будут реализовываться в полном виде). Просто попытайся понять цели КОП как они есть, а не исходя из существующих способов реализации систем, т.е. не проецируй идею на то, что уже известно.
S>>Спасибо, посмотрел. Это действительно удобный механизм, но предназначенный для других целей (см. выше).
AVK>Каких других? Целей там масса. Если даже списать большую часть на ремоутинг (он, кстати, как раз соответствует тем примерам применения, что ты приводил), то остается еще ContextBoundObject, который в самом фреймворке никак не используется. Вот что сказано в MSDN: AVK>
Objects that reside in a context and are bound to the context rules are called context-bound objects. A context is a set of properties or usage rules that define an environment where a collection of objects resides. The rules are enforced when the objects are entering or leaving a context. Objects that are not context-bound are called agile objects.
AVK>Замени контекст на контейнер и получишь то же самое, что ты тут пишешь. Только, в отличие от твоих вариантов, эта механика значительно гибче и позволяет сделать больше.
Ты описываешь свойства платформы, а я говорю о свойствах языка. Ты говоришь о способах реализации, а я говорю о целях реализации. Ты говоришь о механизмах, а я говорю о принципах проектирования. Вывод: мы говорим на разных языках.
Попытаюсь еще раз объяснить. КОП основан на описании ссылок и их функций. Я их не вижу в ДотНет (хотя ДотНет это не язык а платформа). Покажи мне какой язык позволяет моделировать ссылки и тогда можно будет что-то обсуждать. Нет ссылок — нет КОП, а есть ООП. Все остальное к вопросу не имеет отношения, поскольку это вопрос о возможности реализовать ту или иную концепцию на том или ином языке или на той или иной платформе. Экстремальное решение всегда существует — на ассемблере. Ну или попросить Микрософт и ребята встроят в это платформу или сразу в Windows.
S>> Например, при разработке класса Account нужно абстрагироваться от того, где и как он будет храниться, что дает возможность использовать его независимо от этого, например, account.getBalance().
AVK>Возможности абстракций не безграничны. Абстрагироваться можно от более менее сопоставимых вещей. Когда же параметры среды отличаются на несколько порядков, абстракция ни к чему хорошему не приведет.
Я вижу ты мыслишь с точки зрения подрядчика. Я не предлагаю ничего реализовать. Речь НЕ идет о сетях, памяти или процессоре. Речь идет о принципах программирования, т.е. о принципах написания программы. Можно мыслить программу в терминах объектов как учит ООП (опять же не говори о проблемах виртуальных функций или множественном наследовании). Ну а КОП предлагает мыслить программу в терминах ссылок и объектов. Т.е. в КОП ссылки легализуются и выходят из подполья (из рантайма) наружу так, что становятся такими же полноценными сущностями как и объекты. Если это не понять, то дальше нет смысла двигаться.
S>> А если будешь думать как реализовать это имеющимися средствами (т.е. проецировать на существующие значиня), то конечно проекция получится вырожденной, т.е. ничего не увидишь.
AVK>Вот чтобы проекция и не получалась вырожденной, давай, приводи примеры того, где твоя супеконцепция позволит получить бенефит. А потом мы посмотрим, справится ли с этим механика TP/RP. Пока что все приведенные тобой примеры эта механика на 100% реализует.
Я сразу скажу — справится. Но при этом добавлю: это также можно реализовать и другими способами. Извини, но твои аргументы "против" стандартны в том смысле, что сводятся к следующей фразе:
Вновь предложенный механизм можно реализовать так-то. И это будет проще, поскольку такие средства уже имеются и изучены, а для предложенного механизма еще нет.
С ними спорить глупо и бесполезно, поскольку так оно и есть. Ну например, по твоему ООП не было нужно, поскольку я и так могу на Си реализовать все это, причем быстрее и надежнее, поскольку Си уже есть, а С++ только в проекте. По твоему это аргумент против ООП, а по моему это вообще не имеет отношения к делу. Так что решай сам, будем ли мы обсуждать принципы программирования или возможность что-то реализовать помощью тех или иных платформ или паттернов.
Могу только повторить: укажи мне на подход, где бы могли бы описать свою собственную виртуальную систему обозначений объектов и доступа к ним. Если такой нет, то значит КОП как минимум оригинален. Тогда далее стоит вопрос зачем это нужно и полезно ли это. Здесь формальных доказательств быть не может. Но главный аргумент состоит в том, что ссылки являются такими же полноценными элементами программы как и объекты, которые они представляют. Поскольку там сосредоточено много функций, то необходимы средства для их описания (в этой же программе, а не с помощью к-л стандартной платформы).
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Здравствуйте, AndrewVK, Вы писали:
AVK>>Здравствуйте, savinov, Вы писали:
AVK>>1) На парадигму, это, извини, не тянет. AVK>>2) Это действительно по сути разновидность паттерна Прокси АХ>+1
Нет. Различия очевидны:
Прокси это ширма объекта.
КОП это подход к созданию виртуальной системы доступа к объектам.
Сравнение имеет ровно столько смысла, сколько например сравнение прокси и АОП.
AVK>>3) Есть реализации, где проксирование осуществляется автоматически AVK>>4) Наиболее близкая к твоим желаниям реализация есть в .NET. Там это называется TransparentProxy/RealProxy. В этом случае RealProxy является как раз тем, что ты называешь ссылкой. Он не реализует никакого интерфейса прикладного слоя и пишется один на некий фреймворк. Подробнее можешь посмотреть здесь. AVK>>TransparentProxy это автоматический объект, создаваемый средой исполнения и умеющий на лету менять набор поддерживаемых публичных контрактов. Служит он для прозрачного использования RealProxy в прикладном коде. AVK>>Так что твое счастье уже осуществилось
АХ>Вот именно.
Не хотелось бы, но приходится объяснять очевидные вещи, как например, разницу между языком и поддержкой на уровне платформы:
Прокси как ширма объекта, которая реализуется с помощью другого объекта.
Реализация различных "приятностей" на уровне той или иной платформы, например, динамических и прозрачных прокси, удаленных методов, контекстов и др. механизмов.
Язык это язык, а платформа это платформа.
АХ>Автор топика знаком с концепцией умных указателей (здесь), которой уже сто лет в обед? АХ>С помощью перегрузки оператора "->" в C++ можно как раз добиться желаемого эффекта дополнительных промежуточных действий (при этом естественно все это может быть вложенным). АХ>Об этом уже давно писалось в соотв. литературе.
Добиться желаемого эффекта с помощью умных указателей (так же как и с помощью многочисленных других существующих средств) нельзя. Знакомство же с такими механизмами полезно, чтобы понять мотивацию, а также недостатки существующих механизмов.
АХ>Про Nemerle я вообще молчу .
Вы хотите сказать, что Немерле есть средства описания ссылок? Если нет, тогда это просто проявление эрудиции, а КОП это прост повод.
S>Добиться желаемого эффекта с помощью умных указателей (так же как и с помощью многочисленных других существующих средств) нельзя. Знакомство же с такими механизмами полезно, чтобы понять мотивацию, а также недостатки существующих механизмов.
Так ты бы перечислил недостатки существующих механизмов.
АХ>>Про Nemerle я вообще молчу .
S>Вы хотите сказать, что Немерле есть средства описания ссылок? Если нет, тогда это просто проявление эрудиции, а КОП это прост повод.
Любой язык подерживающий метапрограммирование позволяет легко делать то для чего ты хочешь использовать свой КОП. Поэтому непонятно зачем он нужен.
Здравствуйте, savinov, Вы писали:
S>Нет. Различия очевидны: S>
S>Прокси это ширма объекта. S>КОП это подход к созданию виртуальной системы доступа к объектам. S>S>Сравнение имеет ровно столько смысла, сколько например сравнение прокси и АОП.
Это демагогия. Какая разница, если прокси позволяет сделать то, что вы хотите сделать с помощью КОП.
И без всяких умных слов вроде "подход к созданию виртуальной системы доступа к объектам" .
)
S>Не хотелось бы, но приходится объяснять очевидные вещи, как например, разницу между языком и поддержкой на уровне платформы: S>
S> Прокси как ширма объекта, которая реализуется с помощью другого объекта. S> Реализация различных "приятностей" на уровне той или иной платформы, например, динамических и прозрачных прокси, удаленных методов, контекстов и др. механизмов. S>S>Язык это язык, а платформа это платформа.
А зачем нужна какая-то платформа если достаточно средств языка (+ библиотеки)?
Рантайм языка в каком-то смысле и есть платформа.
Или вам надо обязательно чтобы сразу все отказались от там .NET, Java и бегом на новую платформу?
АХ>>Автор топика знаком с концепцией умных указателей (здесь), которой уже сто лет в обед? АХ>>С помощью перегрузки оператора "->" в C++ можно как раз добиться желаемого эффекта дополнительных промежуточных действий (при этом естественно все это может быть вложенным). АХ>>Об этом уже давно писалось в соотв. литературе.
S>Добиться желаемого эффекта с помощью умных указателей (так же как и с помощью многочисленных других существующих средств) нельзя. Знакомство же с такими механизмами полезно, чтобы понять мотивацию, а также недостатки существующих механизмов.
Почему нельзя?
Приведите конкретный пример (а не словоблудие) чего нельзя сделать с помощью умных указателей и можно с помощью КОП.
АХ>>Про Nemerle я вообще молчу .
S>Вы хотите сказать, что Немерле есть средства описания ссылок? Если нет, тогда это просто проявление эрудиции, а КОП это прост повод.
Здравствуйте, savinov, Вы писали:
S>Ну значит метаклассы это неплохая вещь. Я уже отмечал, что элементы решения предлагаются в самых разных подходах. Вопрос тогда состоит в сравнении разных подходов, в частности, метаклассов и КОП. Если какой-то эксперт по метаклассам мог сказать что-то конкретное по этому поводу, было бы весьма интересно. (А я тем временем, попытаюсь сам разобраться.) Кстати, насколько я помню, метаклассы зародились еще до АОП, и были толчком к развитию АОП. Значит ли это, что в метаклассах нашли какие-то недостатки, которые попытались исправить в АОП?
Метаклассы -- понятие гораздо более широкое, чем то, которое вы называете AOP.
Я предпочитаю рассматривать AOP как subset MOPa, что во многом соответствует оригинальной идее АОП. Gregor Kiczales сделал попытку обобщить достаточно абстрактую теорию MOP в конкретную мэнстримовскую реализацию.
S>Вообше, по большому счету, КОП движется именно в этом большом направлении, где мы хотим создать для себя свою собственную среду, т.е. изменить законы функционирования программы и объектов внутри этой же самой прораммы. В КОП каждый объект это с одной стороны просто объект, а с другой это среда для других (внутренних) объектов.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, savinov, Вы писали:
S>>Другие примеры: S>>Диагности при доступе к объектам из одного места (логи). S>>Транзакции (открыть при доступе, закрыть при выходе). S>>Персистенс (загрузить при доступе, сбросить обратно при выходе). S>>Удаленность (переслать запрос на др. комп и вернуть результат). S>>Собственный контейнер для объектов с нужными функциями поддержки жизни. S>>... (список бесконечен)
S>>Во всех этих случах все эти промежуточные функции принципиально отделены от целевых методов, но описывюатся в самой программе. Оригинальность в том, что мы моделируем ссылки и их функции.
S>>Ну как, впечатляет?
FR>Если знаком с метапрограммированием (и тем более с его помощью уже реализовывал подобные вещи) то не впечатляет.
Да и не обязательно с метапрограммированием. Все это уже 100 раз реализовано(хотя бы у Фаулера )
Если же говорить о красоте решения, то тут можно рассмотреть АОП как паттерн, а метапрограммирование (будь то немерле или еще что) -- как средство для реализации этого паттерна.
Так что и КОП -- это скорее всего паттерн в данном контексте.
АХ>Приведите конкретный пример (а не словоблудие) чего нельзя сделать с помощью умных указателей и можно с помощью КОП.
Было бы хорошо, но тогда я бы всю жизнь придумывал примеры, поскольку таких средств реализации как умные указатели очень много. Т.е. надо выбирать: либо двигаться вперед, либо смотреть назад. Потом Вы мне предложите показать сравнение с реализацией на ассемблере, на Прологе на паттернах ГОФ. Я бы это с радостью сделал, но Вам это не поможет понять подход: только Вы сами можете себя убедить в чем-то. Так что дерзайте, если желаете, а если нет, так не надо искать искусственные причины типа это все давно известно.
Но я удовольствием отвечу на вопросы по существу КОП.
АХ>>>Про Nemerle я вообще молчу .
S>>Вы хотите сказать, что Немерле есть средства описания ссылок? Если нет, тогда это просто проявление эрудиции, а КОП это прост повод.
АХ>Здесь уже приводили пример: АХ>Re[9]: Концептно-ориентированное прораммирование (КОП)
Я не увидел там нужной логики вообще и ссылок в частности.
Насколько я понял, там реализуется следующая логика:
объект хранит идентификатор.
для доступа к объекту определяется стандартный интерфейс с методом, который по id возвращает ссылку
метод реализуется в центральном пункте доступа, где собственно решается, откуда его вынуть
Это стандартный (в чем-то наивный) подход, который имеет мало отношения к теме КОП. Вот его принципиальные недостатки:
Объект хранит свой идентификатор. Это не просто недостаток — это приговор. Пример, как делать не надо (антипаттерн). Средства идентификации и доступа нельзя совмещать с основной бизнес-логикой. Но в ООП обычно другого выхода нет.
В программе мы получаем ссылку на объект путем разрешения идентификатора. Это тоже антипаттерн, причем имеющий фундаментальное значение. Получать разрешенную ссылку нельзя. Это очень небезопасно. По той же причине, почему агенты спец.служб используют клички, а по записи в БД вы никогда не получите адрес в памяти. Такой подход работает только в игрушечных системах.
Так и не определен нужный формат ссылки.
Мы не можем просто применить метод к идентификатору и получить результат.
Вам понятны эти аргументы? Если нет, тогда задайте конкретный вопрос.
Здравствуйте, Андрей Хропов, Вы писали:
АХ>Здравствуйте, savinov, Вы писали:
S>>Нет. Различия очевидны: S>>
S>>Прокси это ширма объекта. S>>КОП это подход к созданию виртуальной системы доступа к объектам. S>>S>>Сравнение имеет ровно столько смысла, сколько например сравнение прокси и АОП. АХ>Это демагогия. Какая разница, если прокси позволяет сделать то, что вы хотите сделать с помощью КОП. АХ>И без всяких умных слов вроде "подход к созданию виртуальной системы доступа к объектам" .
Демагонией как раз Вы занимаетесь, поскольку приводите аргументы типа "подход А не нужен, поскльку его можно реализовать с помощью средства Б". Очевидно, что это демагония. Следуя этому правилу поддержка виртуальных методов вовсе не нужна, поскольку все это уже существовало давным давно, например, берешь таблицу указателей на функции и все. Реляционная модель данных тоже не нужна, поскольку все нужное можно реализовать самому. Ну и т.д.
АХ>Или вам надо обязательно чтобы сразу все отказались от там .NET, Java и бегом на новую платформу?
Нет, мне вообще ничего не надо, а уж тем более, чтобы кто-то куда-то переходил. Я думаю, Вы не о том думаете.
АХ>>>Автор топика знаком с концепцией умных указателей (здесь), которой уже сто лет в обед? АХ>>>С помощью перегрузки оператора "->" в C++ можно как раз добиться желаемого эффекта дополнительных промежуточных действий (при этом естественно все это может быть вложенным). АХ>>>Об этом уже давно писалось в соотв. литературе.
S>>Добиться желаемого эффекта с помощью умных указателей (так же как и с помощью многочисленных других существующих средств) нельзя. Знакомство же с такими механизмами полезно, чтобы понять мотивацию, а также недостатки существующих механизмов.
АХ>Почему нельзя?
Из-за высокой сложности и весьма ограниченных возможностей. Например, где здесь механизм (иерархического) разрешения ссылок? Где здесь сложные ссылки, состоящие из нескольких сегментов (типа почтового адреса)? Где здесь перехват нужных методов и неперехват ненужных? Где здесь двойственные методы? И еще много других "где" и "как". Умные указатели это приспособа, которая без самой себя, без реализации с помощью шаблонов не существует. А КОП это набор принципов, а уже потом их реализация. На КОП можно программировать и без КО языка.
Я допускаю, что что-то можно сделать умными ссылками и добиться определенного эффекта, но какой ценой.
Здравствуйте, savinov, Вы писали:
S>Это ключевой вопрос. Для понимания КОП нужно понять, что такое ссылка и для чего она нужна.
Я это прекрасно понимаю. Давай дальше.
S> Ну а разновидности прокси это всего лишь один из паттернов, наравне с многими другими языковыми и неязыковыми средствами, которые можно как-то приспособить для решения этой задачи.
Не знаю что ты хотел сказать словом приспособить. Я бы употребил глагол использовать.
S> Так что сравнивать КОП с ними не имеет большого смысла.
КОП это нечто несуществующее. Я же предлагаю тебе существующее решение, которое все что ты перечислил решает.
S> Это все равно, что сравнивать принципы архитектуры с лопатой.
Негодное сравнение.
S>Я тебя не подозреваю, а просто говорю, что твои познания имеют довольно далекое отношения к предмету обсуждения.
Малчык, ты бы заканчивал рассуждать о моих познаниях, а то, сдается мне, если занеяться пенисометрией, то результаты измерений окажутся далеко не в твою пользу.
S> У тебя есть один аргумент: это можно реализовать так-то.
А у тебя их вобще нет.
S>Другой пример, использование CORBA. Если хочется что-то свое, то легко можно написать свой moddleware для удаленных объектов.
Можно. Ты это к чему привел?
S> Но ведь это все как раз то, чего нам НЕ нужно, т.е. с чем мы боремся.
А с чем вы боретесь?
S>И пока ты это не воспримешь, то извини, но я не могу сказать, что ты понял хотя бы цели КОП.
Ну ну.
S> Цель КОП состоит в описании ссылок и их функций наравне с объектами, которые они представляют.
Абалдеть. Ну описали мы их. Дальше что? Пока что ты описываешь исключительно шашечки. Ехать куда?
AVK>>В случае .NET это свойство рантайма. Это еще глубже, чем свойство языка.
S>Правильно, т.е. как раз то, что нам НЕ нужно.
А что вам нужно?
S> КОП направлен на создание своего собственного рантайма,
Сильно. Дальше можно не продолжать.
S>Просто попытайся понять цели КОП как они есть
Чтобы эти цели понять, их бы надо привести. А пока что ты приводишь не цели, а какое то обрывочное собственное видение.
Итак, цели могут быть:
1) Ускорение разработки
2) Улучшение качества кода
4) Улучшение масштабируемости
5) Улучшение командной разработки
6) Увеличение читаемости кода
И так далее. А как только ты с целями определишься, будь добр, проведи анализ, каким образом КОП помогает этих целей достич и в чем преимущество по сравнению с существующими решениями. Пока ты этого не сделаешь, все твои теории не стоят денег, потраченных на трафик для их передачи.
S>, а не исходя из существующих способов реализации систем, т.е. не проецируй идею на то, что уже известно.
А ты уверен, что ты придумал что то новое?
AVK>>Замени контекст на контейнер и получишь то же самое, что ты тут пишешь. Только, в отличие от твоих вариантов, эта механика значительно гибче и позволяет сделать больше.
S>Ты описываешь свойства платформы, а я говорю о свойствах языка.
Ну и что?
S> Ты говоришь о способах реализации, а я говорю о целях реализации. Ты говоришь о механизмах, а я говорю о принципах проектирования. Вывод: мы говорим на разных языках.
Вывод — ты сам плохо представляешь, о чем ты говоришь. Иначе я не могу предположить, почему ты не можешь внятно ответить ни на один заданный в этом топике вопрос.
S>Попытаюсь еще раз объяснить. КОП основан на описании ссылок и их функций.
Здорово. Едем дальше.
S> Я их не вижу в ДотНет (хотя ДотНет это не язык а платформа).
Ты же только что рассуждал, что ты говоришь об архитектурных принципах, т.е. о высоком. А теперь рассказываешь о том, что в платформе нет этого самого высокого. Нестыковочка выходит. Так вот, твоя идея реализуется на базе того, что в дотнете уже существует. Идея остается идеей, физическая реализация реализацией. Understand?
S> Покажи мне какой язык позволяет моделировать ссылки и тогда можно будет что-то обсуждать.
Любой нормальный язык на платформе .NET.
S> Нет ссылок — нет КОП, а есть ООП.
А КОП уже противопоставляется ООП?
AVK>>Возможности абстракций не безграничны. Абстрагироваться можно от более менее сопоставимых вещей. Когда же параметры среды отличаются на несколько порядков, абстракция ни к чему хорошему не приведет.
S>Я вижу ты мыслишь с точки зрения подрядчика.
Это плохо?
S> Я не предлагаю ничего реализовать.
Тогда нафига ты нужен?
S>Речь идет о принципах программирования, т.е. о принципах написания программы.
А ехать?
S> Можно мыслить программу в терминах объектов как учит ООП (опять же не говори о проблемах виртуальных функций или множественном наследовании). Ну а КОП предлагает мыслить программу в терминах ссылок и объектов.
Помыслили. Ехать куда?
S>Я сразу скажу — справится. Но при этом добавлю: это также можно реализовать и другими способами. Извини, но твои аргументы "против" стандартны
Это плохо?
S>С ними спорить глупо и бесполезно,
Да, с фактами спорить действительно глупо и бесполезно. Но пытаться придумать бесполезную вещь еще более глупо и бесполезно. По определению.
S> поскольку так оно и есть. Ну например, по твоему ООП не было нужно,
Это оно по твоему не нужно. А по моему очень даже.
S> поскольку я и так могу на Си реализовать все это,
Совершенно верно, можно.
S> причем быстрее и надежнее,
А это абсолютно не так. ООП, буде поддержана языком и рантаймом, становится реализуемой на порядок проще и надежнее. Это факт. Вот точно таких же фактов от тебя ожидают все в этом форуме.
S>По твоему это аргумент против ООП, а по моему это вообще не имеет отношения к делу.
И давай не будем заниматься демагогией, т.е. приписывать мне то, чего я никогда не говорил, а потом, на основании этого, делать выводы о глубине моих заблуждений.
S> Так что решай сам, будем ли мы обсуждать принципы программирования или возможность что-то реализовать помощью тех или иных платформ или паттернов.
Мы будем обсуждать что угодно, если ты потрудишься обосновать смысл своих предложений.
S>Могу только повторить: укажи мне на подход, где бы могли бы описать свою собственную виртуальную систему обозначений объектов и доступа к ним.
Пример. На любом доступном тебе языке или псевдокоде.
S> Если такой нет, то значит КОП как минимум оригинален.
Понимаешь, придумать что либо оригинальное не сложно. Хочешь докажу?
Итак, новая секретная разработка наших ученых — Сексуально Ориентированное Программирование. Сокращенно СОП.
В отличие от устаревшего ООП, СОП предполагает вместо объектов использовать субъекты. Субъекты бывают двух базовых типов — man и women. Между собой они взаимодействуют посредством связей — links. Политика образования связей формируется специальной сущностью, называемой behavior. Совокупность субъектов, объединенных связями называетс community. Программа представляет из себя структуру, состоящую из фрактально (возможно иерархически) сформированных community.
Ну как, на дисер тянет?
Кстати, тест на твои собственные познания в теории языков, коль скороты взялся оценивать мои. То, что я описал, на самом деле всего лишь частный случай одной из существующих парадигм. Догадаешься какой?
S> Тогда далее стоит вопрос зачем это нужно и полезно ли это.
Он не далее стоит, он стоит в самом начале.
S> Здесь формальных доказательств быть не может.
А раз не может быть формальных доказательств, значит их не может быть вовсе? Так что ли?
S> Но главный аргумент состоит в том, что ссылки являются такими же полноценными элементами программы как и объекты,
Они и так являются. Даже в ООП. А в .NET, хуже того, ссылка это примитив рантайма. А для кастомизации этих самых ссылок как раз и служит TP. Только, видишь ли в чем проблема, применимость у этой кастомизации на практике оказалась весьма невелика.
Здравствуйте, savinov, Вы писали:
S>Демагонией как раз Вы занимаетесь, поскольку приводите аргументы типа "подход А не нужен, поскльку его можно реализовать с помощью средства Б". Очевидно, что это демагония.
Очевидно нет. Если с помощью А можно реализовать идею столь же эффективно, сколь с помощью нового подхода, то новый подход не нужен. По моему это очевидно. Не потрудитесь ли обосновать, в чем здесь демагогия.
S> Следуя этому правилу поддержка виртуальных методов вовсе не нужна, поскольку все это уже существовало давным давно, например, берешь таблицу указателей на функции и все.
Нет, не все. Это значительно сложнее и код получается менее качественным. Так что вперед, показывать, что КОП может выразить то или иное полезное решение лучше, чем любое из существующих средств.
S> Реляционная модель данных тоже не нужна, поскольку все нужное можно реализовать самому. Ну и т.д.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, savinov, Вы писали:
S>>Демагонией как раз Вы занимаетесь, поскольку приводите аргументы типа "подход А не нужен, поскльку его можно реализовать с помощью средства Б". Очевидно, что это демагония.
AVK>Очевидно нет. Если с помощью А можно реализовать идею столь же эффективно, сколь с помощью нового подхода, то новый подход не нужен. По моему это очевидно. Не потрудитесь ли обосновать, в чем здесь демагогия.
Демагогия в отсутствии точных критериев оценки (эффективности и простоты). Слова "можно реализовать" или даже "можно реализовать лучше, проще и эффективнее" имеют весьма общий характер. И спорить в такими утверждениями нельзя. Например, Ява в 10 раз медленнее, чем С++, ну и что? Там существенно меньше возможностей, ну и что? Простота и красотва — вот единственный критерий, но он неформальный.
S>> Следуя этому правилу поддержка виртуальных методов вовсе не нужна, поскольку все это уже существовало давным давно, например, берешь таблицу указателей на функции и все.
AVK>Нет, не все. Это значительно сложнее и код получается менее качественным. Так что вперед, показывать, что КОП может выразить то или иное полезное решение лучше, чем любое из существующих средств.
Про виртуальные методы я как раз понимаю, но Вы никогда это не докажете человеку, который привык реализовывать все вручную, и тем более, если для этого есть библиотека, и уже подавно, если он сам этого не хочет.
S>> Реляционная модель данных тоже не нужна, поскольку все нужное можно реализовать самому. Ну и т.д.
AVK>А это уж точно демагогия. Объяснять почему?
Это как раз Ваша логика, которую я привел для иллюстрации демагогии. Я уже как-то опоминал, что проблема состоит в том, что один конкретный человек обычно имеет свою излюбленную область, где он действительно является экспертом. А далее он утверждает, что с помощью известных ему механизмов он сделает все лучше, чем с помощью альтернативных методов. И он будет прав. Если взять пример с реляционной моделью, то знаете скольким людям она действительно не нужна, причем совершенно обоснованно, поскольку они способны все сделать вручную гораздо быстрее и надежнее? На этом (и большинстве других) форумах обсуждение как раз и сводится к религиозным боям не на жизнь а на смерть, где главным аргументом является "я сам с помощью метода А сделаю все лучше, чем ты предлагаешь с помощью метода Б". Нет постановки проблемы, нет критериев эффективности, нет ничего, кроме желания показать, что ты самый крутой. Что касается меня, то я в таких спорах не участвую ввиду их бессмысленности (поскольку это демагогия).
Если Вы хотите дискуссии по существу, то задавайте вопросы по существу. Вопрос по существу отличается от пустого вопроса наличием хотя бы одного-двух терминов, специфичных для обсуждаемого вопроса. Вопсро типа "докажите мне, что это лучше" таких терминов не содержит. Кроме того, это претензия, а не вопрос. Так что я могу только еще раз попросить: задавайте вопросы по существу предлагаемого механизма. Если у Вас нет времени и/или желания вникать в детали, то просто не завайте вопросов и все.
Здравствуйте, Voblin, Вы писали:
V>Здравствуйте, savinov, Вы писали:
S>>Думаю, что от происхождения идеи ничего не зависит. Важна просто сама идея. V>В серьёзной научной работе в самом начале всегда прямо или косвенно описывается происхождение идеи. Именно такой preface и позволяет определить контекст, к который нужно поместить описываемую дальше измышлятину. Вне контекста в научном мире ничто не существует.
Да, известно, что в научном мире очень не любят (мягко говоря), когда что-то или кто-то возникает из вакуума (поскольку это приводит к напрягу, которого никто не любит). Но в данном случае у идеи действительно нет происхождения в "научном " смысле, т.е. нет непрерывной истории развития. КОП развился из реальной потребности на низком уровне, и общих предположений о принципах функционирования систем на высоком уровне.
S>>Странно, почему тогда нет примеров, если КОП возникла как раз по первому варианту развития? V>Тогда нужно просто вспомнить, с чего всё начиналось
Так долго не живут Да и, как уже упомянул, нет смысла, поскольку нет цели придать этой работе "научный" характер в традиционном смысле этого слова (в смысле, это не главная цель).
V>>>Желаю удачи в выдумывании убедительных иллюстративных примеров. Придумаете, заходите ещё. S>>Спасибо. Если появятся, то обязательно зайду.
V>Подкину идейку. Информационные сущности бывают двух видов: V>1. Объекты — это то, что может обладать идентичностью (и, следовательно, иметь какой-либо OID). V>2. Не-объекты — это такие сущности, которые ничем, кроме как своим содержимым, не идентифицируются. Например: размер заработной платы, длина отрезка, наименование товара.
Сразу скажу, что разделение на объекты и не-объекты очень сильное предположение, и оно мне очень нравится. Хотя бы потому, что именно так делается в КОП. Правда в КОП не-объекты это в первую очередь ссылки, задача которых состоит в представлении объектов (хотя никто не запрещает использовать их для других целей). Конечно, сила идеи вовсе не в том, что мы допускаем передачу по значению, а в том, что устанавливаем формулируем такое разделение на объекты и не-объекты в качестве первичного предположения, а потом выводим из него следствия. В КОП такое разделение это частный случай свойства двойственности, которое играет важную роль также в концептно-ориентированной модели данных .
V>Такие не-объекты имеют важное свойство: они не умеют существовать самостоятельно. Они всегда существуют в рамках контекста (который, конечно, уже является объектом). Самое смешное, что не-объекты не обязательно принадлежат примитивным типам данных. Например, всякий суммовой показатель, кроме собственно числового значения, как правило, характеризуется валютой. Соответственно, натуральный показатель — единицей измерения. Даже со строками не всё так просто: в принципе, строковое значение может характеризоваться языком, на котором она написана.
Да, ссылки (не-объекты) в КОП имеют любую структуру и функции, поскольку описываются классом. Т.е., изначально предполагается, что есть классы ссылок и классы объектов для описания структуры и функций двух типов сущностей.
V>Пример: увеличить зарплату (поле Salary) сотрудника emp на increase USD. Предполагается, что сотрудники, кроме всего прочего, характеризуются валютой взаиморасчётов (SalaryCurrency) V>"Обычный" подход, в котором не-объекты не имеют структуры и пассивны: V>
emp->>Salary += ConvertMoney(increase, new Currency("USD"), emp->SalaryCurrency);
V>
V>Проблема в том, что такой метод не является себя-дурака-устойчивым. Рано или поздно забудется, что денежку нужно конвертнуть, и появится строчка типа: V>
emp->>Salary += increase;
V>
V>, которая будет исправно работать до тех пор, пока все зарплаты исчисляются в USD. При появлении первой рублёвой зарплаты система заглючит. V>Можно, конечно, числовое поле Salary завернуть в программный интерфейс, но если таких числовых полей сотни, то это ж будут не классы, а большие коллекции маловразумительных методов. И, в конце концов, кто-нибудь что-нибудь всё равно забудет.
V>А можно было бы и так: V>
V>emp.Salary += Money(increase, new Currency("USD"));
V>
V>При этом Salary — это, на самом деле не просто числовое поле, а некая обманка, физически состоящая из двух полей (значение и валюта) и принадлежащая к специальному классу Money, на котором определены арифметические операции, которые при необходимости сами конвертят валюты.
Я вижу в этих рассуждениях следующий прокол. Сперва в качестве основного свойства (аксиомы) не-объектов устанавливается их способность представлять самих себя. А далее в качестве желаемого свойства (цели) описывается поведение, которое не имеет особого отношения к способности не-объектов передаваться по значению. Действительно, в данном примере нет ничего, что требовало бы от зарплаты быть не-объектом. Т.е. меня совершенно непонятен переход от данного примера (use case) к выводу о необходимости иметь не-объекты вообще и их способности передаваться по значению в частности. Этот шаг в рассуждениях надо бы описать детально.
V>Что характерно, эти самые не-объекты — это даже не структуры в привычном понимании этого слова. Например, одно "физическое" поле Currency (валюта взаиморасчётов) может обслуживать и размер зарплаты, и премиальную ставку, и баланс лицевого счёта сотрудника.
Я бы выделил в качестве первого свойства, которое необходимо как-то обеспечить, это способность сущностей (пока мы не говорим об объектах или не-объектах) относиться к определенной категории, что может существенно изменить операции с ними. Например, могут быть валютные сущности, что приводит к тому, что операции с определенными полями выполняются с конвертаций в предположении, что где-то можно найти текущую валюту. Заметим, что включение в такую категорию это как раз то, что называется crosscutting concern (пронизываещее свойство), поскольку многим разным классам можно приписать одну категорию. Скажем, в категорию "валютный объект" можно включить классы Account, Customer и др. классы. В результате одни и те же правила пересчета должны быть описаны в одном модуле, но применяться в разных.
Ну и опять же повторю, я не вижу как мы приходим к необходимости разделения на не-объекты и их свойству представлять себя самих.
V>------------------- V>Короче, дарю этот иллюстративный пример. Если, конечно, он окажется КОПу по зубам.
В КОП главное предназначение не-объектов состоит в представительских функциях, т.е. это ссылки. Соответственно, главным вопросом является то, как осуществляется это представление и как осуществляется доступ. Надо понять принципы сосуществования и взаимодействия объектов и ссылок, поскольку только вместе они могут сделать что-то полезное. Так что в этом смысле это пример не совсем для КОП, хотя я не исключаю, что его можно как-то решить с помощью КОП. В основе решения я вижу как-то приплести средства перехвата для определенного класса объектов ("валютные объекты"). Перехватчик собственно и реализует функции автоматической и принудительной конвертации валюты или учета др. параметров (сборы, наличие данной валюты и т.п.) Здесь можно использовать АОП или прокси или еще что-то вроде этого. Сама валюта может храниться либо в объекте либо в ссылке (оба варианта возможны).
V>Саму же идею не-объектов не дарю. Если эта нива ещё никем не вспахана, то пусть она будет моей
Хотя разделение на объекты и не-объекты это правильный ход, но конечно, само по себе это имеет мало смысла. Нужен какой-то механизм, какая-то операционная семантика. Иначе всегда можно сказать, что это уже существовало. Например, всегда была передача по значению. Например, в КОП конкретно описывается как работают ссылки и объекты в рамках единого механизма.
Здравствуйте, savinov, Вы писали:
AVK>>Очевидно нет. Если с помощью А можно реализовать идею столь же эффективно, сколь с помощью нового подхода, то новый подход не нужен. По моему это очевидно. Не потрудитесь ли обосновать, в чем здесь демагогия.
S>Демагогия в отсутствии точных критериев оценки (эффективности и простоты).
Демагогия не может в этом состоять. Демагогия тем и отличается, что использует приемы, не относящиеся к существу спора. Ты же задаешь вопросы именно что по существу.
Возвращаясь к твоим вопросам — во-первых точные критерии таки есть и немало. Во-вторых в большинстве случаев квалификация приличного программиста позволяет оценить эффект не применяя формальных оценок. Было бы что оценивать.
S> Слова "можно реализовать" или даже "можно реализовать лучше, проще и эффективнее" имеют весьма общий характер.
Они имеют весьма конкретный характер, выражающийся в потраченных на разработку и поддержку человекочасах.
S> И спорить в такими утверждениями нельзя.
Вот если принять твою идею о том, что вобще ничего нельзя оценить, вот тогда действительно ни спорить, ни вобще ничего разумного делать нельзя.
S> Например, Ява в 10 раз медленнее, чем С++, ну и что?
Например вы не знакомы с предметом и говорите глупости.
S> Там существенно меньше возможностей, ну и что?
И это тоже неправда.
S> Простота и красотва — вот единственный критерий, но он неформальный.
Единственный критерий это ресурсы. Потраченные и полученные. Остальное от лукавого. Впрочем, красоты и простоты вы тоже не продемонстрировали. Никто пока что в ваших словах никакой красоты не увидел. И, сдается мне, проблема не в тех, кто не увидел, а в ваших идеях.
AVK>>Нет, не все. Это значительно сложнее и код получается менее качественным. Так что вперед, показывать, что КОП может выразить то или иное полезное решение лучше, чем любое из существующих средств.
S>Про виртуальные методы я как раз понимаю, S> но Вы никогда это не докажете человеку, который привык реализовывать все вручную, и тем более, если для этого есть библиотека, и уже подавно, если он сам этого не хочет.
Демагогия off, примеры в студию.
AVK>>А это уж точно демагогия. Объяснять почему?
Видимо объяснять не надо. И то хлеб.
S>Это как раз Ваша логика, которую я привел для иллюстрации демагогии.
Демагогия — переход на личности, попытка оправдать свою демагогию поведением собеседника.
S> Я уже как-то опоминал, что проблема состоит в том, что один конкретный человек обычно имеет свою излюбленную область, где он действительно является экспертом.
Демагогия — переход с объекта на субъекта.
S>Если взять пример с реляционной моделью, то знаете скольким людям она действительно не нужна,
Демагогия — доказательство на аналогиях.
S>На этом (и большинстве других) форумах обсуждение как раз и сводится к религиозным боям не на жизнь а на смерть, где главным аргументом является "я сам с помощью метода А сделаю все лучше, чем ты предлагаешь с помощью метода Б".
Демагогия — факты, не относящиеся к предмету спора.
S>Что касается меня, то я в таких спорах не участвую ввиду их бессмысленности (поскольку это демагогия).
Просто вранье. В ваших постах даже для этого форума демагогии более чем.
S>Если Вы хотите дискуссии по существу, то задавайте вопросы по существу.
Демагогия — полное игнорирование всех заданных вопросов. По существу. Списочек вопросов привести?
S> Вопрос по существу отличается от пустого вопроса наличием хотя бы одного-двух терминов, специфичных для обсуждаемого вопроса.
Демагогия — собственное определение, не имеющее ничего общего с реальностью. По сути перевод на спор о терминах.
S> Вопсро типа "докажите мне, что это лучше" таких терминов не содержит.
Тем не менее это вопрос по существу. Но для тебя я его переформулирую, чтобы спятаться за собственными терминами нельзя было:
Докажи, что твоя парадигма, лучше парадигм, которые широко распространены (ООП, ФП, ЛП) в плане:
а) Скорости написания кода
б) Сложности поддержки кода
в) Читаемости кода
Термины, "специфичные для обсуждаемого вопроса" я жирненьким выделил.
S> Кроме того, это претензия, а не вопрос.
Это вопрос, даже не сомневайся. Народ тут с нетерпением ждет на него ответа.
S> Так что я могу только еще раз попросить: задавайте вопросы по существу предлагаемого механизма.
Ну ты понял.
S> Если у Вас нет времени и/или желания вникать в детали, то просто не завайте вопросов и все.
Демагогия — попытка остаться в споре с последним словом.
Здравствуйте, savinov, Вы писали:
S>...поскольку нет цели придать этой работе "научный" характер в традиционном смысле этого слова (в смысле, это не главная цель).
Тогда нужно забыть слово "диссертация". Кстати, и для продвижения идеи вне рамок научного мира тоже неплохо определиться с контекстом. Чисто для того, чтобы быстрее народ втыкался.
V>>2. Не-объекты — это такие сущности, которые ничем, кроме как своим содержимым, не идентифицируются. Например: размер заработной платы, длина отрезка, наименование товара.
S>Сразу скажу, что разделение на объекты и не-объекты очень сильное предположение, и оно мне очень нравится. Хотя бы потому, что именно так делается в КОП. Правда в КОП не-объекты это в первую очередь ссылки, задача которых состоит в представлении объектов
В моей трактовке не-объекты нужны совсем не для того, чтобы представлять объекты. Например, не-объект Адрес не даёт доступ к объекту Клиент, на котором он паразитирует. Он даёт доступ к своим полям (которые, кстати, одновременно являются также полями класса Клиент) и реализует всякий вкусный программный сервис (например, формирует адресную строку для Веб2.0-сервиса, отображающего кусок карты). А ведь адрес может сидеть в объекте Клиент несколько раз (поля ГородЮр, ГородФакт, УлицаЮр, УлицаФакт и т.д.). В таких случаях, конечно, хочется не копиблочить программные куски, а реализовать объект Адрес один раз, и просто "подключать" его к разным полям.
И речь идёт не о том, что нам хочется передавать не по ссылке, а по значению. Совсем наоборот! Нам хочется организовывать доступ по ссылке к информационной сущности ("не-объекту"), которая сама по себе какой-то единой ссылки не имеет (по причине пожизненного паразитизма), но внутреннюю структуру и программный интерфейс таки имеет.
S>Да, ссылки (не-объекты) в КОП имеют любую структуру и функции, поскольку описываются классом. Т.е., изначально предполагается, что есть классы ссылок и классы объектов для описания структуры и функций двух типов сущностей.
Вот, собственно, это меня и заинтересовало — возможность создавать и использовать ссылки на то, на что обычных ссылок в принципе не может быть создано (не-объект ни на каком этапе своей жизнедеятельности не должен превращаться в объект). Почему обычная ссылка не может быть создана? Да потому, что создание обычной ссылки — это придание OID, а придание OID не-объекту — это уже принципиально некорректная операция.
S>Действительно, в данном примере нет ничего, что требовало бы от зарплаты быть не-объектом. Т.е. меня совершенно непонятен переход от данного примера (use case) к выводу о необходимости иметь не-объекты вообще и их способности передаваться по значению в частности. Этот шаг в рассуждениях надо бы описать детально.
Зарплата, не обладает свойством идентичности. Две зарплаты равны, если у них равны размер и валюта. Что не скажешь, например, о людях. Два человека являются всё-таки двумя разными человеками, даже если у них совпадают фамилии, имена, отчества, и даже цвет глаз. И всё потому, что люди обладают свойством идентичности, а их зарплаты — нет. За более подробным описанием того, что такое идентичность, вынужден отослать к классике жанра: Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++. Конкретно, глава 3.1 "Природа объекта".
V>>Что характерно, эти самые не-объекты — это даже не структуры в привычном понимании этого слова. Например, одно "физическое" поле Currency (валюта взаиморасчётов) может обслуживать и размер зарплаты, и премиальную ставку, и баланс лицевого счёта сотрудника.
S>...Скажем, в категорию "валютный объект" можно включить классы Account, Customer и др. классы. В результате одни и те же правила пересчета должны быть описаны в одном модуле, но применяться в разных.
Не всё так просто. Если Account действительно может быть валютным, то Customer или Employee валютным быть не может! Это ж фигня какая-то — валютный сотрудник. То, что у класса есть свойство Currency, не означает, что этот класс является "валютным". Это просто означает, что некоторые из его числовых атрибутов могут быть выражены в валюте.
S>Хотя разделение на объекты и не-объекты это правильный ход, но конечно, само по себе это имеет мало смысла. Нужен какой-то механизм, какая-то операционная семантика. Иначе всегда можно сказать, что это уже существовало. Например, всегда была передача по значению. Например, в КОП конкретно описывается как работают ссылки и объекты в рамках единого механизма.
Короче, я понял, что КОП ориентирован только на переопределение встроенного механизма доступа по ссылке к объектам (что, впрочем, мало интересует, т.к. существующий механизм устраивает, а кому хочется извращений, тот юзает smart pointers), а в случае не-объектов пасует. Или всё-таки не пасует?
Здравствуйте, Voblin, Вы писали:
V>Короче, я понял, что КОП ориентирован только на переопределение встроенного механизма доступа по ссылке к объектам (что, впрочем, мало интересует, т.к. существующий механизм устраивает, а кому хочется извращений, тот юзает smart pointers), а в случае не-объектов пасует. Или всё-таки не пасует?
По поводу не-объектов не могу сказать с определенностью, поскольку не понимаю до конца идею, а особенно актуальность проблемы. Если что придет в голову, то поделюсь.
А умные указатели имеют целый список проблем (за полноту не ручаюсь):
В объявлении переменных надо указывать два класса: класс ссылки и целевой класс. Экземпляр класса ссылки явно создается и инициализируется. Налицо усложнение и нарушение принципа полной прозрачности. Одно крайне неприятное следствие в том, что, если я захочу потом изменить класс ссылки на другой, то надо менять весь код.
Умный указатель (обычно) хранит прямой указатель на целевой объект в своем поле. А что, если объект будет перемещен. Это плохо, поскольку ограничивает степень и возможности опосредования.
Невозможность перехватить нужные методы, а способность реализовать только общее опосредование в пересмотренном операторе доступа. Кроме того, даже без перехвата не рекомендуется реализовывать методы умной ссылки, поскольку это может легко привести к путанице с методами представляемого объекта.
Реализация слоеных ссылок еще более сложна и запутанна, а потому практически не применяется.
Поскольку прямая ссылка на объект возвращается оператором доступа, то это приводит к тому, что опосредование не является симметричным. Мы можем вставить промежуточный код до вызова целевого метода, но не после него. Часто же надо выполнить операции после доступа, например, очистка.
Для каждого целевого класса генерируется (с помощью шаблона) один класс умной ссылки, что не очень красиво. Если надо представлять 100 целевых объектов, то будет сгенерировано 100 классов ссылки.
Этот механизм опирается на специфику С++ и шаблоны, что существенно ограничивает его использование. Но даже в С++ они используются в весьма ограниченных целях для совершенно конкретных задач.
Здравствуйте, AndrewVK, Вы писали:
S>> Простота и красотва — вот единственный критерий, но он неформальный.
AVK>Единственный критерий это ресурсы. Потраченные и полученные. Остальное от лукавого. Впрочем, красоты и простоты вы тоже не продемонстрировали. Никто пока что в ваших словах никакой красоты не увидел. И, сдается мне, проблема не в тех, кто не увидел, а в ваших идеях.
У меня такое ощущение, что я общаюсь с новым русским. И по форме и по содержанию.
AVK> Докажи, что твоя парадигма, лучше парадигм, которые широко распространены (ООП, ФП, ЛП) в плане:
Стучать по столу и требовать ты у заказчика можешь, когда заплатишь, а здесь ты можешь вежливо попросить что-то втолковать, если не можешь разобраться самостоятельно.
AVK>а) Скорости написания кода AVK>б) Сложности поддержки кода AVK>в) Читаемости кода[/q]
Ты хоть примерно представляешь, как может быть оформлен ответ на твои вопросы? Если нет, я подскажу: это может занять 10 лет и тома текстов (книги, статьи и т.п.) Или тебя сертификат истинности интересует?
AVK>Термины, "специфичные для обсуждаемого вопроса" я жирненьким выделил.
Это термины, которые "специфичны" для любого подхода, причем не только в программировании. Так что видимо у тебя есть серьезные проблемы с пониманием, что есть специфичное и что есть общее.
S>> Кроме того, это претензия, а не вопрос.
AVK>Это вопрос, даже не сомневайся. Народ тут с нетерпением ждет на него ответа.
Говори, пожалуйста, от себя. А кому эта ветка не интересна, тот сюда просто не заходит. А в твоем случае мне вспоминается поговорка: "Мыши плакали, кололись, но продолжали жрать кактус." Если КОП тебе не нравится, то просто игнорируй эту ветку и не мучай себя и не разводи демагогию. Как говорится, не нравится — не ешь. Ну а если хочется все-таки понять, так читай текст и задавай вопросы по существу работы предложенного подхода.
Я сейчас приведу несколько тривиальных утверждений, которые мог бы написать несколько лет назад, без всякого отношения к теме, но которые мне кажутся здесь весьма уместными.
Кратко, как я понял (спроецировал на понятное мне) про КОП:
Есть объекты, и есть ссылки на них и есть пространства их жизни. На один объект возможны разные ссылки, реализующие разные его представления и разное поведение, которые валидны в разных (каждая в своём), возможно пересекающихся слоях и контекстах.
Естественно, теоретически, всё можно реализовать имеющимися средствами, но:
Результатом новой парадигмы может оказаться появление практической возможности для создания программных решений действительно сложных и объёмных проблем человеком, или коллективом людей. Это весьма достойная цель, и очевидно, что преимущества метода, ещё довольно сырого, предназначенного для серьёзных проектов — весьма не просто (на мой взгляд, так элементарно, но мне лень ) продемонстрировать на простых примерах.
Сейчас такие задачи, которые не решаются из-за своей сложности (многоплановости) и ограниченности имеющихся интеллектуальных и временных ресурсов встают всё чаще и повсеместнее.
Подчеркну, что речь не идёт об ускорении и упрощении для разработки и поддержки кода. Речь не идёт о качестве, переносимости и масштабируемости кода. Речь идёт о создании возможности, которой сейчас не существует вовсе, как например практически не существует возможности для написания современной RPG на ассемблере, по сравнению с каким-нибудь скриптовым языком для специального движка.
Здравствуйте, savinov, Вы писали:
S>У меня такое ощущение, что я общаюсь с новым русским. И по форме и по содержанию.
Демагогия — переход на личности, игнорирование аргументов.
S>Стучать по столу и требовать ты у заказчика можешь, когда заплатишь, а здесь ты можешь вежливо попросить что-то втолковать, если не можешь разобраться самостоятельно.
Демагогия — попытка перевести спор в плоскость личных разборок.
AVK>>а) Скорости написания кода AVK>>б) Сложности поддержки кода AVK>>в) Читаемости кода[/q]
S>Ты хоть примерно представляешь, как может быть оформлен ответ на твои вопросы?
Да.
S> Если нет, я подскажу: это может занять 10 лет и тома текстов (книги, статьи и т.п.) Или тебя сертификат истинности интересует?
Меня интересует хоть что нибудь. Пока что полезной информации ты выдал ровно 0.
AVK>>Термины, "специфичные для обсуждаемого вопроса" я жирненьким выделил.
S>Это термины, которые "специфичны" для любого подхода, причем не только в программировании. Так что видимо у тебя есть серьезные проблемы с пониманием, что есть специфичное и что есть общее.
Демагогия — перевод на спор о терминах, переход на личности.
AVK>>Это вопрос, даже не сомневайся. Народ тут с нетерпением ждет на него ответа.
S>Говори, пожалуйста, от себя. А кому эта ветка не интересна, тот сюда просто не заходит. А в твоем случае мне вспоминается поговорка: "Мыши плакали, кололись, но продолжали жрать кактус." Если КОП тебе не нравится, то просто игнорируй эту ветку и не мучай себя и не разводи демагогию.
Демагогия — переход на личности.
S> Как говорится, не нравится — не ешь. Ну а если хочется все-таки понять, так читай текст и задавай вопросы по существу работы предложенного подхода.
Я вопросы задал. Ты ни на один не ответил
Итого — ты полностью перешел на демагогию, так и не ответив ни на один вопрос и не приведя ни одного аргумента. Из чего я делаю вывод — ничего твои выкладки не стоят, очередная попытка высосать из пальца неизвестно что, не обладая ни знаниями в области теории языков, ни какими то действительно интересными идеями.
Я сейчас приведу несколько тривиальных утверждений, которые мог бы написать несколько лет назад, без всякого отношения к теме, но которые мне кажутся здесь весьма уместными.
Кратко, как я понял (спроецировал на понятное мне) про СОП:
Есть субъекты, и есть связи между ними и есть сообщества. С одним субъектом возможны разные связи, реализующие разные его представления и разное поведение, которые валидны в разных (каждая в своём), возможно пересекающихся слоях и контекстах.
Естественно, теоретически, всё можно реализовать имеющимися средствами, но:
Результатом новой парадигмы может оказаться появление практической возможности для создания программных решений действительно сложных и объёмных проблем человеком, или коллективом людей. Это весьма достойная цель, и очевидно, что преимущества метода, ещё довольно сырого, предназначенного для серьёзных проектов — весьма не просто (на мой взгляд, так элементарно, но мне лень ) продемонстрировать на простых примерах.
Сейчас такие задачи, которые не решаются из-за своей сложности (многоплановости) и ограниченности имеющихся интеллектуальных и временных ресурсов встают всё чаще и повсеместнее.
Подчеркну, что речь не идёт об ускорении и упрощении для разработки и поддержки кода. Речь не идёт о качестве, переносимости и масштабируемости кода. Речь идёт о создании возможности, которой сейчас не существует вовсе, как например практически не существует возможности для написания современной RPG на ассемблере, по сравнению с каким-нибудь скриптовым языком для специального движка.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, savinov, Вы писали:
S>>Стучать по столу и требовать ты у заказчика можешь, когда заплатишь
E>Требовать у заказчика, да еще и платить заказчику... E>Это вообще как?
Пардон, очепатка. (Ну смысл, надеюсь, не окончательно потерялся.)
[Контекст вырезан. Субъективно.]
AVK>Я вопросы задал. Ты ни на один не ответил
AVK>Итого — ты полностью перешел на демагогию, так и не ответив ни на один вопрос и не приведя ни одного аргумента. Из чего я делаю вывод — ничего твои выкладки не стоят, очередная попытка высосать из пальца неизвестно что, не обладая ни знаниями в области теории языков, ни какими то действительно интересными идеями.
Ок. Пусть будет так. В любом случае, спасибо за высказанные оценки.
Здравствуйте, savinov, Вы писали:
S>По поводу не-объектов не могу сказать с определенностью, поскольку не понимаю до конца идею, а особенно актуальность проблемы. Если что придет в голову, то поделюсь.
Идея проста до неприличия. Существуют объекты, которые обладают свойством идентичности, характеристиками и поведением. Характеристики объектов тоже могут быть не примитивными (число, строка, ссылка на другой объект*), а тоже иметь внутреннюю структуру (характеристики) и поведение. В конце концов, стандарт SQL99 уже опсывает user-defined datatypes, имеющие внутреннюю структуру. Пример со значением и единицей измерения (в частности, валютой) — далеко не единственный. Ради интереса я взял первую попавшуюся базу данных (Northwind из комплекта поставки MSSQL), поискал там не-объекты, имеющие чётко выраженную внутреннюю структуру, и выяснил, что в состав не-объектов входит порядка 25% полей базы данных. Двадцать пять процентов — это уже не экзотика! Так что, актуальность, думаю, можно считать доказанной.
------
*Ссылку на объект я тоже обозвал примитивным типом, поскольку это всего лишь число, вся мудрость и навороченность которой проявляется только после "пролезания" по ней (операция разыменования). Понимаю, что это утверждение грубо противоречит КОП, но речь сейчас не об этом, т.к. в контексте разговора про не-объекты ссылка на объекты интереса не представляет.
------
Главная технологическая проблема не-объектов заключается в том, что их характеристики не принадлежат им эксклюзивно. То есть поле Currency не-объекта Employee.Salary также принадлежит не-объекту Employee.Balance и, конечно же, объекту Employee. И если мы делаем перехватчик события, изменяющего Employee.Salary.Currency, то оно должно вызываться также и при изменении Employee.Balance.Currency! Реально ведь поле одно и то же! То есть мало того, что нам не очень понятно, как нам хранить ссылки на не-объекты, но и введение в обращение не-объектов может вызвать изменение вычислительной модели. В плане придания ей свойств транзакционности.
Пример:
emp.Balance.Currency = Currency("RUR");
Что при этом должно произойти?
Должен быть вызван код, срабатывающий при установке свойства Currency объекта Balance
Должен быть вызван код, срабатывающий при установке свойства Currency объекта Employee (например, должен быть вздёрнут флаг модифицированности)
Должен быть вызван код, срабатывающий при установке свойства Currency объекта Salary
Вопрос: в какой последовательности? Ответ: в любой. Т.е. ХЗ в какой.
Ещё вопрос: если произойдёт облом в коде, обрабатывающем Salary.Currency, то все изменения должны откатиться. В том числе, флаг модифицированности объекта emp должен вернуться в прежнее положение.
Всё же, всё же... Даже не смотря на то, что появление не-объектов поднимает эти вопросы, думаю, игра стоит свечь. Просто в силу актуальности (см. выше).
S>А умные указатели имеют целый список проблем (за полноту не ручаюсь):
Не надо меня агитировать против smart pointers. Лично для меня достаточно вот этого:
S> Этот механизм опирается на специфику С++ и шаблоны, что существенно ограничивает его использование. Но даже в С++ они используются в весьма ограниченных целях для совершенно конкретных задач.
Так как в своей практике я использую C++ весьма эпизодически, вопрос использования этого чуда отпадает сам собой.
Здравствуйте, exp_1, Вы писали:
_>Я сейчас приведу несколько тривиальных утверждений, которые мог бы написать несколько лет назад, без всякого отношения к теме, но которые мне кажутся здесь весьма уместными.
_>Кратко, как я понял (спроецировал на понятное мне) про КОП:
_>Есть объекты, и есть ссылки на них и есть пространства их жизни. На один объект возможны разные ссылки, реализующие разные его представления и разное поведение, которые валидны в разных (каждая в своём), возможно пересекающихся слоях и контекстах.
Я бы добавил, что объекты не могут существовать без ссылок (нет ссылки — нет объекта), а вот ссылки могут существовать без объекта. В частности, можно создать сложную программу вообще без объектов, а манипулирующую только ссылками. Другая крайность, это когда все функции сосредоточены в объектах, а ссылки примитивны (это ООП).
Одна проблема формализации идеи об объектах и ссылках в том, что объект может (и всегда имеет) множество ссылок. Например, запись в БД имеет положение на диске, физический адрес в памяти, первичный ключ и м.б. еще что-то, выдуманное программистом для ее идентификации. Компьютер имеет имя, IP-адрес, MAC-адрес и м.б. еще что-то выдуманное программистом для данной системы. В КОП предлагается конкретные средства, как работать с такой системой адресации объектов.
_>Естественно, теоретически, всё можно реализовать имеющимися средствами, но:
_>Результатом новой парадигмы может оказаться появление практической возможности для создания программных решений действительно сложных и объёмных проблем человеком, или коллективом людей. Это весьма достойная цель, и очевидно, что преимущества метода, ещё довольно сырого, предназначенного для серьёзных проектов — весьма не просто (на мой взгляд, так элементарно, но мне лень ) продемонстрировать на простых примерах.
_>Сейчас такие задачи, которые не решаются из-за своей сложности (многоплановости) и ограниченности имеющихся интеллектуальных и временных ресурсов встают всё чаще и повсеместнее.
Здесь уместно вспомнить про термин глобализация, который применяется к социальным аспектам жизни, но редко к архитектуре систем. Например, мы пишем простое веб-приложение. Но оно покрывает огромное жизненное пространство объектов. Так, интерфейс пишется на PHP и JavaScript, которые взаимодействуют с сервером приложения, который берет данные из БД, а также др. систем как платежные системы. Так в чем же проблема таких глобальных систем? Предположение: проблемы возникают на стыке пространств, где собственно концентрируется большая часть функций. В КОП это предположение формулируется в виде исходного принципа (неформального конечно, но весьма важно для всего дальнейшего развития). А далее формально описывается что такое пространство, что такое граница, что такое объекты, ссылки и др. элементы. Но главное, это как все это вместе работает.
_>Подчеркну, что речь не идёт об ускорении и упрощении для разработки и поддержки кода. Речь не идёт о качестве, переносимости и масштабируемости кода. Речь идёт о создании возможности, которой сейчас не существует вовсе, как например практически не существует возможности для написания современной RPG на ассемблере, по сравнению с каким-нибудь скриптовым языком для специального движка.
В долгосрочной перспективе конечно простота и эффективность будут играть первостепенную роль. Но на начальном этапе оценивать их было бы преждевременно, поскольку не все для этого готово. Сперва надо (во многом интуитивно) прикинуть, а является ли этот подход просто жизнеспособным. Существует много дизайн-альтернатив для дальнейшего развития и тем более для реализации, так что до зрелости еще очень и очень далеко.
Здравствуйте, Voblin, Вы писали:
V>Например, у меня вот это родилось из размышлений о том, почему в серьёзных бизнес-системах (всякое там ERP, CRM, бухгалтерия, склад и т.д.) полноценный ОО-подход при проектировании бизнес-логики не применяется.
Выглядит очень похоже на множественную динамическую классификацию, которая описывается в UML. Правда, ни одной реализации этой идеи на практике я пока не встречал. Ты не видел чего-нибудь еще на эту тему?
Здравствуйте, Дарней, Вы писали:
Д>Выглядит очень похоже на множественную динамическую классификацию, которая описывается в UML. Правда, ни одной реализации этой идеи на практике я пока не встречал. Ты не видел чего-нибудь еще на эту тему?
Где-то проскакивало, что в Haskell есть что-то на эту тему, но моё изучение этого зверя до темы тамошней типизации не дошло
Здравствуйте, Voblin, Вы писали:
V>Всё же, всё же... Даже не смотря на то, что появление не-объектов поднимает эти вопросы, думаю, игра стоит свечь. Просто в силу актуальности (см. выше).
А почему нельзя просто определить геттеры и сеттеры, которые бы собственно учитывали специфику поведения не-объектов?
Если же эту логику надо отделить от класса (поскольку она применяется во многих классах), то можно применить АОП. В этом случае в аспекте указывается, что при доступе к нужным полям нужных классов будет отрабатываться какая-то дополнительная логика.
Впрочем, интуитивно, я понимаю, что это не то, что нужно... Основная проблема состоит в том, что не-объекту для правильного поведения необходимо выйти за свои пределы в контекст содержащего его объекта (например, для доступа к полю единицы измерения, которое необходимо для правильной интерпретации числа). В этом случае, помещая не-объект в разные объекты, мы можем получить разное поведение. Хм, интересная идея, поскольку мы приходим к понятию контекста объекта (как двойственному к понятию контекста контейнера). В КОП развито понятие контекста контейнера, т.е. объект живет в контейнере, который является его контекстом и может влиять на поведение. А здесь мы приходим к механизму контекста, в котором могут жить поля (не-объекты в общем случае). Сразу можно предложить использование аналогичного механизма, а именно, ключевого слова objectContext, которое применяется к не-объекту и позволяет получить объект, в котором он находится. Например, salary.objectContext.currency даст валюту. Получаем контекстно зависимое поведение аналогичное зависимости от среды или контейнера. Интересная идея, надо будет подумать, как это можно развить дальше...
S>>А умные указатели имеют целый список проблем (за полноту не ручаюсь): V>Не надо меня агитировать против smart pointers. Лично для меня достаточно вот этого: V>
S>> Этот механизм опирается на специфику С++ и шаблоны, что существенно ограничивает его использование. Но даже в С++ они используются в весьма ограниченных целях для совершенно конкретных задач. V>V>Так как в своей практике я использую C++ весьма эпизодически, вопрос использования этого чуда отпадает сам собой.
Несмотря на специфичность и ограниченность механизма умных указателей, мотивация, которая за ними стоит, имеет весьма высокую общность. Я бы сказал, что аргументы в пользу необходимости умных ссылок могут быть на 90% применены к КОП. Т.е. проще говоря, чтобы понять для чего нужен КОП, можно начать чтение с умных ссылок. (Преимущество в том, что там эта сказка уже гладко изложена, а в КОП есть только фрагменты.)
Здравствуйте, savinov, Вы писали:
V>>Всё же, всё же... Даже не смотря на то, что появление не-объектов поднимает эти вопросы, думаю, игра стоит свечь. Просто в силу актуальности (см. выше).
S>А почему нельзя просто определить геттеры и сеттеры, которые бы собственно учитывали специфику поведения не-объектов?
Просто потому, что к одному значению (в частности, Currency) у нас присасывается несколько сеттеров ( ), которые во-первых, ничего не знают друг о друге, а, во-вторых, могут между собой законфликтовать.
S>Если же эту логику надо отделить от класса (поскольку она применяется во многих классах), то можно применить АОП. В этом случае в аспекте указывается, что при доступе к нужным полям нужных классов будет отрабатываться какая-то дополнительная логика.
АОП мне в принципе не нравится. В самой концепции АОПа есть очень хитро спрятанный логический баг.
S>Впрочем, интуитивно, я понимаю, что это не то, что нужно... Основная проблема состоит в том, что не-объекту для правильного поведения необходимо выйти за свои пределы в контекст содержащего его объекта...
А вот и нет! Не-объектный класс Money не должен лазить в своего хозяина (Employee, OrderDetails и т.д.). Его область деятельности ограничивается его полями (вернее, не-только-его полями) Value и Currency.
А о своём контексте он ничего не знает. Что называется, куда воткнули, там и сидит. То есть нельзя сказать, что S>... salary.objectContext.currency даст валюту.
Класс Money, которому принадлежит Salary, не в курсе, что у его "контекста" есть поле Currency. Например, для orderdetails.Price валюта может сидеть в objectContext.Order.Customer.Country.Currency (о как всё запущено!).
Здравствуйте, savinov, Вы писали:
S>У меня такое ощущение, что я общаюсь с новым русским. И по форме и по содержанию.
И очень зря. У нас же не институт благородных девиц, а форум профессионалов. И Андрей разбирается в предмете очень и очень хорошо. Ты же, когда публиковался в форуме, хотел получить обратную связь от квалифицированных коллег? Ну вот и получаешь. И по форме и по содержанию AVK очень точно ставит вопрос. А ты вместо того, чтобы подумать, начинаешь кипятиться и возмущаться.
S>Стучать по столу и требовать ты у заказчика можешь, когда заплатишь, а здесь ты можешь вежливо попросить что-то втолковать, если не можешь разобраться самостоятельно.
Пока что у меня (и не только) есть подозрение, что это как раз ты не можешь разобраться самостоятельно. AVK>>а) Скорости написания кода AVK>>б) Сложности поддержки кода AVK>>в) Читаемости кода[/q]
S>Ты хоть примерно представляешь, как может быть оформлен ответ на твои вопросы?
Естественно, может. И я могу. S>Если нет, я подскажу: это может занять 10 лет и тома текстов (книги, статьи и т.п.)
Да ничего подобного. Если ты сам понимаешь, какие у твоей идеи преимущества, то тебе не составит труда изложить их в двух-трех абзацах. Вот, к примеру, вся суть квантовой механики укладывается в главу "введение" третьего тома Ландау-Лифшица.
S>Это термины, которые "специфичны" для любого подхода,
Совершенно верно. А ты что, полагаешь, что твой подход какой-то особенный, и к нему нельзя подходить с тем же аршином, что и, к примеру, к функциональному программированию? S>причем не только в программировании.
Серьехно? Ну-ка, расскажи мне, для каких областей, кроме программирования, специфичен термин "сложность поддержки кода". Мне очень интересно расширить свой кругозор. S>Так что видимо у тебя есть серьезные проблемы с пониманием, что есть специфичное и что есть общее.
Пока что мое понимание совпадает с пониманием Андрея. А вот твое понимание вызывает у меня обоснованные сомнения. AVK>>Это вопрос, даже не сомневайся. Народ тут с нетерпением ждет на него ответа. S>Говори, пожалуйста, от себя.
Ждет-ждет. Не сомневайся.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, savinov, Вы писали:
C>>Тогда это называется "графоманство".
S>Ну хорошо, я не против. Называйте это как хотите, мне это безразлично, и я меньше всего об этом думаю.
S>В общем, все свелось к обсуждению как это называется и не преследует ли автор каких-то корыстных целей.
Да нет же, прямо наоборот — это читатели преследуют корыстные цели — они хотят найти как это можно применить на практике.
Здравствуйте, savinov, Вы писали:
S>Это все равно, что сравнивать принципы архитектуры с лопатой. Я буду говорить, как надо строить дом, а ты будешь говорить, что все это можно и лопатой сделать. Причем самое интересное, что ты будешь прав, но я к этому мог бы добавить, что кроме лопаты есть еще экскаватор, отбойный молоток и др. средства. Но все это не имеет отношения к предмету разговора.
Некорректная аналогия.
Правильная будет такая: ты предлагаешь для строительных работ создать биоробота, у которого вместо рук — лопаты, чотбы копать землю. Поскольку одних лопат мало, этот боробот будет поддерживать возможность трансворирования конечностей в экскаваторные ковши, отбойные молотки, метлы и "все прочее". На это тебе возражают, что в этом мало смысла — проще взять обычного человека и набор инструментов, которыми он сможет воспользоваться. Ты же отвечаешь "ну вот, вы ничего не понимаете в биороботах, а предлагаете использовать сменные инструменты. Ваша проблема в том, что за 40000 лет все привыкли к использованию инструментов и не могут понять идею биоробота."