C# & КОП
От: Silver_s Ниоткуда  
Дата: 19.11.04 13:09
Оценка:
Считаю что C# + .NET пока далек от компонентного программирования, хотя приблизился к нему немного ближе чем многие другие языки и среды.

Что такое КОП и компонента, насколько я понял, нет однозначного определения. У меня ИМХО такое:

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

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

— В КОП Должна быть возможность манипуляции такими сущностями как компонента (как это делается с классами в ООП).
Например:
Из нескольких компонент создать один новый компонент,
или из компонента создать новый, слегка его модифицировав его объектную модель. Так чтобы в результате опять получился компонет — единица инкапсуляции и деплоймента. Вот с этим у C# проблемы.


В C# компоненты в бинарном формате создавать, инкапсулировать и использовать можно, но этого недостаточно, должна быть возможность и средства производить с компонентами различные манипуляции .
Манипуляций довольно много, в которых реально возникает необходимость.

-----------------------------------------------------

Например имеем компоненту A с такой объектной моделью с корнем IA1.

interface IA1
{
IA2 IA2{get;}
void Func1();
}

interface IA2
{
void Func2();
ICallback Callback{get;set;}
}

Необходимо создать компоненту B на базе A.
Чтобы из B торчала почти такая же ОМ как IA1 (отнаследоваться от ОМ).
Но реализовать следующее внутри B:
1) реализовать и подключить CallBack.
2) Закрыть доступ к проперти CallBack.
3) Добавить новую функцию (или поддерево в ОМ).
4) И естейственно чтобы эта компонента B осталась компонентой, т.е. инкапсулированой единицей деплоймента, такой же простой в подключении как исходная A.

На C# сейчас такое сделать принципиально невозможно, ... а зря.
Враперами теоретически можно обернуть. Но на практике это не реально в дереве могут быть не два узла а десятки, сотни.
--------------------------------------
Если нужен совсем конкретный пример, то ткнем пальцем в компоненты из Office, например PivotTable или Charting. Проимпортируем OWC, полученые обертки будут компонетой, единицей инкапсуляции и деплоймента ( по крайней мере если там где будем деплоить стоит офис). Но в ОМ у PivotTable есть несколько глючных пропертей для DataSource, они завязаны на древние RecordSet'ы, чтобы загнать в них данные нужно DataSet перегнать в XML файл на диске,потом отконвертировать XML в другой формат и потом его вставлять в компоненту. Лучше было бы отнаследоваться от этой компоненты и прикрыть в ОМ эти проперти, и на их место повесить свою проперти типа DataSet.

А на C# в лучшем случае можно сделать компоненту с отдельной функцией
SetDataSource(axPivotTable pt,DataSet ds), инкапсуляцией здесь не пахнет.
Для одной функции может так и сойдет, но для чего то большего это криво.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.