Суть понятия инкапсуляция...
От: Павел Кузнецов  
Дата: 06.11.04 05:33
Оценка:
VladD2:

> Да шишники вот уже 35 лет слона не замечают. Хотя не все. Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции? Можно примерчик?
Posted via RSDN NNTP Server 1.9 gamma

06.11.04 18:19: Ветка выделена из темы Какой полиморфизм используется в ФЯ?
Автор: Курилка
Дата: 22.10.04
— VladD2
06.11.04 18:21: Перенесено модератором из 'Декларативное программирование' (по просбам трудящихся) — VladD2
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[22]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.11.04 07:07
Оценка: -2
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?


Она в нем есть.

ПК>Можно примерчик?


С++:
struct A
{
private:
    int _val;

public:
    int getVal() { return _val; }

    void setVal(int val)
    {
        if (val < 0)
            throw "требования инкапсуляции не допускают установку "
                "отрицальтного значения свойству Val.";
                
        _val = val;
    }
};

void main()
{
    A a;
    a.setVal(123);  // OK
    a.setVal(-123); // Облом в рантайме.
    a._val = -123;  // Облом во время компиляции.
}


С:
struct A
{
    int _val;
};

void mian()
{
    A a;
    a._val = -123;  // Нарушение принципов инкапсуляции. Подразумевается что A::_val не может содержать отрицальное значение.
}


Не думаю, что этот пример был действительно нужен. Но чтобы ты в очередной раз не сказал, что я отказывюсь давать "подтвреждения своим утвреждениям" я его дал, затратив при этом немалое время на набивку соврешенно никчемного кода. В предь, уж извини я сразу буду посылать куда подальше, когда ты ты будешь мнея принуждать давать подтверждение совершенно очевидным вещам. Даговорились?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Суть полимор
От: Nick_ Россия  
Дата: 06.11.04 09:17
Оценка: 28 (3)
Здравствуйте, VladD2, Вы писали:

VD>Не думаю, что этот пример был действительно нужен. Но чтобы ты в очередной раз не сказал, что я отказывюсь давать "подтвреждения своим утвреждениям" я его дал, затратив при этом немалое время на набивку соврешенно никчемного кода. В предь, уж извини я сразу буду посылать куда подальше, когда ты ты будешь мнея принуждать давать подтверждение совершенно очевидным вещам. Даговорились?


Влад, инкапсуляция — это когда вызывающая сторона ничего не знает о внутренней структуре обьекта с которым работает.
На С++ это делается при помощи абстрактных классов, которыми эмулируются интерфейсы (не приплетать сюда наследование, так как это независимые вещи). Надеюсь, ты можешь себе представить пример.
Спецификаторы доступа private/public/... в С++ не могут использоваться для инкапсуляции, потому что они не освобождают компилятор от необходимости знать о внутренней структуре объекта.
В твоем примере, как ни крути, компилятору надо знать структуру объекта. Что бы работать со классом надо иметь его полное описание вместе с внутренностями. У меня язык не поворачиваеться назвать это инкапсуляцией.
Re[24]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.11.04 11:30
Оценка: 1 (1)
Здравствуйте, Nick_, Вы писали:

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


VD>>Не думаю, что этот пример был действительно нужен. Но чтобы ты в очередной раз не сказал, что я отказывюсь давать "подтвреждения своим утвреждениям" я его дал, затратив при этом немалое время на набивку соврешенно никчемного кода. В предь, уж извини я сразу буду посылать куда подальше, когда ты ты будешь мнея принуждать давать подтверждение совершенно очевидным вещам. Даговорились?


N_>Влад, инкапсуляция — это когда вызывающая сторона ничего не знает о внутренней структуре обьекта с которым работает.


Спасибо, я занаю.

N_>На С++ это делается при помощи абстрактных классов, которыми эмулируются интерфейсы (не приплетать сюда наследование, так как это независимые вещи). Надеюсь, ты можешь себе представить пример.


Абстрактные классы тут совершенно не причем.

N_>Спецификаторы доступа private/public/... в С++ не могут использоваться для инкапсуляции, потому что они не освобождают компилятор от необходимости знать о внутренней структуре объекта.


Ты путашь, вот определение инкапсуляции из той же Википедии:
http://en.wikipedia.org/wiki/Information_hiding
http://www.softcraft.ru/coding/sm/sm02.shtml

N_>В твоем примере, как ни крути, компилятору надо знать структуру объекта.


Компилятор может знать все что угодно. Инкапсуляция — это понятие для человека. Компилятор только обеспечивает ее.

N_> Что бы работать со классом надо иметь его полное описание вместе с внутренностями. У меня язык не поворачиваеться назвать это инкапсуляцией.


Чтобы рабоать с классом достаточно знать его публичный интерфейс. Видмо тебя вводит в заблуждение термин "интерфейс". Ты видимо путаешь его с понятием из КОМ. А это не совсем одно и тоже. Виртуальность нужна для обеспечения динамического полиморфизма. А для инкапсуляции достаточно и средств вроде управления доступом.

ЗЫ

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

А вообще, грусно. Мы тут осбуждаем такие высокоуровневые темы как паттерн-матчинг вс. полиморфизм, а на самом деле путаемся в базовых понятиях вроде инкапсуляции.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Суть полимор
От: folk Россия  
Дата: 06.11.04 14:59
Оценка: 39 (5) +1
VladD2:

Избыточное цитирование удалено.
Просьба избегать избыточного цитирования.

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


Наверное когда ПК говорил об инкапсуляции в С, он имел ввиду что-то вроде этого:
struct A; // A объявлено, но не определено
int getVal(struct A const*);
void setVal(struct A*, int);

Так что скрывать можно не только глобальные данные. Правда скорее всего еще понадобятся средства для создания и удаления struct A, также следует опасаться неявного приведения void* -> A*, и поскольку неймспейсов нет, то к функциям придется добавлять префиксы A_ чтобы отличать их от соответствующих функций для struct B. Короче, в С все удобства на улице. Но вопрос в том, что же такое инкапсуляция.

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


Стыдно сказать, действительно путаемся. Предлагаю вынести ветку про инкапсуляцию в Философию, потому что эта тема интересна сама по себе.

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

Цели, которые могут преследоваться, при запрещении доступа к реализации (добавьте если чего забыл) :
1. исключение нарушения инвариантов реализации
2. уменьшение цены внесения изменений в реализацию
3. обеспечение полиморфного использования реализации

Средства, которые могут использоваться, для запрещения доступа к реализации (если это вообще имеет отношение к обсуждаемому вопросу) (и добавьте если чего забыл) :
1. права доступа в ЯП (public, private и т.д.)
2. область видимости в ЯП (определение локально для функции, определение локально для модуля и т.д.)
3. отдельный бинарный файл, содержащий реализацию (dll, exe в отдельном процессе и т.д.)

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

Давайте разберем мои ошибки и попытаемся прийти к консенсусу насчет этих терминов.
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[26]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.11.04 15:17
Оценка:
Просьба избегать избыточного цитирования.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.11.04 15:17
Оценка:
Здравствуйте, folk, Вы писали:

F>Наверное когда ПК говорил об инкапсуляции в С, он имел ввиду что-то вроде этого:

F>
F>struct A; // A объявлено, но не определено
F>int getVal(struct A const*);
F>void setVal(struct A*, int);
F>

F>Так что скрывать можно не только глобальные данные. Правда скорее всего еще понадобятся средства для создания и удаления struct A, также следует опасаться неявного приведения void* -> A*, и поскольку неймспейсов нет, то к функциям придется добавлять префиксы A_ чтобы отличать их от соответствующих функций для struct B. Короче, в С все удобства на улице. Но вопрос в том, что же такое инкапсуляция.

Дык о том, и речь. Это закат солнца вручную.
По этому я и сказал:

более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


F>Стыдно сказать, действительно путаемся. Предлагаю вынести ветку про инкапсуляцию в Философию, потому что эта тема интересна сама по себе.


Что не сделаешь по просьбам трудящихся.

F>Ясно, что инкапсуляция (а также сокрытие информации и абстракция) так или иначе связаны с запрещением доступа к реализации. Чтобы говорить предметно попытался провести классификацию целей и средств.


F>Цели, которые могут преследоваться, при запрещении доступа к реализации (добавьте если чего забыл) :

F>1. исключение нарушения инвариантов реализации
+1
F>2. уменьшение цены внесения изменений в реализацию
+1
F>3. обеспечение полиморфного использования реализации

И все же полиморфизм не связан непосредственно с инкапсуляцией. Те же ФЯ — это хорошо доказывают. Просто в ООП — это два принципа неразрывно связаны и в купе помогают решать проблемы абстрагирования.

F>Средства, которые могут использоваться, для запрещения доступа к реализации (если это вообще имеет отношение к обсуждаемому вопросу) (и добавьте если чего забыл) :

F>1. права доступа в ЯП (public, private и т.д.)
+1
F>2. область видимости в ЯП (определение локально для функции, определение локально для модуля и т.д.)
+1
F>3. отдельный бинарный файл, содержащий реализацию (dll, exe в отдельном процессе и т.д.)
+1

F>Можно нарисовать таблицу 3х3 и указать, какие из ячеек относятся к инкапсуляции,...

Нарисуй. Все только спасибо скажут.

F>Давайте разберем мои ошибки и попытаемся прийти к консенсусу насчет этих терминов.


По-моему, у тебя только одна ошибка и я указал на нее выше. В остальном согласен.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Суть полимор
От: Павел Кузнецов  
Дата: 07.11.04 04:32
Оценка: 15 (2)
VladD2:

> ПК> Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?


> Она в нем есть.


Средства для обеспечения инкапсуляции есть и в C. При этом получающаяся инкапсуляция ничуть не "меньше", чем в C++.

> ПК> Можно примерчик?


> С++:

>
> struct A
> {
> private:
>     int _val;
>
> public:
>     int getVal() { return _val; }
>
>     void setVal(int val)
>     {
>         if (val < 0)
>             throw "требования инкапсуляции не допускают установку "
>                 "отрицальтного значения свойству Val.";
>        _val = val;
>     }
> };
>
> void main()
> {
>     A a;
>     a.setVal(123);  // OK
>     a.setVal(-123); // Облом в рантайме.
>     a._val = -123;  // Облом во время компиляции.
> }


Ты привел неэквивалентный с точки зрения инкапсуляции пример на C. Но это не означает, что нельзя написать эквивалентный в этом отношении пример на C. Вот он:

Заголовочный файл:
typedef int ErrorCode;

#define A_OK                 ((ErrorCode)0)

// Требования инкапсуляции не допускают установку
// отрицальтного значения свойству Val.
//
#define A_ERROR_INVALID_VAL  ((ErrorCode)-1)

typedef struct Atag A;

A*        create_A(void);
void      delete_A(A*);
int       A_getVal(A*);
ErrorCode A_setVal(A*, int);


Файл с реализацией:
. . .

struct Atag
{
   int _val;
};

A* create_A(void)
{
   A* a = (A*)malloc(sizeof(A));
   return a;
}

void delete_A(A* a)
{
   free(a);
}

int A_getVal(A* a)
{
   return a->_val;
}

ErrorCode setVal(A* a, int val)
{
   if (val < 0)
     return A_ERROR_INVALID_VAL;

   a->_val = val;
   return A_OK;
}


Использование:
int main()
{
   A*        a;
   ErrorCode err_code;

   a = create_A();
   if (!a)
     return -1;

   err_code = 0;

   . . .

   if (err_code != A_OK)
     err_code = A_setVal(a, 123);  // OK

   if (err_code != A_OK)
     err_code = A_setVal(a, -123); // Облом в рантайме.

   if (err_code != A_OK)
     a->_val = -123;  // Облом во время компиляции.

   delete_A(a);

   return err_code == A_OK ? 0 : -1;
}


> Не думаю, что этот пример был действительно нужен.


Отчего же, он вполне хорошо проиллюстрировал твою позицию, здорово сэкономив нам время на ненужной риторике. Как видишь, C вполне позволяет писать код, эквивалентный в отношении инкапсуляции коду на C++. Скажем, та же Win API в этом отношении вполне в порядке.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[24]: Суть полимор
От: AndreyFedotov Россия  
Дата: 07.11.04 06:34
Оценка: 21 (2)
Здравствуйте, Павел Кузнецов, Вы писали:

И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной. Т.е. получаем не более чем инкапсуляцию по соглашению, а вовсе не синтаксическую инкапсуляцию. С тем же успехом можно говорить об инкапсуляции на ассемблере.
И хотя на C всё же возможен вариант инкапсуляции — когда в начале любого объекта указатель на таблицу виртуальных функций и кроме него (а так же порядка расположения и сигнатуры функций) другим модулям не известно больше ничего — всё равно это пример скорее искусственного использования языка, нежели реальной инкапсуляции. Хотя бы потому, что и тут инкапсуляция по соглашению, да в добавок усилия по написанию такого кода на порядок выше, чем при написании кода обычного — в то время как на языках с естественной поддержкой инкапсуляции — C++, C#, Jaba — затраты на инкапсуляцию почти (или вообще) не заметны.
Re[24]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.11.04 12:44
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Средства для обеспечения инкапсуляции есть и в C.


Кто-то заявлял обратное? Есть, кое-какие, но более скудные нежели в ООП-языках.

ПК> При этом получающаяся инкапсуляция ничуть не "меньше", чем в C++.


А кто говорил о меньшей или большей?

ПК>Ты привел неэквивалентный с точки зрения инкапсуляции пример на C.


Естествнно. Я же мазохист наворачивать на С черти какие навороты чтобы доказать примитивнную фразу. Я показал отсуствие средств инкапсуляции на уровне типа. Что в точности соотвествует моим словам о меньших возможностях С в этой области.

ПК> Но это не означает, что нельзя написать эквивалентный в этом отношении пример на C. Вот он:...


Код поискипан.

Скажи, ты считашь этот код таким же простым как и приведенный мной? И к тому же этот код демонстрирует только эмуляцию энкапсуляции, так как фактически ничто не мешает мне получить описание этого типа и изменить значение полей. Что не так в случае с ООП-языками.

ПК>Отчего же, он вполне хорошо проиллюстрировал твою позицию, здорово сэкономив нам время на ненужной риторике. Как видишь, C вполне позволяет писать код, эквивалентный в отношении инкапсуляции коду на C++. Скажем, та же Win API в этом отношении вполне в порядке.


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

Вот только что ты сделал вид, что я где-то заявил о том, что на С невозможно достичь инкапсуляции и гневно разгромил мою невреную позицию. Но тут есть одна закавыка. Я этого не заявлял! Ты боролся не с моими утверждениями, а с их переиначенным вариантом. Напомню, я сказал следующее:

Да сишники вот уже 35 лет слона не замечают. Хотя не все. Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


Итак, где же здесь утверждение о невозможности реализации инкапсуляции в С? Если сделать обратный вывод, то из этого высказывания можно получить только лишь заявление тиа:

С++, Явы, Шарпа обладают более совершенными средствами инкапсуляции.


Учитывая же, что рядом находится довольно подробный разговор на эту тему
Автор: folk
Дата: 06.11.04
с folk-ом, и твоей несомненный опыт в этом вопросе, я осмелюсь предположить, что это совершенно намерянная провокация. Так какова же ее цель? Мне уже надоело доказывать, что я не верблюд. Единственный выход борьбы с подобными нападками я виже только использование твоей тактики. Но мне банально не хочется этим заниматься, по этому предлагаю просто не докапываться до слов других и не требовать подтверждения любых сказанных другим слов. Тем более в ультимативной форме и с обидными эпитетами типа "огульный". ОК?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Суть полимор
От: Шахтер Интернет  
Дата: 07.11.04 15:40
Оценка: +1
Здравствуйте, AndreyFedotov, Вы писали:

AF>Здравствуйте, Павел Кузнецов, Вы писали:


AF> И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной.


Не можешь -- ты не видишь определение структуры, оно скрыто в файле реализации.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[25]: Суть полимор
От: Павел Кузнецов  
Дата: 07.11.04 16:13
Оценка: 9 (1) +1
AndreyFedotov:

> И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной.


Это в теории. На практике можно наблюдать, что многие библиотеки и API, написанные на C, лучше скрывают детали своей реализации, чем аналогичные библиотеки и API на C++.

Попробуй, например, доступиться к внутренним структурам Windows — вряд ли это получится сделать легко: Win API достаточно хорошо изолирует тебя от внутренних деталей. А теперь давай посмотрим, скажем, на MFC... Много переменных-членов public, protected, не говоря уже о различных "внутренних" функциях с доступом public, включенных в интерфейс класса просто потому что они нужны самой MFC.

На C++ легче организовать сокрытие данных (вообще-то это вовсе не эквивалентно инкапсуляции, но на этом можно сейчас не останавливаться). Но это вовсе не означает, что сокрытие данных будет практически более эффективно, чем в C.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[25]: Суть полимор
От: Павел Кузнецов  
Дата: 07.11.04 16:33
Оценка: +2
VladD2:

> ПК>Средства для обеспечения инкапсуляции есть и в C.


> Кто-то заявлял обратное?


Да:

ПК> Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?

Она в нем есть.


> Скажи, ты считашь этот код таким же простым как и приведенный мной?


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

> И к тому же этот код демонстрирует только эмуляцию энкапсуляции, так как фактически ничто не мешает мне получить описание этого типа и изменить значение полей. Что не так в случае с ООП-языками.


Если говорить о C++, то, несмотря на то, что "легальными" средствами получить доступ к private части класса нельзя, реально это делается совсем не сложно. Даже легче, чем в коде на C, приведенном выше, т.к. описание класса уже находится в заголовочном файле, и большинство модификаций оригинального кода не будет требовать исправлений в коде пользователя.

> Паш, я устал от демагогии льющейся, с твоей стороны в мой адрес, в последнее время все больше и больше.


Наверное, мы просто стали чаще бывать в одних и тех же форумах

> Учитывая же, что рядом находится довольно подробный разговор на эту тему
Автор: folk
Дата: 06.11.04
с folk-ом


Я его сообщение увидел уже после того, как отправил ответ. Если бы заметил раньше, скорее всего, ничего писать бы не стал, т.к. он вполне подробно все расписал.

> , я осмелюсь предположить, что это совершенно намерянная провокация. Так какова же ее цель?


Да какая же провокация? Я вполне мирно попросил
Автор: Павел Кузнецов
Дата: 06.11.04
тебя уточнить, что же ты имел в виду, т.к. никакого особого совершенства C++ в отношении обеспечения инкапсуляции по сравнению с C я реально не наблюдаю. По моему опыту скорее даже наоборот: т.к. "простых" средств для сокрытия данных в C нет, то если кому-то хочется это оганизовать, он вынужден использовать более радикальные подходы, чем в C++, соответственно, получая более эффективные в отношении сокрытия реализации результаты.

P.S. Тебе больше нравиться переходить к разборкам вместо того, чтобы ограничиться простым ответом на заданный вопрос?
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: Суть полимор
От: AndreyFedotov Россия  
Дата: 07.11.04 22:49
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>AndreyFedotov:


>> И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной.


ПК>Это в теории. На практике можно наблюдать, что многие библиотеки и API, написанные на C, лучше скрывают детали своей реализации, чем аналогичные библиотеки и API на C++.


Это вполне естественно. Чем больше возможностей в языке — тем больше шансов сделать кучу ляпов. Ведь C++, C# или Java не гарантируют принудительной инкапсуляции — а лишь поддерживают возможность инкапсуляции.

ПК>Попробуй, например, доступиться к внутренним структурам Windows — вряд ли это получится сделать легко: Win API достаточно хорошо изолирует тебя от внутренних деталей. А теперь давай посмотрим, скажем, на MFC... Много переменных-членов public, protected, не говоря уже о различных "внутренних" функциях с доступом public, включенных в интерфейс класса просто потому что они нужны самой MFC.


Сравнение не корректно. Команда, которая делала API Windows — была на несколько порядков опытнее, было потрачено гораздо болше времени и сил как на проектирование так и на реализацию. Про MFC прекрасно известно, что это было несчастное детя порочного союза — на которое всем было наплевать, и оно бы давно умерло, если бы не конкуренция с Borland, во имя которой MFC была раскручена, при сохранении обратной псевдосовместимости со старыми версиями — из-за которой и торчат кишки в виде открытых переменных и т.п.
Кроме того — сравнение это вообще не корректно — так как сравнивается ОС — обеспечивающая инкапсуляцию аппаратными средствами и весьма кривая библиотека — справедливо раскритикованная уже огромное кол-во раз. Тогда уж надо сравнивать Windows и объектно-ориентированные ОС.

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

Вот именно практически — будет. Хотя и в том и в другом случае — используя довольно простые трюки инкапсуляцию легко нарушить. Но проблема не в языке. Проблема в железе — которое просто не даёт возможности эффективно поддержать инкапсуляцию на уровне языка. Или резко теряете в производительности — или забудьте о настоящей инкапусляции.
Что бы инкапсулировать данные по-настоящему, требудется, что бы область данных процесса была доступна не всему процессу, а только коду методов класса. Современные процессоры такую возможность не предоставляют (хотя до некоторой степени на x386 это сделать и возможно).
Re[26]: Суть полимор
От: AndreyFedotov Россия  
Дата: 07.11.04 22:57
Оценка: 18 (1)
Здравствуйте, Шахтер, Вы писали:

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


AF>>Здравствуйте, Павел Кузнецов, Вы писали:


AF>> И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной.


Ш>Не можешь -- ты не видишь определение структуры, оно скрыто в файле реализации.


Да, так можно поступить — но тогда мигом получаем другие грабли — нет проверки указателей, и элементарно подсунуть вместо одного типа — другой. Что в случае C++ элементарно было бы выловлено на этапе компиляции.
Кроме того — сути дела это не меняет — инкапсуляция всё-равно только по соглашению. В том же модуле — где расположена структура — все равно элементарно можно получить доступ к содержимому объекта напрямую, а плодить по паре файлов на каждый тип — накладно.
Да и потом — никто и не отрицает возможности инкапсуляции на C — речь идёт только о накладных расходах на неё. Так же, как и в случае с ассемблером.
Re[27]: Суть полимор
От: jedi Мухосранск  
Дата: 07.11.04 23:13
Оценка: 2 (2) +1 -1
Здравствуйте, AndreyFedotov, Вы писали:

AF> Вот именно практически — будет. Хотя и в том и в другом случае — используя довольно простые трюки инкапсуляцию легко нарушить. Но проблема не в языке. Проблема в железе — которое просто не даёт возможности эффективно поддержать инкапсуляцию на уровне языка. Или резко теряете в производительности — или забудьте о настоящей инкапусляции.


ИМХО, Вы перепутали Божий дар с яичницей .
Инкапсуляция — это один из методов грамотного проектирования, позволяющий снизить связанность между компонентами из которых строится система.
А то о чем Вы говорите — это безопасность исполнения. И компилятор к ней никакого отношения не имеет.
Скорее это задача загрузчика ОС обеспечить защиту модулей от посягательств друг друга .

AF> Что бы инкапсулировать данные по-настоящему, требудется, что бы область данных процесса была доступна не всему процессу, а только коду методов класса. Современные процессоры такую возможность не предоставляют (хотя до некоторой степени на x386 это сделать и возможно).

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

Best regards, jedi.

P.S. Ой, кажется я ввязался в флейм ...
... << RSDN@Home 1.1.4 beta 3 rev. 219>>
Re[28]: Суть полимор
От: jedi Мухосранск  
Дата: 07.11.04 23:15
Оценка:
... да забыл можно без адресных пространств, а верификацией кода (как в .NET), т.е. по сути опять же это решается за счет испольняющей среды.
... << RSDN@Home 1.1.4 beta 3 rev. 219>>
Re[27]: Суть полимор
От: folk Россия  
Дата: 08.11.04 05:34
Оценка:
VladD2:

> F>Стыдно сказать, действительно путаемся. Предлагаю вынести ветку про инкапсуляцию в Философию, потому что эта тема интересна сама по себе.

>
> Что не сделаешь по просьбам трудящихся.

Вот бы модераторы philosophy и decl почаще разносили ветки по собственной инициативе, а то в длинных обсуждениях черт ногу сломит. Да еще мой OE иногда загадочно перетасовывает дерево сообщений.

>

> F>Ясно, что инкапсуляция (а также сокрытие информации и абстракция) так или иначе связаны с запрещением доступа к реализации. Чтобы говорить предметно попытался провести классификацию целей и средств.
>
> F>Цели, которые могут преследоваться, при запрещении доступа к реализации (добавьте если чего забыл) :
> F>1. исключение нарушения инвариантов реализации
> +1
> F>2. уменьшение цены внесения изменений в реализацию
> +1
> F>3. обеспечение полиморфного использования реализации
>
> И все же полиморфизм не связан непосредственно с инкапсуляцией. Те же ФЯ — это хорошо доказывают. Просто в ООП — это два принципа неразрывно связаны и в купе помогают решать проблемы абстрагирования.

Хотелось показать, что для кода, использующего полиморфный тип, реализация тоже скрыта. И скрыта по объективным причинам, а не потому что хочется безопасности или легкости изменений в реализации. Разве это не справедливо для ФЯ?

> F>Средства, которые могут использоваться, для запрещения доступа к реализации (если это вообще имеет отношение к обсуждаемому вопросу) (и добавьте если чего забыл) :

> F>1. права доступа в ЯП (public, private и т.д.)
> +1
> F>2. область видимости в ЯП (определение локально для функции, определение локально для модуля и т.д.)
> +1
> F>3. отдельный бинарный файл, содержащий реализацию (dll, exe в отдельном процессе и т.д.)
> +1
>
> F>Можно нарисовать таблицу 3х3 и указать, какие из ячеек относятся к инкапсуляции,...
> Нарисуй. Все только спасибо скажут.

Пусть сначала ПК прояснит кое-что.

> F>Давайте разберем мои ошибки и попытаемся прийти к консенсусу насчет этих терминов.

>
> По-моему, у тебя только одна ошибка и я указал на нее выше. В остальном согласен.

Ну и славно.
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[26]: Суть полимор
От: folk Россия  
Дата: 08.11.04 05:34
Оценка:
Павел Кузнецов:

> На C++ легче организовать сокрытие данных (вообще-то это вовсе не эквивалентно инкапсуляции, но на этом можно сейчас не останавливаться). Но это вовсе не означает, что сокрытие данных будет практически более эффективно, чем в C.


На этом нужно остановиться чтобы понять что такое инкапсуляция. Что понимается под сокрытием данных? Это то же самое что и сокрытие информации?
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[28]: Суть полимор
От: AndreyFedotov Россия  
Дата: 08.11.04 08:04
Оценка: +1
Здравствуйте, jedi, Вы писали:

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


AF>> Вот именно практически — будет. Хотя и в том и в другом случае — используя довольно простые трюки инкапсуляцию легко нарушить. Но проблема не в языке. Проблема в железе — которое просто не даёт возможности эффективно поддержать инкапсуляцию на уровне языка. Или резко теряете в производительности — или забудьте о настоящей инкапусляции.


J>ИМХО, Вы перепутали Божий дар с яичницей .

В этом у меня талант, однако...

J>Инкапсуляция — это один из методов грамотного проектирования, позволяющий снизить связанность между компонентами из которых строится система.

Догадываюсь.

J>А то о чем Вы говорите — это безопасность исполнения. И компилятор к ней никакого отношения не имеет.

Догадываюсь.
Об этом начал говорить не я а предидущие ораторы, когда они заявили, что:
— Windows лучше инкапсулирует свои внутренние структуры данных (написанные на C) чем библиотеки на C++ (в качестве примера приводилась MFC)
На что я ответил, что сравнение относительно хорошо продуманной ОС и кривой (изначально и по признанию создателей) библиотеки в смысле качества проектирования (одним из критериев которого безусловно и является инкапсуляция) — не корректно. Кроме того — прекрасны известны примеры, когда как раз используются внутренние структуры данных Windows — начиная от банальных LOGFONT — которые столь же элементарно заполнить как правильно так и не правильно (объектный GDI+ в этом смысле на порядок надёжнее) и кончая структурами, описание которых публике не известно (тому есть примеры в MSDN и даже здесь на RSDN — например посмотрите прекрасную статью про обработку структурированных исключений). Тут есть так же и другая грань — что доступ к ряду структур (например к структурам дескрипторов) защищён средствами ОС — но так это как раз и есть безопасность использования, а не инкапсуляция.

J>Скорее это задача загрузчика ОС обеспечить защиту модулей от посягательств друг друга .

На уровне модулей она давно решена.

AF>> Что бы инкапсулировать данные по-настоящему, требудется, что бы область данных процесса была доступна не всему процессу, а только коду методов класса. Современные процессоры такую возможность не предоставляют (хотя до некоторой степени на x386 это сделать и возможно).

J>И не скоро предоставят в том виде, в котором Вы это описали.
Вопрос — я тоже сомневаюсь, однако известно, что работы в этом направлении ведутся.

J>Во-первых это слишком сложно реализовать аппаратно (сами подумайте нужно грузить код всех методов данного класса в отдельный сегмент со спец. правами доступа к сегменту данных и т.д. и т.п).

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

J>Во-вторых это просто-напросто никому не нужно.

Никому, если не считать пентагон, МО, NASA и с десяток отраслеобразующих монстров вроде Intel и IBM.

J>В-третьих это легко достигается уже существующими методами. Помещением классов в разные адресные простронства и использование любого доступного метода IPC.

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

J>Best regards, jedi.

J>P.S. Ой, кажется я ввязался в флейм ...
А вот это у Тебя Талант...

PS. По поводу .NET — законы природы не обманешь. Если проверка не делается аппаратными средствами, значит она делается программно и нужно аккуратно выяснять плюсы и минусы обоих подходов, а не просто уповать на всемогущество .NET.
Re[27]: Суть полимор
От: Павел Кузнецов  
Дата: 08.11.04 15:48
Оценка:
folk,

>> На C++ легче организовать сокрытие данных (вообще-то это вовсе не эквивалентно инкапсуляции, но на этом можно сейчас не останавливаться). Но это вовсе не означает, что сокрытие данных будет практически более эффективно, чем в C.


> На этом нужно остановиться чтобы понять что такое инкапсуляция. Что понимается под сокрытием данных? Это то же самое что и сокрытие информации?


Да, то же самое. Во всяком случае, я на момент написания процитированного сообщения между data hiding и information hiding никакой разницы не подразумевал.

Не горя желанием участвовать в очередном обсуждении терминологии, которое, похоже, сейчас завяжется, хочу только заметить, что некоторые из предыдущих сообщений под сокрытием данных/информации подразумевали сокрытие таковых от глаз человека (это можно увидеть из упоминаний возможности глянуть на переменные, объявленные в секции private). В то время, как для данной дискуссии это совершенно не должно иметь значения, т.к. при обсуждении инкапсуляции и/или сокрытия данных/информации речь идет о возможности получения доступа к "внутренним" структурам с помощью средств языка, в то время как возможность их изучения человеком остается, фактически, всегда.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Суть полимор
От: Шахтер Интернет  
Дата: 08.11.04 18:44
Оценка: 1 (1)
Здравствуйте, AndreyFedotov, Вы писали:

AF>Здравствуйте, Шахтер, Вы писали:


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


AF>>>Здравствуйте, Павел Кузнецов, Вы писали:


AF>>> И всё-таки код не эквивалентен. Действуя по правилам языка — я могу использовать указатель на структуру, что бы получить или изменить значение переменной.


Ш>>Не можешь -- ты не видишь определение структуры, оно скрыто в файле реализации.


AF> Да, так можно поступить — но тогда мигом получаем другие грабли — нет проверки указателей, и элементарно подсунуть вместо одного типа — другой.


Почему же это её нет? Вместо одного типа другой ты не подсунешь.

AF>Что в случае C++ элементарно было бы выловлено на этапе компиляции.

AF> Кроме того — сути дела это не меняет — инкапсуляция всё-равно только по соглашению.

Нет, по реализации.

AF>В том же модуле — где расположена структура — все равно элементарно можно получить доступ к содержимому объекта напрямую,


По-моему, ничего страшного нет в том что реализация класса потребит один файл.

AF>а плодить по паре файлов на каждый тип — накладно.


В каком смысле накладно -- по числу файлов что ли? Я не думаю, что тут можно говорить о накладности.

AF> Да и потом — никто и не отрицает возможности инкапсуляции на C — речь идёт только о накладных расходах на неё.


Ну положим, о накладных расходах тут говорить смешно. Другое дело -- удобство.

AF>Так же, как и в случае с ассемблером.


Нет, не так же.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[27]: Суть полимор
От: Павел Кузнецов  
Дата: 08.11.04 19:02
Оценка: 1 (1) +1
AndreyFedotov:

> ПК> Это в теории. На практике можно наблюдать, что многие библиотеки и API, написанные на C, лучше скрывают детали своей реализации, чем аналогичные библиотеки и API на C++.


> <...>


> ПК>Попробуй, например, доступиться к внутренним структурам Windows — вряд ли это получится сделать легко: Win API достаточно хорошо изолирует тебя от внутренних деталей. А теперь давай посмотрим, скажем, на MFC... Много переменных-членов public, protected, не говоря уже о различных "внутренних" функциях с доступом public, включенных в интерфейс класса просто потому что они нужны самой MFC.


> Сравнение не корректно. Команда, которая делала API Windows — была на несколько порядков опытнее <...>


Я с этим не спорю. Я только привел пример того, что на C вполне возможно писать, не выпячивая детали реализации наружу; плюс пример того, что на C++ инкапсуляция автоматически "сама собой" тоже не возникает. Именно квалификация разработчиков, с моей точки зрения, и определяет "степень инкапсулированности" того, что получится в результате. И именно поэтому я скептически отношусь к заявлениям, скажем, о "большем совершенстве С+ с точки зрения инкапсуляции".
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Суть полимор
От: AndreyFedotov Россия  
Дата: 09.11.04 05:39
Оценка: 9 (1) +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Я с этим не спорю. Я только привел пример того, что на C вполне возможно писать, не выпячивая детали реализации наружу; плюс пример того, что на C++ инкапсуляция автоматически "сама собой" тоже не возникает. Именно квалификация разработчиков, с моей точки зрения, и определяет "степень инкапсулированности" того, что получится в результате.

Абсолютно согласен.

ПК>И именно поэтому я скептически отношусь к заявлениям, скажем, о "большем совершенстве С+ с точки зрения инкапсуляции".

А вот тут замечу — что речь идёт не о возможностях наделать ошибок (в том числе и с инкапсуляцией), а о потенциале языка — т.е. лёгкости, удобству, возможностях — писать с учётом инкапсуляции. Вот с этой точки зрения C++/C#/Jaba — явно опережают C. Это конечно не подразумевает, что весь софт, написанный на этих языках лучше с точки зрения инкапсуляции, но всего лишь то, что есть возможность его написать и есть написанный софт с прекрасной инкапсуляцией, при том реализация её средствами языка далась проще, чем она обошлась бы на C.
Так что в общем-то исходная посылка, с которой началась ветка, верна — в том смысле, что языки, на которые перещли разработчики за последние 10-15 лет действительно удобнее с точки зрения инкапсуляции. Но от себя добавлю — подавляющее большинство перешло на эти языки из-за чего угодно другого — только не из-за инкапсуляции. Что вобщем-то не помешало им осознать преимущества инкапсуляции позже. Так что можно смело сказать — что перешли они на языки с более удобной поддержкой инкапсуляции незаметно для себя.
Re: Суть понятия инкапсуляция...
От: Silver_s Ниоткуда  
Дата: 09.11.04 14:56
Оценка:
>...Суть понятия инкапсуляция

Инкапсуляция это все и процедурный подход, ООП, компонентно ориентированное пр., АОП.

А инкапсуляция на уровне классов в языках это слабенькая инкапсуляция.
Сильная инкапсуляция это например у InternetExplorer или у Word'a. CreateApplication, и ковыряем Application через интерфейсы.

А на уровне исходников как не крути но с первой попытки исходники не всегда и работать будут — зависит от опций компилятора итд.
Re: Суть понятия инкапсуляция...
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 10.11.04 04:39
Оценка: 9 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>VladD2:


>> Да шишники вот уже 35 лет слона не замечают. Хотя не все. Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


ПК>Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции? Можно примерчик?


Внесу и свои пять копеек в развитие флэйма .
Господа, вы воюете с ветряными мельницами. Практически любой язык включает средства для достижения инкапсуляции. Но одни языки поддерживают их явно (C++), а в других она достигается за счёт дополнительных средств (C). C++, С#, Java — это не показатели идеала и совершенства инкапсуляции. Вы знаете, что наиболее мощная поддержка инкапсуляция характерна для объектных (не путать с объектно-ориентированными) и процедурных языков? Пример? Пожалуйста: Turbo Pascal, инкапсуляция достигается за счёт помещения реализации внутрь специфичного бинарного модуля (с расширением tpu — помните?), во вне смотрит только интерфейс этого модуля, получить доступ к реализации вы не можете никаким способом и это штатные средства, поддерживаемые языком.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[28]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 15:17
Оценка:
Здравствуйте, folk, Вы писали:

F>Да еще мой OE иногда загадочно перетасовывает дерево сообщений.


Дык Янус юзать надо.

F>Хотелось показать, что для кода, использующего полиморфный тип, реализация тоже скрыта.


Зависит от реализации. Наверно в общем случае это так, но в общем...

F> И скрыта по объективным причинам, а не потому что хочется безопасности или легкости изменений в реализации. Разве это не справедливо для ФЯ?


Да в ФЯ как раз зачастую присуствует полиморфизм и отсуствует инкапсуляция. Многие ФЯ даже определение типов данных не поддерживают. Взять хотя бы Лисп.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 15:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это в теории. На практике можно наблюдать, что многие библиотеки и API, написанные на C, лучше скрывают детали своей реализации, чем аналогичные библиотеки и API на C++.


На практике то же ВыньАпи хэширует хэндлы и использует внутренние таблицы только ради того, чтобы разные умники не вычисляли адреса из хэндлов.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Суть понятия инкапсуляция...
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 10.11.04 15:28
Оценка: :))) :)
Здравствуйте, Mr. None, Вы писали:

MN> Пожалуйста: Turbo Pascal, инкапсуляция достигается за счёт помещения реализации внутрь специфичного бинарного модуля (с расширением tpu — помните?), во вне смотрит только интерфейс этого модуля, получить доступ к реализации вы не можете никаким способом и это штатные средства, поддерживаемые языком.


Вот именно. Модуль — единица инкапсуляции. И только такая инкапсуляция может быть настоящей. Инкапсуляция на уровне класса с помощью private/protected/public — на самом деле ничего не инкапсулирует, так как все-равно все всем остается видно.
Re[3]: Суть понятия инкапсуляция...
От: Kluev  
Дата: 10.11.04 16:12
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

MN>> Пожалуйста: Turbo Pascal, инкапсуляция достигается за счёт помещения реализации внутрь специфичного бинарного модуля (с расширением tpu — помните?), во вне смотрит только интерфейс этого модуля, получить доступ к реализации вы не можете никаким способом и это штатные средства, поддерживаемые языком.


СГ>Вот именно. Модуль — единица инкапсуляции. И только такая инкапсуляция может быть настоящей. Инкапсуляция на уровне класса с помощью private/protected/public — на самом деле ничего не инкапсулирует, так как все-равно все всем остается видно.


class Ultimate
{
   struct Ultimate_imp   *imp_;
public:
   void foo();
   void bar();
};


Ну и чего? Много видно-то?
С чем я согласен так это с тем что интерфейс к модулю действительно должен быть двоичным. Так проще и удобнее, но с другой стороны у плюсовых хидеров пока есть очень мощное преимущестово в виде инлайнгнвых функций:

class Foo
{
   void everything_get( const char *name, void *out );
public:
   int foo_get() { int x; everything_get("foo",&x); return x; }
};


Пример слекга надуман но тем не менее, показывает что одна функция может сидеть в классе в DLL и юзатся челой толпой инлайновых хелперов. Повышает производительность однако.
Re[27]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 10.11.04 19:54
Оценка: 14 (3) +2
Здравствуйте, folk, Вы писали:

F>Павел Кузнецов:


>> На C++ легче организовать сокрытие данных (вообще-то это вовсе не эквивалентно инкапсуляции, но на этом можно сейчас не останавливаться). Но это вовсе не означает, что сокрытие данных будет практически более эффективно, чем в C.


F>На этом нужно остановиться чтобы понять что такое инкапсуляция. Что понимается под сокрытием данных? Это то же самое что и сокрытие информации?


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

Таким образом, инкапсуляция не поддерживается в С на уровне языка. Хорошо это, или плохо? Вопрос не в том, где лучше и надежнее скрываются данные, меня, например, это волнует мало. А вот то, что ADT не является типом с точки зрения языка — это крайне неудобно.
Re[28]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 10.11.04 19:58
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Таким образом, инкапсуляция не поддерживается в С на уровне языка. Хорошо это, или плохо? Вопрос не в том, где лучше и надежнее скрываются данные, меня, например, это волнует мало. А вот то, что ADT не является типом с точки зрения языка — это крайне неудобно.


Особенно в случае языка С — там и так контроль типов слабый по самое небалуйся, считай переносимый ассемблер. Что и подтверждается практикой его применения.
Re[26]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 22:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Да:

ПК>

ПК>> Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?

ПК>Она в нем есть.


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

>> Скажи, ты считашь этот код таким же простым как и приведенный мной?


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


Это общая философия. С тем же успехом могу скзать, что ты просто слишком мало видел С-шного кода. Я начинал программировать когда плюсов еще небыло и даже когда они появились один фиг распространение у них было не сильное. Так вот я очень хорошо насмотрелся на примеры лобового программирования на С.

Да что там далего ходить. Изучи АПИ TreeView/ListView. Все эти LVITEM с значениями задаваемыми масками — это кривейший дизайн приводящий к ужаснешим последствиям. А вот С++-ные обертки к ним очень даже ничего. Так что все зависит от конкретных людей. С++ хотя бы пропагандирует инкапсуляцию. А С это понятие даже не офишировалось. Я не помню ни единого упоминания этого слова у того же Кернигана.

ПК>Если говорить о C++, то, несмотря на то, что "легальными" средствами получить доступ к private части класса нельзя, реально это делается совсем не сложно. Даже легче, чем в коде на C, приведенном выше, т.к. описание класса уже находится в заголовочном файле, и большинство модификаций оригинального кода не будет требовать исправлений в коде пользователя.


Ну, С++ я никогда не считал идеалом.

>> Паш, я устал от демагогии льющейся, с твоей стороны в мой адрес, в последнее время все больше и больше.


ПК>Наверное, мы просто стали чаще бывать в одних и тех же форумах


Возможно.

ПК>Да какая же провокация?


Да натуральная.

ПК> Я вполне мирно попросил
Автор: Павел Кузнецов
Дата: 06.11.04
тебя уточнить, что же ты имел в виду,


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

ПК>т.к. никакого особого совершенства C++ в отношении обеспечения инкапсуляции по сравнению с C я реально не наблюдаю.


А это чьи слова:

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.


Нельзя одновременно быть согласным и несогласным. Более того. Совершенно не ясно зачем постоянно пытаться требовать от других обоснований всего подряд. Обоснование столь очевидных и безабидных слов вряд ли можно требовать без каких-то целей. Захотелось что-то сказать? Так скажи не докапываясь к другим и не требуя от них что-то. Ты уж извени, но с каждым новым "требованием" все больше и больше хочется послать куда подальше. Ну, просто по человечески надоело.


ПК> По моему опыту скорее даже наоборот: т.к. "простых" средств для сокрытия данных в C нет, то если кому-то хочется это оганизовать, он вынужден использовать более радикальные подходы, чем в C++, соответственно, получая более эффективные в отношении сокрытия реализации результаты.


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

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

ПК>P.S. Тебе больше нравиться переходить к разборкам вместо того, чтобы ограничиться простым ответом на заданный вопрос?


Паш, с демагогией можно боросться только двумя методами:
1. Останавливать ее.
2. Отвечать той же "монетей", но в более более "громко".

Отвечать на явно демагогические вопросы означает идти на поводу у демагогии. Вернись еще раз к своему вопросу и попробуй ответить на вопрос зачем ты задал этот вопрос? Ну, а в следующий раз когда захочешь что-то скзать, то просто говори, а не пытайся поймать кого-то на чем-то и потом высасывать из пальца строчки вроде:

Отчего же, он вполне хорошо проиллюстрировал твою позицию, здорово сэкономив нам время на ненужной риторике. Как видишь, C вполне позволяет писать код, эквивалентный в отношении инкапсуляции коду на C++. Скажем, та же Win API в этом отношении вполне в порядке.

на слова вроде:

Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...

... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 22:32
Оценка: 10 (2)
Здравствуйте, jedi, Вы писали:

J>ИМХО, Вы перепутали Божий дар с яичницей .

J>Инкапсуляция — это один из методов грамотного проектирования, позволяющий снизить связанность между компонентами из которых строится система.

Ничего он не перепутал. Просто действительно средства инкапсуляции во многих современных ООЯ слишком легко обходятся. Те же менеджед-среды вроде дотнета как раз демонстрируют, что это всего лишь проблемы реализации. В дотнете получить доступ к закрытым членам очень не просто. Более того он контролируется защитой рантайм-подсистемы. Так что безопасность и инкапсуляция вещи слабо связанные только в средах прошлого поколения. В будущем они будут практически не отделимы.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 22:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Я с этим не спорю. Я только привел пример того, что на C вполне возможно писать, не выпячивая детали реализации наружу; плюс пример того, что на C++ инкапсуляция автоматически "сама собой" тоже не возникает.


Осталось выяснить зачем?

ПК> Именно квалификация разработчиков, с моей точки зрения, и определяет "степень инкапсулированности" того, что получится в результате.


Ну, сказал бы это. С тобой даже бы и спорить никто не стал бы.

ПК> И именно поэтому я скептически отношусь к заявлениям, скажем, о "большем совершенстве С+ с точки зрения инкапсуляции".


Ты как бы даже согласился с этим мнением. Напомнить где? У тебя тут явно какие-то логические проблемы. Ты признашь, что ООЯ обладают более совершенными средствами инкапсуляции, но в то же время пыташся поборосться с ками-то вертрянными мельницами. Странно это.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 22:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Да, то же самое. Во всяком случае, я на момент написания процитированного сообщения между data hiding и information hiding никакой разницы не подразумевал.


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

Что же касается инкапсуляции и С. Ну, замени инкапсуляцию на любой другой принцип ООП и окажется, что подобные тирады можно быдет высказать о любом из них. Все можно эмулировать на С. Вот только неудобно. И именно по этому разумные люди чисто интуитивно... ну, короче ты понял.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 22:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

К слову... вот погляди какое замечательное сообщение Re: Суть понятия инкапсуляция...
Автор: Silver_s
Дата: 09.11.04
. Чуть ли не через слово спорные утверждения, а ты что-то не споришь. Так стоило ли докапываться до утвреждений которым ты и противопоставить то ничего не можешь?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Суть полимор
От: jedi Мухосранск  
Дата: 10.11.04 22:55
Оценка: +2
Здравствуйте, VladD2, Вы писали:

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


J>>ИМХО, Вы перепутали Божий дар с яичницей .

J>>Инкапсуляция — это один из методов грамотного проектирования, позволяющий снизить связанность между компонентами из которых строится система.

VD>Ничего он не перепутал. Просто действительно средства инкапсуляции во многих современных ООЯ слишком легко обходятся. Те же менеджед-среды вроде дотнета как раз демонстрируют, что это всего лишь проблемы реализации. В дотнете получить доступ к закрытым членам очень не просто. Более того он контролируется защитой рантайм-подсистемы. Так что безопасность и инкапсуляция вещи слабо связанные только в средах прошлого поколения. В будущем они будут практически не отделимы.


Это конечно все верно, особенно точ то дотнет рулит Но вот объясните мне, убогому умом, ЗАЧЕМ нужна ТАКАЯ инкапсуляция? Что аппаратная (или рантайм) защита приватных данных делает хороший дизайн еще более хорошим? Ну не можешь ты писать в чужую память и все этого достаточно для защиты, причем тут вообще инкапсуляция? От ЧЕГО Вы защищаетесь таким способом?
Спасибо заранее.
... << RSDN@Home 1.1.4 beta 3 rev. 219>>
Re[29]: Суть полимор
От: Павел Кузнецов  
Дата: 10.11.04 22:57
Оценка:
VladD2,

> ПК> И именно поэтому я скептически отношусь к заявлениям, скажем, о "большем совершенстве С+ с точки зрения инкапсуляции".


> Ты как бы даже согласился с этим мнением. Напомнить где?


Ага, сделай одолжение
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Суть полимор
От: Павел Кузнецов  
Дата: 10.11.04 23:01
Оценка:
VladD2,

> ПК> Да, то же самое. Во всяком случае, я на момент написания процитированного сообщения между data hiding и information hiding никакой разницы не подразумевал.


> Вообще-то говорить о данных тут не очень умесно. <...>


data hiding — это термин не более того. Используется взаимозаменяемо с information hiding.

> Ну, замени инкапсуляцию на любой другой принцип ООП


Инкапсуляция существует и за рамками ООП. Это, вообще, более-менее общий термин, ООП не ограничивающийся.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Суть полимор
От: Павел Кузнецов  
Дата: 10.11.04 23:05
Оценка:
VladD2,

<... переходы на обсуждение личности оппонента опущены ...>

> ПК> т.к. никакого особого совершенства C++ в отношении обеспечения инкапсуляции по сравнению с C я реально не наблюдаю.


> А это чьи слова:

>

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.


"Легче" != "лучше". Разговоры о большем совершенстве у меня ассоциируются именно со вторым.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[30]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 23:23
Оценка:
Здравствуйте, jedi, Вы писали:

J>Это конечно все верно, особенно точ то дотнет рулит Но вот объясните мне, убогому умом, ЗАЧЕМ нужна ТАКАЯ инкапсуляция? Что аппаратная (или рантайм) защита приватных данных делает хороший дизайн еще более хорошим? Ну не можешь ты писать в чужую память и все этого достаточно для защиты, причем тут вообще инкапсуляция? От ЧЕГО Вы защищаетесь таким способом?

J>Спасибо заранее.

Что значит не можешь писать в чужую память? Каждый плевок в отдельный процесс не засунуть. Так что очень даже можешь. Сенгодня "чужой" код может быть везде.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 23:23
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> А это чьи слова:

>>

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.


ПК>"Легче" != "лучше". Разговоры о большем совершенстве у меня ассоциируются именно со вторым.


А я говорил о качестве инкапсуляции? Или то, что ее можно достичь проще — это хуже?

Еще раз напомню исходную цитату, против кторой ты возражаешь:

Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...

... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.11.04 23:31
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> Ты как бы даже согласился с этим мнением. Напомнить где?


ПК>Ага, сделай одолжение


На C++ легче организовать сокрытие данных
Автор: Павел Кузнецов
Дата: 07.11.04
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Суть полимор
От: jedi Мухосранск  
Дата: 10.11.04 23:44
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Что значит не можешь писать в чужую память? Каждый плевок в отдельный процесс не засунуть. Так что очень даже можешь. Сенгодня "чужой" код может быть везде.


Приехали... Начали с инкапсуляции — пришли к чужому коду.

Как чужой код может вызывать Ваши классы о существовании которых он ничего не знает? (О Reflection лекции просьба не читать). Или Вы боитесь такой ситуации: Вы реализуете какой-то интерфейс и передаете его куда-то в third-party компонент, а он негодяй давай быстро менять Ваши приватные поля. Ай-яй-яй... Бред.

Ответьте на вопрос какое отношение этот имеет к ИНКАПСУЛЯЦИИ.
... << RSDN@Home 1.1.4 beta 3 rev. 219>>
Re[31]: Суть полимор
От: Павел Кузнецов  
Дата: 11.11.04 00:45
Оценка:
VladD2,

>>> Ты как бы даже согласился с этим мнением. Напомнить где?


> ПК>Ага, сделай одолжение


> На C++ легче организовать сокрытие данных
Автор: Павел Кузнецов
Дата: 07.11.04


И где там согласие с "большем совершенстве С+ с точки зрения инкапсуляции"? То что на C++ легче организовать сокрытие данных/информации еще не означает, что получающийся результат лучше, чем то, что делается на C. В общем, все упирается в определение, что же такое "большее совершенство с точки зрения инкапсуляции".

Я был не согласен, подразумевая под "большим совершенством" получение "лучшей" инкапсуляции в результате. И в такой трактовке не соглашусь и сейчас.

Если же ты вкладывал в эти слова наличие в C++/Java/C# больших средств для обеспечения инкапсуляции, то да, я с такой поправкой согласен.

Только я не уверен, что это является причиной того, почему люди "переползают" (если вообще "переползают") c C на эти языки. Впрочем, имхо, тут сложно что-то определенно утверждать без проведения полноценного исследования.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Суть полимор
От: Павел Кузнецов  
Дата: 11.11.04 00:49
Оценка:
VladD2,

>>> А это чьи слова:

>>>

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.


> ПК>"Легче" != "лучше". Разговоры о большем совершенстве у меня ассоциируются именно со вторым.


> А я говорил о качестве инкапсуляции?


Ты сказал о "большем совершенстве"; что под этим понимать — Поэтому я и задавал дополнительные вопросы.

> Еще раз напомню исходную цитату, против кторой ты возражаешь:

>

Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


Чтобы не вести два параллельных разговора об одном и том же, вот ссылка на сообщение с ответом: http://rsdn.ru/forum/?mid=893414
Автор: Павел Кузнецов
Дата: 11.11.04
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Суть полимор
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.11.04 02:03
Оценка: -2 :))
Здравствуйте, VladD2, Вы писали:

>>> А это чьи слова:

>>>

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.

ПК>>"Легче" != "лучше". Разговоры о большем совершенстве у меня ассоциируются именно со вторым.
VD>А я говорил о качестве инкапсуляции? Или то, что ее можно достичь проще — это хуже?
VD>Еще раз напомню исходную цитату, против кторой ты возражаешь:
VD>

Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


Изуительно. Бурные аплодисменты. Зал встаёт, сцена усыпана цветами. Блестящая демонстрация того, что совершенство не связано с качеством. Ещё раз, браво! Философы посрамлены и нервно курят в дальнем углу.

PS. От наглого редактора художественной литературы (подробности тута)
Юноша, прежде чем писать крамолу, достойную жертвенного костра, не худо бы вспомнить правила формальной логики. О русском языке для ясности умолчу. Однако рекомендую впредь чисто интуитивно переползать на более совершенные языки изложения. Коль скоро русский Вам противопоказан.
Спойте, што ли, на С#, а?
Любителей рассуждать о том, что кому позволено или не позволено рекомендовать, отправляю по вышеуказанному адресу (это если без мата, ага).

PPS. С любезного разрешения Геннадия Васильева.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Суть понятия инкапсуляция...
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.11.04 04:41
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Вот именно. Модуль — единица инкапсуляции. И только такая инкапсуляция может быть настоящей. Инкапсуляция на уровне класса с помощью private/protected/public — на самом деле ничего не инкапсулирует, так как все-равно все всем остается видно.
Что значит "видно"? Ничего страшного, если я Оберон-модуль декомпильну и увижу все эти потрошки, заботливо спрятанные от постороннего глаза? А на досуге попробуй вызвать в .Net приватный метод другого класса. В том же модуле.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Суть понятия инкапсуляция...
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 11.11.04 04:55
Оценка: 2 (2) +3
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Mr. None, Вы писали:


MN>> Пожалуйста: Turbo Pascal, инкапсуляция достигается за счёт помещения реализации внутрь специфичного бинарного модуля (с расширением tpu — помните?), во вне смотрит только интерфейс этого модуля, получить доступ к реализации вы не можете никаким способом и это штатные средства, поддерживаемые языком.


СГ>Вот именно. Модуль — единица инкапсуляции. И только такая инкапсуляция может быть настоящей. Инкапсуляция на уровне класса с помощью private/protected/public — на самом деле ничего не инкапсулирует, так как все-равно все всем остается видно.


Слушайет, ну не надо выворачивать чужие слова с ног на голову и любую дискуссию сводит к рекламе Оберона! Я и паскаль-то так просто упоминул, с тем же успехом мог Алгол 60 вспомнить (просто я с ним знаком только по наслышке и не совсем уверен в его истинной модульности). Я где-нибудь сказал, что private/protected/public ничего не инкапсулирует? По-моему, как раз наоборот, читай внимательно: "Практически любой язык включает средства для достижения инкапсуляции. Но одни языки поддерживают их явно (C++), а в других она достигается за счёт дополнительных средств (C)."
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[30]: Суть полимор
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.11.04 11:14
Оценка: 12 (1) +2 :)
Здравствуйте, Павел Кузнецов, Вы писали:

>> А я говорил о качестве инкапсуляции?


ПК>Ты сказал о "большем совершенстве"; что под этим понимать — Поэтому я и задавал дополнительные вопросы.


Большее совершенство языка означает ровно одно — то что свои задачи язык решает лучше. А задача языка — облегчить написание программ. Отсюда совершенный язык позволяет лешче реализовать необходимые задачи. Соотв. более совершенный язык с точки зрения инкапсуляции позволяет легче и проще эту инкапсуляцию реализовать. А качество инкапсуляции — оно от языка слабо зависит, оно зависит от рантайма.
... << RSDN@Home 1.1.4 beta 3 rev. 230>>
AVK Blog
Re[30]: Суть полимор
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.11.04 11:25
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Юноша, прежде чем писать крамолу, достойную жертвенного костра,


Постарайся впредь обходится без подобного способа обращения к собеседнику.
... << RSDN@Home 1.1.4 beta 3 rev. 230>>
AVK Blog
Re[30]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 11.11.04 12:30
Оценка: 11 (2)
Здравствуйте, Геннадий Васильев, Вы писали:

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


>>>> А это чьи слова:

>>>>

Я с тобой согласен в отношении того, что в C++ легче сокрыть данные, чем в C.

ПК>>>"Легче" != "лучше". Разговоры о большем совершенстве у меня ассоциируются именно со вторым.
VD>>А я говорил о качестве инкапсуляции? Или то, что ее можно достичь проще — это хуже?
VD>>Еще раз напомню исходную цитату, против кторой ты возражаешь:
VD>>

Многие просто чисто интиуитивно переползают на более совершенные с точки зрения инкапсуляции языки вроде С++, Явы, Шарпа...


ГВ>Изуительно. Бурные аплодисменты. Зал встаёт, сцена усыпана цветами. Блестящая демонстрация того, что совершенство не связано с качеством. Ещё раз, браво! Философы посрамлены и нервно курят в дальнем углу.

Да, прикольно, дядя Гэндальф. Вот что значит репутация. А ведь в этот раз Влад прав, за что вы его так .

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

Особенно интересно вот что. Попробуйте определить на С generic-функцию, которая работает с типом данных, у которого определены операции, допустим, AddRef, Release, и Copy. Это имеет самое прямое отношение к инкапсуляции, так как реализация такого типа данных скрыта за интерфейсом, а интерфейс одинаков для любой реализации. Так что нет никаких причин, почему я не могу захотеть определить функцию, работающую с таким инкапсулированным (абстрактным) типом данных — ведь тип задается только набором операций над ним, так что тип одинаков для всех реализаций. Не знаю как кому, но мне "сокрытие данных" не интересно, мне нужна возможность полноценно работать с ADT.

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

В языке С слабая статическая типизация, этого вам поправить не удастся. Я боюсь, что в вашем решении вы возьмете худшее из двух миров — статического (язык С не предоставляет никакой стандартной возможности работать с типами в ран-тайме) и динамического (практически полное отсутствие статической проверки типов). Как такое может быть лучше С++ — ума не приложу.
Re[28]: Суть полимор
От: folk Россия  
Дата: 11.11.04 13:37
Оценка: +1
Gaperton:

> F>На этом нужно остановиться чтобы понять что такое инкапсуляция. Что понимается под сокрытием данных? Это то же самое что и сокрытие информации?

>
> Инкапсуляция = абстрактный тип данных. С другого конца надо подходить. Тип данных, который определяется набором операций над ним а не структурой.

Я достаточно много подумал над этим, и пришел к выводу, что инкапсуляция > абстрактный тип данных. В том смысле что во-1х инкапуслировать можно не только структуру данных, и во-2х поддержка реализацией некоторой абстракции еще не означает инкапсуляции этой реализации.

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

2. Понятие "инкапсуляция" в некотором смысле более жесткое, чем "абстракция". Этот пункт не такой бесспорный как первый, но если не согласны, то попробуйте объяснить в чем состоит различие между абстракцией и инкапсуляцией. Мне не хочется считать их синонимами.
Здесь класс А — пример абстракции, в которой не хватает инкапсуляции:
// класс A поддерживает (реализует) абстракцию - тип с функциями-членами foo() и bar() - но при этом не закрывает _data_member
class Ab
{
 public:
  void foo();
  void bar();
  int _data_member;
};

// класс B поддерживает (реализует) ту же абстракцию, но _data_member закрыт - вот она, инкапсуляция
class B
{
 public:
  void foo();
  void bar();
 private:
  int _data_member;
};

Конечно, по соглашению клиентский код может не обращаться к _data_member класса А, т.е. использовать А таким образом, как если бы он был инкапсулрован. Именно как если бы.

Забавно, что сначала мне не нравилось толкование из Википедии, и я хотел найти более правильное, но теперь вижу что пришел к нему же:

In computer science, information hiding is leaving out some details of implementation on purpose from the public. Encapsulation is, besides hiding, to provide common interfaces.


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

>
> Таким образом, инкапсуляция не поддерживается в С на уровне языка. Хорошо это, или плохо? Вопрос не в том, где лучше и надежнее скрываются данные, меня, например, это волнует мало. А вот то, что ADT не является типом с точки зрения языка — это крайне неудобно.

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

ЗЫ И конечно я согласен, что сокрытие в стиле С предпочтительнее чем ограничение доступа.
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[29]: Суть полимор
От: folk Россия  
Дата: 11.11.04 13:37
Оценка:
VladD2:

> F>Да еще мой OE иногда загадочно перетасовывает дерево сообщений.

>
> Дык Янус юзать надо.

Дык я же не только РСДН читаю. News удобнее в том смысле, что используется однин ридер для множества различных конференций.
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[32]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.11.04 13:52
Оценка:
Здравствуйте, jedi, Вы писали:

J>Приехали... Начали с инкапсуляции — пришли к чужому коду.


J>Как чужой код может вызывать Ваши классы о существовании которых он ничего не знает? (О Reflection лекции просьба не читать). Или Вы боитесь такой ситуации: Вы реализуете какой-то интерфейс и передаете его куда-то в third-party компонент, а он негодяй давай быстро менять Ваши приватные поля. Ай-яй-яй... Бред.


Так не бредь. Иди почитай про метаданные и управляемые среды.

J>Ответьте на вопрос какое отношение этот имеет к ИНКАПСУЛЯЦИИ.


Прямое. Это инкапсуляция перешедшая на новый уровень. Теперь это не джентельменское соглашение, а гарантированный сервис.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.11.04 13:52
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> На C++ легче организовать сокрытие данных
Автор: Павел Кузнецов
Дата: 07.11.04


ПК>И где там согласие с "большем совершенстве С+ с точки зрения инкапсуляции"?


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

ПК> То что на C++ легче организовать сокрытие данных/информации еще не означает, что получающийся результат лучше,


Да, но это означает, что в реальных приложениях все инкапсуляция будет появляться чаще. Такова уж человеческая натура.

ПК> чем то, что делается на C. В общем, все упирается в определение, что же такое "большее совершенство с точки зрения инкапсуляции".


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

ПК>Я был не согласен, подразумевая под "большим совершенством" получение "лучшей" инкапсуляции в результате. И в такой трактовке не соглашусь и сейчас.


Твои проблемы.

ПК>Если же ты вкладывал в эти слова наличие в C++/Java/C# больших средств для обеспечения инкапсуляции, то да, я с такой поправкой согласен.


По-моему, я это и говорил. Причем довольно однозначно.

ПК>Только я не уверен, что это является причиной того, почему люди "переползают" (если вообще "переползают") c C на эти языки.


А что есть какие-то иные причины? Даже шаблоны — это средство обеспечения полиморфизма. Уж С++ то точно интересен только этими принципами. С точки зрения дизайна язык то не очень. Хотя опять же лучше чем С.

ПК> Впрочем, имхо, тут сложно что-то определенно утверждать без проведения полноценного исследования.


Согласен. Остается вопрос зачем было развивать все это обсуждение на ровном месте.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.11.04 13:52
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ты сказал о "большем совершенстве"; что под этим понимать — Поэтому я и задавал дополнительные вопросы.


Там может быть нужно было это и переспросить раз так не понял?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.11.04 13:52
Оценка: 1 (1) +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Изуительно. Бурные аплодисменты. Зал встаёт, сцена усыпана цветами. Блестящая демонстрация того, что совершенство не связано с качеством. Ещё раз, браво! Философы посрамлены и нервно курят в дальнем углу.


Если выключить демагогию, то и попробовать разобраться, то станет ясно, что от языка зависит далеко не все. На любом ООЯ добиться инкапсуляции насравнимо проще чем на С++. Да и вобще писать в ОО-стиле несравнимо проще. Только этого не достаточно для получения качественного варианта. ПК совершенно прав в том, что и на С можно добиться желаемого результата если хоршенько потрахаться. Вот только трахаться нужно несравнимо больше. И качество будет зависить от упорства и принципиальности программиста.

Если сравнить среднестатистический код на С и С++ (а уж темболее на C#), то будет четкая тенденция... код написанный на С будет менее качественным. Но все это при общих равных условиях. Ну, а если сравнить код написанный на С матерым профи и ламером, но на С++, то код на С окажется лучше. Вот только выводы из этого можно сделать совершенно иные нежели делает ПК.

ГВ>PS. От наглого редактора художественной литературы (подробности тута)


Интересная ссылка. Пожалуй процитирую:

Forbidden
You don't have permission to access /index.pl on this server.
--------------------------------------------------------------------------------
Apache/2.0.46 (Red Hat) Server at www.livejornal.com Port 80


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

ГВ>Спойте, што ли, на С#, а?
ГВ>Любителей рассуждать о том, что кому позволено или не позволено рекомендовать, отправляю по вышеуказанному адресу (это если без мата, ага).

ГВ>PPS. С любезного разрешения Геннадия Васильева.



Коментировать этот бред и хамство как-то даже не хочется. Сплошная демагогия с переходом на личности. Причем неумело прикрытая несуществующей ссылкой.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Ссылка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.11.04 17:52
Оценка:
Здравствуйте, VladD2, Вы писали:

Вот точная ссылка: сюда.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[29]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 11.11.04 18:09
Оценка: 6 (2)
Здравствуйте, folk, Вы писали:

F>Я достаточно много подумал над этим, и пришел к выводу, что инкапсуляция > абстрактный тип данных. В том смысле что во-1х инкапуслировать можно не только структуру данных, и во-2х поддержка реализацией некоторой абстракции еще не означает инкапсуляции этой реализации.


F>1. Понятие "инкапсуляция" применимо не только к типу. Например, конкретная процедура (для функциональщиков — функция) замечательно инкапсулирует свой алгоритм (для функциональщиков — правила отображения входа в выход).


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

Литература:
Лисков, Б.; Гатэг, Дж.
"Использование абстракций и спецификаций при разработке программ"

Эта книга (оригинально издательства MITPress) построена на базе соответвующего учебного курса MIT, который вели означенные люди. Думаю, Лисков представлять не нужно. Это одна единственная книга, где про разнообразные абстракции сказано все.

F>2. Понятие "инкапсуляция" в некотором смысле более жесткое, чем "абстракция". Этот пункт не такой бесспорный как первый, но если не согласны, то попробуйте объяснить в чем состоит различие между абстракцией и инкапсуляцией. Мне не хочется считать их синонимами.

F>Здесь класс А — пример абстракции, в которой не хватает инкапсуляции:
F>
F>// класс A поддерживает (реализует) абстракцию - тип с функциями-членами foo() и bar() - но при этом не закрывает _data_member
F>class Ab
F>{
F> public:
F>  void foo();
F>  void bar();
F>  int _data_member;
F>};

Я не вижу здесь никакой абстракции. Это структура, + определено несколько функций, которые принимают ее аргументом. И все. Абстрактный тип данных определяется только операциями над ним. Понимаете — только. В этом смысл абстракции.
Что такое табуретка? Если вы скажете, что это четыре ножки + сиденье, это не будет ADT. ADT для табуретки — нечто, на что можно сесть. Стул — это не табуретка, у которой есть спинка. Это то, на что (1) можно сесть и (2) при этом можно откинуться назад и не упасть.

F>// класс B поддерживает (реализует) ту же абстракцию, но _data_member закрыт — вот она, инкапсуляция

F>class B
F>{
F> public:
F> void foo();
F> void bar();
F> private:
F> int _data_member;
F>};
F>[/c]
F>Конечно, по соглашению клиентский код может не обращаться к _data_member класса А, т.е. использовать А таким образом, как если бы он был инкапсулрован. Именно как если бы.
Зачем это делать? Если нечто помечено как public, позразумевается, что вы хотите предоставить к этому свободный доступ. Если это данные, то об абстракции можно забыть — ее нет. Какой смысл применять соглашения для достижения того, что и так предоставляется средствами языка?

F>Забавно, что сначала мне не нравилось толкование из Википедии, и я хотел найти более правильное, но теперь вижу что пришел к нему же:

In computer science, information hiding is leaving out some details of implementation on purpose from the public. Encapsulation is, besides hiding, to provide common interfaces.

Возможно. Меня как инженера не интересует information hiding. Это не привносит ничего интересного в процесс разработки и дизайна, если думаешь в терминах ADT. Тем более, не вижу смысла в маниакальном сокрытии данных в рамках одного проекта — люди и так узнают внутренности, если захотят — им достаточно просто спросить об этом автора . А если им не понятно, что такое public interface, то вопрос решается не техническими средствами, а простым обучением (хотя таких лучше на работу не брать).

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

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

>>
>> Таким образом, инкапсуляция не поддерживается в С на уровне языка. Хорошо это, или плохо? Вопрос не в том, где лучше и надежнее скрываются данные, меня, например, это волнует мало. А вот то, что ADT не является типом с точки зрения языка — это крайне неудобно.
F>Спецификаторы доступа в С++ появились, имо, специально для обеспечения инкапсуляции (а не абстракции). Но наряду с ними в С++ можно использовать унаследованный от С метод инкапсуляции — ограничение области видимости.
C++ предоставляет адекватные средства для реализации ADT, причем все модификаторы необходимы. Почему именно они появились — вопрос с моей точки зрения праздный, главное, зачем они мне нужны. Ну, а за использование в С++ методов инкапсуляции, и прочих методов, унаследованных из С, я лично бью по рукам. Особенно, если автор не в состоянии внятно объяснить свою мотивацию — почему он не применяет "родные" методы С++.
Re: Ссылка
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.11.04 18:30
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Вот точная ссылка: сюда.


И типа эта ссылка делает твою демагию более логичной, а оскорбления превращает в мудрость?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Ссылка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 11.11.04 18:34
Оценка: :)
Здравствуйте, VladD2, Вы писали:

ГВ>>Вот точная ссылка: сюда.

VD>И типа эта ссылка делает твою демагию более логичной, а оскорбления превращает в мудрость?

Она ведёт к наглому редактору.
... << RSDN@Home 1.1.3 stable >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[30]: Суть полимор
От: folk Россия  
Дата: 12.11.04 03:17
Оценка: :)
Здравствуйте, Gaperton, Вы писали:

F>>1. Понятие "инкапсуляция" применимо не только к типу. Например, конкретная процедура (для функциональщиков — функция) замечательно инкапсулирует свой алгоритм (для функциональщиков — правила отображения входа в выход).


G>Ваше наблюдение совершенно верное. При этом, это все равно совершенно одно и тоже.


Здесь я оспаривал уместность слова "тип" во фразе "инкапсуляция = абстрактный тип".

G>Выделяют два типа абстракции:

G>Абстракция данных (то, что в ООП называют инкапсуляция)
G>Процедурная абстракция — то что вы называете инкапсуляцией алгоритма.

G>Литература:

G>Лисков, Б.; Гатэг, Дж.
G>"Использование абстракций и спецификаций при разработке программ"

G>Эта книга (оригинально издательства MITPress) построена на базе соответвующего учебного курса MIT, который вели означенные люди. Думаю, Лисков представлять не нужно. Это одна единственная книга, где про разнообразные абстракции сказано все.


На досуге попробую найти-почитать. Но сомневаюсь что там все упрощено до "инкапсуляция = абстракция".

F>>2. Понятие "инкапсуляция" в некотором смысле более жесткое, чем "абстракция". Этот пункт не такой бесспорный как первый, но если не согласны, то попробуйте объяснить в чем состоит различие между абстракцией и инкапсуляцией. Мне не хочется считать их синонимами.

F>>Здесь класс А — пример абстракции, в которой не хватает инкапсуляции:
F>>
F>>// класс A поддерживает (реализует) абстракцию - тип с функциями-членами foo() и bar()
F>>// - но при этом не закрывает _data_member
F>>class Ab
F>>{
F>> public:
F>>  void foo();
F>>  void bar();
F>>  int _data_member;
F>>};

G>Я не вижу здесь никакой абстракции. Это структура, + определено несколько функций, которые принимают ее аргументом. И все. Абстрактный тип данных определяется только операциями над ним. Понимаете — только. В этом смысл абстракции.

Абстракция
struct { void foo(); void bar(); };
определяется только операциями foo и bar. Классы A и B являются не абстрактными, а вполне конкретными типами. И оба реализуют вышеуказанную абстракацию, так что клиент работающий с этой абстракцией может использовать и класс А, и класс B.

G>Что такое табуретка? Если вы скажете, что это четыре ножки + сиденье, это не будет ADT. ADT для табуретки — нечто, на что можно сесть. Стул — это не табуретка, у которой есть спинка. Это то, на что (1) можно сесть и (2) при этом можно откинуться назад и не упасть.


Стул не является табуреткой. Стул и табуретка являются сиденьями. А сиденье — нечто, на что можно сесть.

[]

F>>Конечно, по соглашению клиентский код может не обращаться к _data_member класса А, т.е. использовать А таким образом, как если бы он был инкапсулрован. Именно как если бы.

G>Зачем это делать? Если нечто помечено как public, позразумевается, что вы хотите предоставить к этому свободный доступ. Если это данные, то об абстракции можно забыть — ее нет. Какой смысл применять соглашения для достижения того, что и так предоставляется средствами языка?

Как правило незачем. Здесь я спорил с товарищами, утверждающими, что предоставление функций доступа без information hiding является инкапсуляцией. Я так не считаю.

F>>Забавно, что сначала мне не нравилось толкование из Википедии, и я хотел найти более правильное, но теперь вижу что пришел к нему же:

In computer science, information hiding is leaving out some details of implementation on purpose from the public. Encapsulation is, besides hiding, to provide common interfaces.

G>Возможно. Меня как инженера не интересует information hiding. Это не привносит ничего интересного в процесс разработки и дизайна, если думаешь в терминах ADT. Тем более, не вижу смысла в маниакальном сокрытии данных в рамках одного проекта — люди и так узнают внутренности, если захотят — им достаточно просто спросить об этом автора . А если им не понятно, что такое public interface, то вопрос решается не техническими средствами, а простым обучением (хотя таких лучше на работу не брать).

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


Если говорить о полезности/безполезности терминов, то зачем использовать два термина с одинаковой, по Вашему мнению, смысловой нагрузкой — абстракция и инкапсуляция?

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

[]

F>>Спецификаторы доступа в С++ появились, имо, специально для обеспечения инкапсуляции (а не абстракции). Но наряду с ними в С++ можно использовать унаследованный от С метод инкапсуляции — ограничение области видимости.

G>C++ предоставляет адекватные средства для реализации ADT, причем все модификаторы необходимы. Почему именно они появились — вопрос с моей точки зрения праздный, главное, зачем они мне нужны. Ну, а за использование в С++ методов инкапсуляции, и прочих методов, унаследованных из С, я лично бью по рукам.

Бессмысленная жестокость

G>Особенно, если автор не в состоянии внятно объяснить свою мотивацию — почему он не применяет "родные" методы С++.


Особенно, если автор вообще невменямый
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[31]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 12.11.04 11:48
Оценка:
Здравствуйте, folk, Вы писали:

F>Здесь я оспаривал уместность слова "тип" во фразе "инкапсуляция = абстрактный тип".

Ок, нивапрос.

G>>Лисков, Б.; Гатэг, Дж.

G>>"Использование абстракций и спецификаций при разработке программ"
F>На досуге попробую найти-почитать. Но сомневаюсь что там все упрощено до "инкапсуляция = абстракция".
Да, упрощено, на более чем 300 страницах. Вы когда-нибудь читали столько про одну "инкапсуляцию"? Книгу рекомендую, получите удовольствие.

F>Абстракция
struct { void foo(); void bar(); };
определяется только операциями foo и bar. Классы A и B являются не абстрактными, а вполне конкретными типами. И оба реализуют вышеуказанную абстракацию, так что клиент работающий с этой абстракцией может использовать и класс А, и класс B.


Путаете абстрактный класс и абстрактный тип данных. Несмотря на общее слово в названии, вещи совершенно разные. Абстрактный класс — у которого не бывает прямых экземпляров, т. е. который нельзя инстанцировать. Термин из ООП, позразумевает наличие иерархии наследования.
"Абстрактный тип данных" — термин не из ООП (но что парадоксально, знакомство с ADT позволит глубже понять принципы ООП). Что это такое, я уже объяснял, ссылки на литературу привел. В терминологии ООП ему соответствует просто "класс".

G>>Что такое табуретка? Если вы скажете, что это четыре ножки + сиденье, это не будет ADT. ADT для табуретки — нечто, на что можно сесть. Стул — это не табуретка, у которой есть спинка. Это то, на что (1) можно сесть и (2) при этом можно откинуться назад и не упасть.


F>Стул не является табуреткой. Стул и табуретка являются сиденьями. А сиденье — нечто, на что можно сесть.

Это уж как вы их определите. В моем примере стул и табуретка вообще не связаны отношением "являются". И это ровным счетом ничего не меняет.

F>Как правило незачем. Здесь я спорил с товарищами, утверждающими, что предоставление функций доступа без information hiding является инкапсуляцией. Я так не считаю.

Ну, со мной об этом спорить не надо. Как я говорил, я в таких терминах не рассуждаю.

F>>>Забавно, что сначала мне не нравилось толкование из Википедии, и я хотел найти более правильное, но теперь вижу что пришел к нему же:

In computer science, information hiding is leaving out some details of implementation on purpose from the public. Encapsulation is, besides hiding, to provide common interfaces.

G>>Возможно. Меня как инженера не интересует information hiding. Это не привносит ничего интересного в процесс разработки и дизайна, если думаешь в терминах ADT. Тем более, не вижу смысла в маниакальном сокрытии данных в рамках одного проекта — люди и так узнают внутренности, если захотят — им достаточно просто спросить об этом автора . А если им не понятно, что такое public interface, то вопрос решается не техническими средствами, а простым обучением (хотя таких лучше на работу не брать).

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


F>Если говорить о полезности/безполезности терминов, то зачем использовать два термина с одинаковой, по Вашему мнению, смысловой нагрузкой — абстракция и инкапсуляция?

Термин "инкапсуляция" применяется в контексте ООП, и понимается большинством именно как "сокрытие данных". Термин "абстракция" (в смысле абстракция данных/процедурная абстракция) не является распространенным и ходовым, я его применил (со ссылкой на литературу) только чтобы показать фактическое отсутствие разницы между концепцией ADT и ролью инкапсуляции в ООП. А вот термин Abstract Data Type применяется достаточно широко, и не обязательно в контексте ООП. Он в общем случае не требует соответствия языка принципам ООП. За ADT стоит своя теория, термин исторический, и его не перепутаешь с "сокрытием данных". Его нельзя понимать узко, как "инкапсуляцию". Я предпочитаю его, так как он позволяет избежать двусмысленных толкований, и не вызывает прямых ассоциаций с ООП.

F>Компонентные технологии здесь совершенно ни при чем. Чтобы узнать внутренности компонента, опять же достаточно спросить у автора , есть и другие способы.

Он может вам не сказать , а вы не сможете посмотреть. По крайней мере простым способом. Что и имеет место быть в случае, когда вы покупаете готовый ActiveX компонент, например (вот случай, когда надо необходимо скрыть реализацию). И они здесь очень даже причем — такой "способ инкапсуляции" не зависит от языка, и обеспечивает "надежное сокрытие данных". Здесь выше по ветке обсуждалось, какой язык обеспечивает "более надежную" инкапсуляцию, и это собственно мой ответ — никакой. Эту задачу решают компонентные технологии, только в их контексте такой разговор имеет смысл.

G>>C++ предоставляет адекватные средства для реализации ADT, причем все модификаторы необходимы. Почему именно они появились — вопрос с моей точки зрения праздный, главное, зачем они мне нужны. Ну, а за использование в С++ методов инкапсуляции, и прочих методов, унаследованных из С, я лично бью по рукам.

F>Бессмысленная жестокость
G>>Особенно, если автор не в состоянии внятно объяснить свою мотивацию — почему он не применяет "родные" методы С++.
F>Особенно, если автор вообще невменямый
"Уши мальчика на спине его. Он слушает, когда его бьют" (из древнеегипетских наставлений по обучению писцов)
Re[32]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 12.11.04 12:01
Оценка:
Здравствуйте, Gaperton, Вы писали:

F>>Абстракция
struct { void foo(); void bar(); };
определяется только операциями foo и bar. Классы A и B являются не абстрактными, а вполне конкретными типами. И оба реализуют вышеуказанную абстракацию, так что клиент работающий с этой абстракцией может использовать и класс А, и класс B.


G>Путаете абстрактный класс и абстрактный тип данных. Несмотря на общее слово в названии, вещи совершенно разные. Абстрактный класс — у которого не бывает прямых экземпляров, т. е. который нельзя инстанцировать. Термин из ООП, позразумевает наличие иерархии наследования.

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

Вы несколько не правы, класс и абстрактный тип данных — не совсем одно и тоже. В общем случаее любой класс — есть абстрактный тип данных. Но, один класс может представлять несколько абстрактных типов данных, или ещё более правильно, то объект определённого класса, может иметь несколько абстрактных типов данных пример:
class SomeClassA : public InterfaceA, public InterfaceB
{
};

SomeClassA obj;


obj обладает несколькими абстрактными типами данных — SomeClassA, InterfaceA и InterfaceB
На этом основании этого свойства вы можете передавать ссылку на obj в выражения, где требуются ссылки на InterfaceA, InterfaceB и SomeClassA.

void foo1(const SomeClassA&);
void foo2(const InterfaceA&);
void foo3(const InterfaceB&);

foo1(obj); // ОК
foo2(obj); // ОК
foo3(obj); // ОК


Это всё справедливо для языков проповедующих классический подход реализации ООП, то есть то подход, где есть понятие класс и оно тесно связано с понятием объект (C++, C#, Java, Object Pascal и т.д.).
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[33]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 12.11.04 13:24
Оценка: +2
Здравствуйте, Mr. None, Вы писали:

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


MN>Вы несколько не правы, класс и абстрактный тип данных — не совсем одно и тоже. В общем случаее любой класс — есть абстрактный тип данных. Но, один класс может представлять несколько абстрактных типов данных, или ещё более правильно, то объект определённого класса, может иметь несколько абстрактных типов данных пример:


Я прав , а то, что вы описываете, в теории типа называется "отношением подтипа" (чему в ООП соответствует термин "наследование"). Класс не "имеет" абстрактные типы данных, нет. Ситуация очевидна — один ADT (класс) "является подтипом" ("унаследован" от) другого ADT (класса). Вот и все, ничего сложного, как видите.

MN>
MN>class SomeClassA : public InterfaceA, public InterfaceB
MN>{
MN>};

MN>SomeClassA obj;
MN>


MN>obj обладает несколькими абстрактными типами данных — SomeClassA, InterfaceA и InterfaceB

MN>На этом основании этого свойства вы можете передавать ссылку на obj в выражения, где требуются ссылки на InterfaceA, InterfaceB и SomeClassA.

Obj — это не класс, а объект. И тип этого объекта obj вполне конкретен — это ADT SomeClassA, который является подтипом ADT InterfaceA и InterfaceB. Все три являются абстрактными типами данных, и они связаны отношением подтипа. Что и позволяет вам передавать его параметром в функцию, которая берет аргументом, например, InterfaceA (любое значение типа SomeClassA является также значением типа InterfaceA). Все просто.
Re[32]: Суть полимор
От: folk Россия  
Дата: 13.11.04 03:49
Оценка:
Gaperton:

> F>Абстракция
struct { void foo(); void bar(); };
определяется только операциями foo и bar. Классы A и B являются не абстрактными, а вполне конкретными типами. И оба реализуют вышеуказанную абстракацию, так что клиент работающий с этой абстракцией может использовать и класс А, и класс B.

>
> Путаете абстрактный класс и абстрактный тип данных. Несмотря на общее слово в названии, вещи совершенно разные. Абстрактный класс — у которого не бывает прямых экземпляров, т. е. который нельзя инстанцировать. Термин из ООП, позразумевает наличие иерархии наследования.
> "Абстрактный тип данных" — термин не из ООП (но что парадоксально, знакомство с ADT позволит глубже понять принципы ООП). Что это такое, я уже объяснял, ссылки на литературу привел. В терминологии ООП ему соответствует просто "класс".

Такое трактование абстрактного типа данных вижу впервые, но этих двоих я точно не путаю. Надо вернуться назад и объяснить что я подразумевал под абстрактным типом или просто абстракцией. Абстрактный класс из ООП совершенно не при чем. Чтобы не усложнять, забудем также про наследование и возможность реализации конкретным типом нескольких абстракций.
Вот клиентский код, использующий класс А:
int main()
{
  A a;
  a.foo(5);
  return a.bar();
}

Используя А, клиент рассматривает его как абстракцию
struct A { void foo(int); int bar(); };
, все остальные функции/данные класса А клиента не интересуют. Теперь посмотрим на конкретную реализация этой абстракции:
struct A
{
  A(): _data(1) {}  

  void foo(int x) { _set_data( x ? x : 1 ); }
  int bar() const { return 1000 / x; }
  
  void _set_data(int x) { _data = x; }
  int _data;
};

Программа, состоящая из определения А и main() замечательно работает и без инкапсуляции. Пока клиент использует абстракцию, все в порядке. Если при клиент выйдет за пределы абстракции, например обратится непосредственно к _set_data или _data, то можем получить проблемы в виде деления на ноль или в виде чрезмерной связанности, что помешает нам в модификации кода А (читай — подстановке некой реализации B вместо текущей реализации А).
Чтобы пресечь такую возможность, мы с помощью сокрытия информации убираем детали реализации из открытого доступа, и получаем инкапсуляцию. Вот грубо, что я имел ввиду.
Если говорить об абстракции без инкапсуляции, то ничто, кроме соображений целесообразности, не мешает нам выйти за пределы абстракции. Даже используя абстрактный класс ООП мы можем выйти за пределы этой абстракции, например с помощью dynamic_cast.

> G>>Что такое табуретка? Если вы скажете, что это четыре ножки + сиденье, это не будет ADT. ADT для табуретки — нечто, на что можно сесть. Стул — это не табуретка, у которой есть спинка. Это то, на что (1) можно сесть и (2) при этом можно откинуться назад и не упасть.

>
> F>Стул не является табуреткой. Стул и табуретка являются сиденьями. А сиденье — нечто, на что можно сесть.
> Это уж как вы их определите. В моем примере стул и табуретка вообще не связаны отношением "являются". И это ровным счетом ничего не меняет.

Оперируя абстракцией "сиденье", мы будем выполнять над ней только операции "сесть"/"встать", но не "откинуться", даже если текущая реализация сиденья позволяет откинуться.

[]

> F>Компонентные технологии здесь совершенно ни при чем. Чтобы узнать внутренности компонента, опять же достаточно спросить у автора , есть и другие способы.

> Он может вам не сказать , а вы не сможете посмотреть.

Процитирую начало разговора:

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

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

[]
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[33]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 13.11.04 15:35
Оценка:
Здравствуйте, folk, Вы писали:

F>Gaperton:


>> F>Абстракция
struct { void foo(); void bar(); };
определяется только операциями foo и bar. Классы A и B являются не абстрактными, а вполне конкретными типами. И оба реализуют вышеуказанную абстракацию, так что клиент работающий с этой абстракцией может использовать и класс А, и класс B.

>>
>> Путаете абстрактный класс и абстрактный тип данных. Несмотря на общее слово в названии, вещи совершенно разные. Абстрактный класс — у которого не бывает прямых экземпляров, т. е. который нельзя инстанцировать. Термин из ООП, позразумевает наличие иерархии наследования.
>> "Абстрактный тип данных" — термин не из ООП (но что парадоксально, знакомство с ADT позволит глубже понять принципы ООП). Что это такое, я уже объяснял, ссылки на литературу привел. В терминологии ООП ему соответствует просто "класс".

F>Такое трактование абстрактного типа данных вижу впервые, но этих двоих я точно не путаю.

Какое "такое"? ADT — тип данных который определяется операциями над ним (и ничем другим). О чем я уже вам писал. Я другого определения в литературе не встречал, а что на заборах написано меня мало интересует.

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

F>Вот клиентский код, использующий класс А:
F>
F>int main()
F>{
F>  A a;
F>  a.foo(5);
F>  return a.bar();
F>}
F>

F>Используя А, клиент рассматривает его как абстракцию
struct A { void foo(int); int bar(); };
, все остальные функции/данные класса А клиента не интересуют. Теперь посмотрим на конкретную реализация этой абстракции:

F>
F>struct A
F>{
F>  A(): _data(1) {}  

F>  void foo(int x) { _set_data( x ? x : 1 ); }
F>  int bar() const { return 1000 / x; }
  
F>  void _set_data(int x) { _data = x; }
F>  int _data;
F>};
F>

Вы не используете средства языка для определения абстракции. О чем я вам уже писал. Если так писать на С++ — это либо (1) неграмотность, либо (2) не абстракция.

F>Программа, состоящая из определения А и main() замечательно работает и без инкапсуляции. Пока клиент использует абстракцию, все в порядке. Если при клиент выйдет за пределы абстракции, например обратится непосредственно к _set_data или _data, то можем получить проблемы в виде деления на ноль или в виде чрезмерной связанности, что помешает нам в модификации кода А (читай — подстановке некой реализации B вместо текущей реализации А).


Клиент имеет возможность так поступить потому, что работает не с ADT, а со структурой. Ему открыта реализация, и он, зная С++, и не зная того, что происходит в вашей голове, решит что это никакой не ADT. И будет совершенно прав — на языке С++ ADT пишется по другому. Вам, конечно, никто не сможет запретить считать это ADT "без сокрытия данных" (хоть такая штука и противоречит определению ADT). Не буду и я.

F>Чтобы пресечь такую возможность, мы с помощью сокрытия информации убираем детали реализации из открытого доступа, и получаем инкапсуляцию. Вот грубо, что я имел ввиду.

То, что вы имеете в виду, противоречит определению ADT и теории типа. О чем я вам уже писал. Не бывает ADT "без сокрытия данных", кроме ситуации, если мы вынуждены использовать соглашения (инкапсуляция не поддерживается языком). В языках типа С++ поступать так — неграмотность.

F>Если говорить об абстракции без инкапсуляции, то ничто, кроме соображений целесообразности, не мешает нам выйти за пределы абстракции. Даже используя абстрактный класс ООП мы можем выйти за пределы этой абстракции, например с помощью dynamic_cast.

Я не понимаю, о чем вы. Как-то очень мудрено. "Выход за пределы абстракции посредством dynamic_cast" это жесткий хардкор .

F>Оперируя абстракцией "сиденье", мы будем выполнять над ней только операции "сесть"/"встать", но не "откинуться", даже если текущая реализация сиденья позволяет откинуться.

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

F>Процитирую начало разговора:

F>

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

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

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

Что и имеет место быть в случае, когда вы покупаете готовый ActiveX компонент, например (вот случай, когда надо необходимо скрыть реализацию).

Вот что здесь может быть непонятно? Это из моего поста, на который вы отвечаете. Как после этого примера можно думать, что я говорю о разработке в рамках одного проекта? Если у нас такие проблемы с взаимопониманием, то продолжать разговор нецелесообразно, ИМХО.
Re[34]: Суть полимор
От: folk Россия  
Дата: 14.11.04 04:27
Оценка:
Gaperton:

Сначала проясню основные моменты, а потом отвечу на ваши реплики.

Камень преткновения — толкование термина абстракция. Вы понимаете абстракцию скорее как сокрытие деталей, я же понимаю как игнорирование или сокрытие деталей (для использования абстракции это неважно). Похоже ваше толкование навеяно определением ADT, не здесь имхо не стоит проводить таких прямых ассоциаций.

Если принять "ваш" термин ADT (я принимаю — поиск подтверждает ваше определение) то "мое" понятие инкапсуляции действительно очень близко к ADT. За ADT — спасибо.

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

> F>Такое трактование абстрактного типа данных вижу впервые, но этих двоих я точно не путаю.

> Какое "такое"? ADT — тип данных который определяется операциями над ним (и ничем другим). О чем я уже вам писал. Я другого определения в литературе не встречал, а что на заборах написано меня мало интересует.

Вот именно "такое". Я не возражал против такого определения ADT, но не путаю его с абстрактным классом из ООП. У вас тоже неслабая способность не понимать оппонента

> F>Программа, состоящая из определения А и main() замечательно работает и без инкапсуляции. Пока клиент использует абстракцию, все в порядке. Если при клиент выйдет за пределы абстракции, например обратится непосредственно к _set_data или _data, то можем получить проблемы в виде деления на ноль или в виде чрезмерной связанности, что помешает нам в модификации кода А (читай — подстановке некой реализации B вместо текущей реализации А).

>
> Клиент имеет возможность так поступить потому, что работает не с ADT, а со структурой.

Именно так.

> Ему открыта реализация, и он, зная С++, и не зная того, что происходит в вашей голове, решит что это никакой не ADT.


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

[скиппед, не буду отвечать на шпильки мой адрес, хорошо?]

> Я не понимаю, о чем вы. Как-то очень мудрено. "Выход за пределы абстракции посредством dynamic_cast" это жесткий хардкор .


здесь я похоже перегнул. На самом деле и при наследовании от абстрактного класса в C++ возможен дополнителный уровень сокрытия — приватное наследование от абстрактного класса — dynamic_cast to implementation не должен работать.

> F>Процитирую начало разговора:

> F>

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

> F>Говорилось про разработку в рамках одного проекта. Почему при компонентной разработке автор откажется показывать код, а при некомпонентной — согласится?
>
> Независимая разработка — имелось в виду, когда в рамках одного проекта разработка ведется разными компаниями (такое бывает) и (возможно) по условиям контракта исходники и алгоритмы не должны быть раскрыты. Например.

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

> Вообще, у вас удивительная способность не понимать мои посты. Процитирую конец разговора:

>

> Что и имеет место быть в случае, когда вы покупаете готовый ActiveX компонент, например (вот случай, когда надо необходимо скрыть реализацию).

> Вот что здесь может быть непонятно? Это из моего поста, на который вы отвечаете. Как после этого примера можно думать, что я говорю о разработке в рамках одного проекта? Если у нас такие проблемы с взаимопониманием, то продолжать разговор нецелесообразно, ИМХО.

Проблема во взаимопонимании была связана с произведенной вами подменой понятий. Разработка в рамках одного проекта неожданно превратилась в купленный ActiveX и будто бы аргументы, справедливые в случае ActiveX подтверждают вашу правоту и для единого проекта. Обвиняйте в этом себя, а не меня.
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[35]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 14.11.04 23:38
Оценка:
Здравствуйте, folk, Вы писали:

F>Gaperton:


F>Сначала проясню основные моменты, а потом отвечу на ваши реплики.


F>Камень преткновения — толкование термина абстракция. Вы понимаете абстракцию скорее как сокрытие деталей, я же понимаю как игнорирование или сокрытие деталей (для использования абстракции это неважно). Похоже ваше толкование навеяно определением ADT, не здесь имхо не стоит проводить таких прямых ассоциаций.

Уточню свою позицию — я думаю она у нас отличается не сильно на самом деле. Хочу только отметить, что
1) В языках, которые позволяют скрыть реализацию, тип с публичными данными — это не ADT. Так как соглашения применять смысла нет. В таком случае говорим, что в языке есть поддержка инкапсуляции.
2) В языках, где все всегда "public", единственный способ определить ADT — применять соглашения, что к данным (некоторым функциям) обращаться нельзя. Такой язык не имеет поддержки инкапсуляции, и мы вынуждены применять соглашения. Что не есть гут, и в нашей теории этот прискорбный факт отражать негоже, бо просто незачем — и так понятно, что не от хорошей жизни это все. "ADT без инкапсуляции" — и есть попытка отразить сие безобразие в теории, на что я вам и указал . Вот и все.

К тому же, у вас примеры были на одном языке, на что я вам и отметил, что один из примеров ADT не является. Вот если бы вы привели один из примеров, например, на питоне, тогда вопросов бы не было. Там соглашения — единственный способ "скрыть" реализацию (определить ADT. Хотя, может я и отстал от жизни, и там появились закрытые члены класса). Но это скорее уже придирки с моей стороны.

F>Если принять "ваш" термин ADT (я принимаю — поиск подтверждает ваше определение) то "мое" понятие инкапсуляции действительно очень близко к ADT. За ADT — спасибо.

Не за что . Приятно, что из беседы получилась польза.

>> F>Такое трактование абстрактного типа данных вижу впервые, но этих двоих я точно не путаю.

>> Какое "такое"? ADT — тип данных который определяется операциями над ним (и ничем другим). О чем я уже вам писал. Я другого определения в литературе не встречал, а что на заборах написано меня мало интересует.

F>Вот именно "такое". Я не возражал против такого определения ADT, но не путаю его с абстрактным классом из ООП. У вас тоже неслабая способность не понимать оппонента

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

>> Я не понимаю, о чем вы. Как-то очень мудрено. "Выход за пределы абстракции посредством dynamic_cast" это жесткий хардкор .


F> здесь я похоже перегнул. На самом деле и при наследовании от абстрактного класса в C++ возможен дополнителный уровень сокрытия — приватное наследование от абстрактного класса — dynamic_cast to implementation не должен работать.

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

F>Прямой зависимости между компонентностью и сокрытием исходников нет. Не забываем о статически компонуемых библитеках lib.

Тоже метод.

F>Проблема во взаимопонимании была связана с произведенной вами подменой понятий. Разработка в рамках одного проекта неожданно превратилась в купленный ActiveX и будто бы аргументы, справедливые в случае ActiveX подтверждают вашу правоту и для единого проекта. Обвиняйте в этом себя, а не меня.

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

Для одной команды надежное "сокрытие реализации" не имеет смысла, так как сами понимаете, какие секреты, все свои. Если человек при этом нарушает инкапсуляцию, его можно научить постредством "толстый железный проволока" (как это по русски? Лом!) по спине. Когда оно реально имеет смысл (примеры с купленным софтом/тонкостями копирайтов на разные куски софта), оно достигается не средствами языка (статические/динамические либы, компонентные технологии — you name it), так что тем более бессмысленно сравнивать языки по надежности сокрытия реализации (что происходило выше по ветке).

Мне все еще надо себя обвинять, или мы таки поняли друг друга?
Re[34]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 15.11.04 04:47
Оценка:
Здравствуйте, Gaperton, Вы писали:

MN>>Вы несколько не правы, класс и абстрактный тип данных — не совсем одно и тоже. В общем случаее любой класс — есть абстрактный тип данных. Но, один класс может представлять несколько абстрактных типов данных, или ещё более правильно, то объект определённого класса, может иметь несколько абстрактных типов данных пример:


G>Я прав , а то, что вы описываете, в теории типа называется "отношением подтипа"

Не вижу противоречий — любой объект подтипа обладает как минимум 2-умя типами: прямым типом и типом предка.

G>(чему в ООП соответствует термин "наследование").

И тут вы не правы. В ООП нет ни слова об отношении тип-подтип — это объектное и структурное программирование, а ООП определяет отношение потомок-предок, что не всегда есть тип-подтип. В некоторых языках программирования реализация отношения потомок-предок выполняется через тип-подтип (классический подход реализации ООП) — это, например, C++. Но заметьте — это не обязательно, снвоа приведу в пример язык Self — это объектно-ориентированный язык, в котором есть понятие наследования, которое реализует отношение потомок-предок, но начисто отсутствует понятие типа (класса кстати тоже); наследование там реализуется в терминах объектов — один объект является предком другого.

G>Класс не "имеет" абстрактные типы данных, нет. Ситуация очевидна — один ADT (класс) "является подтипом" ("унаследован" от) другого ADT (класса). Вот и все, ничего сложного, как видите.


Вы всё сильно упрощаете. Тип — это абстракция времени компиляции, используемая для решения проблемы классификации выражений в языках со статической типизацией (правила подстановки типов проверяются компилятором при компиляции). Класс — это некоторая сущность, описывающая свойства объекта, она может существовать даже в период выполнения программы (объекты вы можете создавать и динамически).
Вот вам пример объектной системы, в которой понятия типа и класс разделены (я его уже приводил). Подсистема графического интерфейса Windows:
1) класс окна определяет свойства окна;
2) само окно — это объект определённого класса;
3) в программе ты имеешь доступ к нему через описатель, который определяет тип объекта для записи выражений языка программирования.

MN>>
MN>>class SomeClassA : public InterfaceA, public InterfaceB
MN>>{
MN>>};

MN>>SomeClassA obj;
MN>>


MN>>obj обладает несколькими абстрактными типами данных — SomeClassA, InterfaceA и InterfaceB

MN>>На этом основании этого свойства вы можете передавать ссылку на obj в выражения, где требуются ссылки на InterfaceA, InterfaceB и SomeClassA.

G>Obj — это не класс, а объект.

см. выше "объект определённого класса, может иметь несколько абстрактных типов данных". Я знаю, что obj — это объект и пока что в моих словах нет противоречия.

G>И тип этого объекта obj вполне конкретен — это ADT SomeClassA, который является подтипом ADT InterfaceA и InterfaceB. Все три являются абстрактными типами данных, и они связаны отношением подтипа. Что и позволяет вам передавать его параметром в функцию, которая берет аргументом, например, InterfaceA (любое значение типа SomeClassA является также значением типа InterfaceA). Все просто.


Уже ответил выше: "любой объект подтипа обладает как минимум 2-умя типами: прямым типом и типом предка"
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[35]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 15.11.04 11:59
Оценка:
Здравствуйте, Mr. None, Вы писали:

G>>Я прав , а то, что вы описываете, в теории типа называется "отношением подтипа"

MN>Не вижу противоречий — любой объект подтипа обладает как минимум 2-умя типами: прямым типом и типом предка.
У любого объекта один тип. Всегда. Если вы не начнете изобретать свою теорию (чем вы и занимаетесь), то она пойдет по мясницкий нож Оккама. Уже пошла.

G>>(чему в ООП соответствует термин "наследование").

MN>И тут вы не правы. В ООП нет ни слова об отношении тип-подтип — это объектное и структурное программирование, а ООП определяет отношение потомок-предок, что не всегда есть тип-подтип.
И тут я прав. Я вам говорю не свое мнение на тему что такое тип-подтип и прочие философские вопросы (как делаете вы), а о соотвествии терминологии из теории типа и ООП. А о чем говорите вы — не знаю.

MN>Вы всё сильно упрощаете.

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

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

Вы забыли добавить одну из двух вещей, что делать необходимо, если вы с кем-то спорите. Либо ссылочку на печатную работу по теме, либо мааленькое слово ИМХО. Зачем мне вникать в ваше персональное понимание понятий "тип" и "класс", относительно которых весь остальной мир определился 20 лет назад? Есть на то какие-нибудь причины?

MN>Уже ответил выше: "любой объект подтипа обладает как минимум 2-умя типами: прямым типом и типом предка"

Вы бы ознакомились для начала с теорией типа — тем, что уже сделано в этой области. Поиск: type theory. А то ваши мысли слишком оригинальны, в них разобраться тяжело. Правда.
Re[36]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 15.11.04 12:48
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Mr. None, Вы писали:


G>>>Я прав , а то, что вы описываете, в теории типа называется "отношением подтипа"

MN>>Не вижу противоречий — любой объект подтипа обладает как минимум 2-умя типами: прямым типом и типом предка.
G>У любого объекта один тип. Всегда. Если вы не начнете изобретать свою теорию (чем вы и занимаетесь), то она пойдет по мясницкий нож Оккама. Уже пошла.
G>>>(чему в ООП соответствует термин "наследование").
MN>>И тут вы не правы. В ООП нет ни слова об отношении тип-подтип — это объектное и структурное программирование, а ООП определяет отношение потомок-предок, что не всегда есть тип-подтип.
G>И тут я прав. Я вам говорю не свое мнение на тему что такое тип-подтип и прочие философские вопросы (как делаете вы), а о соотвествии терминологии из теории типа и ООП. А о чем говорите вы — не знаю.

И я вам излагаю не своё мнение, более того, могу даже ссылки на авторитеты и книги привести.
Чтобы у вас не сложилось впечатление, что я философствую о сферических конях в вакууме вот вам конкретные примеры.
Язык Self — объектно-ориентированый, понятие типа отсутсвует напрочь, понятие класса отсутствует напрочь, наследование реализуется в терминах объектов: один объект создаёт другого и становится его предком, новый объект является для него потомком — отношение потомок-предок. Язык Volcano (основаный на параллельном прологе) — объектно-ориентированный, понятия типа отсутствует, понятие класса отстуствует, поэтому и наследование не может пониматься как отношение тип-подтип, объект представляется в виде бесконечного процесса вычисления продукционного правила (не спрашивайте что это такое — не отвечу).
Далее пример из области проектирования — классика ошибочное использование наследования:
класс реализующий очередь сообщения наследуют от класса списка, потому что они сходны по функциональности и у них есть функции со схожими сигнатурами — с точки зрения компилятора получилось отношение тип-подтип, с точки зрения здравого смысла очередь сообщений и список настолько далеки друг от друга, что не могут выступать как родственные сущности связанные отношением наследования (потомок-предок).
Достаточно?

MN>>Вы всё сильно упрощаете.

G>Теория и должна все упрощать, в ней не бывает ничего лишнего. Я вам рассказываю о теории типа, а не о "мыслях, к которым я пришел, и которые мне очень дороги". В науке вовсю действует принцип "бритвы оккама". И вообще я сложные вещи не запоминаю, я не "мальчик с феноменальной памятью".

Это конкретная реализация всё упрощает в частности вы говорите о реализации ООП, принятой в таких языках как C++, C#, Java, Object Prolog и т. д. Несмотря на то, что это очень распространённые языки — это далеко не самая лучшая реализация ООП (говорю это несмотря на то, что плюсы — это мой второй язык после русского) и сужать всю теорию ООП до наследования, инкапсуляции и полиморфизма как они представимы в C++ очень недальновидно.
Есть как минимум 2 подхода в реализации ООП:
1) принятая в плюсах, для неё в частности характерно статическое наследование (реализаемое через банальное копирование кода предка в код потомка при компиляции) и виртуальные вызовы;
2) принятая в Self`е — наследование через агрегацию и делегирование вызовов.

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

G>Вы забыли добавить одну из двух вещей, что делать необходимо, если вы с кем-то спорите. Либо ссылочку на печатную работу по теме, либо мааленькое слово ИМХО.

Да, пожалуйста:
А. Элиенс. Принципы объектно-ориентированной разработки программ

G>Зачем мне вникать в ваше персональное понимание понятий "тип" и "класс", относительно которых весь остальной мир определился 20 лет назад?


Выходит, что ещё не определился.
Да и как насчёт примера относительно подсистемы графического пользовательского интерфейса Windows? Стало быть к нему у вас претензий нет?

G>А то ваши мысли слишком оригинальны, в них разобраться тяжело. Правда.

А я и не заставляю.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[37]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 15.11.04 12:51
Оценка:
MN>Есть как минимум 2 подхода в реализации ООП:
MN>1) принятая в плюсах, для неё в частности характерно статическое наследование (реализаемое через банальное копирование кода предка в код потомка при компиляции) и виртуальные вызовы;
MN>2) принятая в Self`е — наследование через агрегацию и делегирование вызовов.

Забыл 3-ий подход — принятый в Volcano, но он слишком экзотический и скорее всего жить не будет, но меж тем всё равно он есть и отличается от других подходов.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[37]: Суть полимор
От: hrg Россия  
Дата: 15.11.04 13:17
Оценка: +1
Mr. None -> "Re[36]: Суть полимор"

MN> Чтобы у вас не сложилось впечатление, что я философствую о

MN> сферических конях в вакууме вот вам конкретные примеры.
MN> Язык Self — объектно-ориентированый, понятие типа отсутсвует
MN> напрочь, понятие класса отсутствует напрочь, наследование
MN> реализуется в терминах объектов: один объект создаёт другого и
MN> становится его предком, новый объект является для него потомком -
MN> отношение потомок-предок. Язык Volcano (основаный на параллельном
MN> прологе) — объектно-ориентированный, понятия типа отсутствует,
MN> понятие класса отстуствует, поэтому и наследование не может
MN> пониматься как отношение тип-подтип, объект представляется в виде
MN> бесконечного процесса вычисления продукционного правила (не
MN> спрашивайте что это такое — не отвечу).

Я таки сильно извиняюсь, но какая от этого конкретная польза?

Yury Kopyl aka hrg | Хоббиты — маздай! Мордовия — фарева
Posted via RSDN NNTP Server 1.9 gamma
Re[37]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 15.11.04 13:32
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN>И я вам излагаю не своё мнение, более того, могу даже ссылки на авторитеты и книги привести.

Даже ссылки на авторитеты и книги? Не думал, что о том, что я не прав, пересказывая теорию типа, опубликованную в одних книгах, уже пишут в других.

MN>Чтобы у вас не сложилось впечатление, что я философствую о сферических конях в вакууме вот вам конкретные примеры.

MN>Достаточно?
Более чем, чтобы в очередной раз посоветовать вам ознакомится с теорией типа, прежде чем философствовать.

MN>Это конкретная реализация всё упрощает в частности вы говорите о реализации ООП, принятой в таких языках как C++, C#, Java, Object Prolog и т. д. Несмотря на то, что это очень распространённые языки — это далеко не самая лучшая реализация ООП (говорю это несмотря на то, что плюсы — это мой второй язык после русского) и сужать всю теорию ООП до наследования, инкапсуляции и полиморфизма как они представимы в C++ очень недальновидно.

Я-то как раз (в отличии от) говорю не о конкретной реализации, а о теории типа, близко к в варианту Лисков. Она не зависит от языка, и в общем случае перпендикулярна ООП. Что касается ООП, у него есть минимум два достаточно строгих определения. В данный момент я пользуюсь классическим (наследования, инкапсуляции и полиморфизма), которое на самом деле более общо, чем модель типов языков Smalltalk, С++, Java, etc.

MN>Да и как насчёт примера относительно подсистемы графического пользовательского интерфейса Windows? Стало быть к нему у вас претензий нет?

Она не имеет никакого отношения к теории типа, и языкам программирования. Мне на нее плевать. Спорить надоело, всего доброго.
Re[36]: Суть полимор
От: folk Россия  
Дата: 15.11.04 14:43
Оценка:
Gaperton:

> Мне все еще надо себя обвинять, или мы таки поняли друг друга?


Похоже поняли. Обвинения сняты
Posted via RSDN NNTP Server 1.9 gamma
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[38]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.11.04 04:14
Оценка:
Здравствуйте, hrg, Вы писали:

hrg>Mr. None -> "Re[36]: Суть полимор"


MN>> Чтобы у вас не сложилось впечатление, что я философствую о

MN>> сферических конях в вакууме вот вам конкретные примеры.
MN>> Язык Self — объектно-ориентированый, понятие типа отсутсвует
MN>> напрочь, понятие класса отсутствует напрочь, наследование
MN>> реализуется в терминах объектов: один объект создаёт другого и
MN>> становится его предком, новый объект является для него потомком -
MN>> отношение потомок-предок. Язык Volcano (основаный на параллельном
MN>> прологе) — объектно-ориентированный, понятия типа отсутствует,
MN>> понятие класса отстуствует, поэтому и наследование не может
MN>> пониматься как отношение тип-подтип, объект представляется в виде
MN>> бесконечного процесса вычисления продукционного правила (не
MN>> спрашивайте что это такое — не отвечу).

hrg>Я таки сильно извиняюсь, но какая от этого конкретная польза?


Volcano используется для решения очень специфичных задач. Self включает на уровне языка концепции представленные в доброй половине шаблонов проектирования банды четырёх — то есть их не надо реализовывать самостоятельно как в плюсах, всё это уже есть в языке, причём никто специально ничего не писал, просто сама концепция языка фактически их реализует.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[38]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.11.04 04:31
Оценка: 1 (1) +1
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, Mr. None, Вы писали:


MN>>И я вам излагаю не своё мнение, более того, могу даже ссылки на авторитеты и книги привести.

G>Даже ссылки на авторитеты и книги? Не думал, что о том, что я не прав, пересказывая теорию типа, опубликованную в одних книгах, уже пишут в других.

Вот только не нало поясничать.. Я привёл вам ссылку на книгу, почитайте на досуге, узнаете очень много нового.

MN>>Чтобы у вас не сложилось впечатление, что я философствую о сферических конях в вакууме вот вам конкретные примеры.

MN>>Достаточно?
G>Более чем, чтобы в очередной раз посоветовать вам ознакомится с теорией типа, прежде чем философствовать.

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

MN>>Это конкретная реализация всё упрощает в частности вы говорите о реализации ООП, принятой в таких языках как C++, C#, Java, Object Prolog и т. д. Несмотря на то, что это очень распространённые языки — это далеко не самая лучшая реализация ООП (говорю это несмотря на то, что плюсы — это мой второй язык после русского) и сужать всю теорию ООП до наследования, инкапсуляции и полиморфизма как они представимы в C++ очень недальновидно.

G>Я-то как раз (в отличии от) говорю не о конкретной реализации, а о теории типа, близко к в варианту Лисков.
А причём здесь теория типов, если речь зашла об ООП?

G>Она не зависит от языка, и в общем случае перпендикулярна ООП.

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

G>Что касается ООП, у него есть минимум два достаточно строгих определения. В данный момент я пользуюсь классическим (наследования, инкапсуляции и полиморфизма), которое на самом деле более общо, чем модель типов языков Smalltalk, С++, Java, etc.


Будьте добры приведите хоть одно. То что вы подразумеваете под определением основаным на наследование, инкапсуляцие и полиморфизме — это не определение, а одна из реализаций модели или выражаясь иным языком — знаковой системы — именуемой ООП. Есть и другие реализации, вот только давать определение модели по её реализации нельзя. Для начала будьте добры сформулируйте основные положения модели и докажите её полноту и непротиворечивость, а уж после этого бросайтесь определениями самой модели! Что не можете? И это понятно, потому что пока что ещё никому не удалось подвести под ООП строгую математическую базу — только философские заключения. В отличие от теории типов, которая прочно сидит на теории множеств. Поэтому, например, ваше заявление о "соотвествии терминологии из теории типа и ООП" просто несостоятельно — они не могут соответствовать потому что терминология теории типов жёстко определена, а терминология ООП весьма расплывчата. Это как с фракталами, все понимают, что такое фрактал, все могут привести несколько десятков реализаций, но никто не может дать чёткого определения.
И если уж на то пошло, то "наследование, инкапсуляция, полиморфизм" — это очень узкая реализация. Есть более широкие определения, включающие в том числе и данную (НИП), я привёл ссылку на книгу, где расказывается об одной из них.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[39]: Суть полимор
От: hrg Россия  
Дата: 16.11.04 07:00
Оценка:
Mr. None -> "Re[38]: Суть полимор"

MN>>> Чтобы у вас не сложилось впечатление, что я философствую о

MN>>> сферических конях в вакууме вот вам конкретные примеры.
MN>>> Язык Self — объектно-ориентированый, понятие типа отсутсвует
MN>>> напрочь, понятие класса отсутствует напрочь, наследование
MN>>> реализуется в терминах объектов: один объект создаёт другого и
MN>>> становится его предком, новый объект является для него потомком -
MN>>> отношение потомок-предок. Язык Volcano (основаный на параллельном
MN>>> прологе) — объектно-ориентированный, понятия типа отсутствует,
MN>>> понятие класса отстуствует, поэтому и наследование не может
MN>>> пониматься как отношение тип-подтип, объект представляется в виде
MN>>> бесконечного процесса вычисления продукционного правила (не
MN>>> спрашивайте что это такое — не отвечу).

hrg>>Я таки сильно извиняюсь, но какая от этого конкретная польза?


MN> Volcano используется для решения очень специфичных задач. Self

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

ага. Т.е. это специальные средства для частных решений?

Yury Kopyl aka hrg | Гордость мешает доходам!
Posted via RSDN NNTP Server 1.9 gamma
Re[40]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.11.04 09:15
Оценка:
Здравствуйте, hrg, Вы писали:

hrg>Mr. None -> "Re[38]: Суть полимор"


hrg>>>Я таки сильно извиняюсь, но какая от этого конкретная польза?


MN>> Volcano используется для решения очень специфичных задач. Self

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

hrg>ага. Т.е. это специальные средства для частных решений?


Про любой язык можно сказать, что это специальное средство для частных решений. Попробуйте написать семантическую сеть на языке C++ или Java — мягко говоря запаритесь, а на прологе ничего — быстро даже выходит (Volcano — это расширение пролога на объектно-ориентированную парадигму).
SmallTalk за счёт динамической типизации позволяет создавать быстрые прототипы будущих систем. Чтобы программа на плюсах просто скомпилировалась, необходимо чтобы выполнялись все правила типизации, все вызываемые методы были описаны и определены, все используемые классы существовали в коде. Для этого мы рисуем модели, по которым генерируем код, дабы быстрее пощюпать каркас. В Smalltalk`е всё это не нужно, вызываешь любой метод и совершенно по барабану, существует он или нет — если существует, то вызовется, если нет, то стрельнет исключение, когда-нибудь его допишут. Это существенно упрощает процесс разработки программы большой командой — нет необходимости описывать все пограничные интерфейсы до начала разработки, а потом следить за их изменениями.
Self не включает в себя паттерны проектирования в виде библиотеки или специальных средств языка, а наоборот паттерны проектирования предоставляют программисту на C++ возможности, доступные в Self`е. Скажем такая рапространённая идиома как коверт-письмо весьма часто используется при написании программ на плюсах, но с другой стороны — это не что иное, как модель наследования принятая в Self. В плюсах существуют техники являющиеся заплатками для не самой лучшей реализации объектной системы. В Self`е эти техники не нужны, потому как поддерживаются языком.
С другой стороны, если вам нужна система критичная по скорости то отдыхают и пролог, и Volcano, и Smalltalk, и Self, и Java и подойдёт вам только C++.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[41]: Суть полимор
От: hrg Россия  
Дата: 16.11.04 09:28
Оценка:
Mr. None -> "Re[40]: Суть полимор"

hrg>>ага. Т.е. это специальные средства для частных решений?


MN> Про любой язык можно сказать, что это специальное средство для

MN> частных решений. Попробуйте написать семантическую сеть на языке C++

MN> С другой стороны, если вам нужна система критичная по скорости то

MN> отдыхают и пролог, и Volcano, и Smalltalk, и Self, и Java и подойдёт
MN> вам только C++.

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

Yury Kopyl aka hrg | Только взял боец гитару, сразу — видно гармонист
Posted via RSDN NNTP Server 1.9 gamma
Re[42]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 16.11.04 10:04
Оценка:
Здравствуйте, hrg, Вы писали:

hrg>Mr. None -> "Re[40]: Суть полимор"


hrg>>>ага. Т.е. это специальные средства для частных решений?


MN>> Про любой язык можно сказать, что это специальное средство для

MN>> частных решений. Попробуйте написать семантическую сеть на языке C++

MN>> С другой стороны, если вам нужна система критичная по скорости то

MN>> отдыхают и пролог, и Volcano, и Smalltalk, и Self, и Java и подойдёт
MN>> вам только C++.

hrg>Вообщем получается картина — под конкретную задачу — конкретный

hrg>язык/технология.

Да так оно и есть и это правильно. Я регулярно сталкиваюсь с осознанием этой истины.

hrg>Но процентное распределение задач перевешивает в сторону

hrg>универсальных языков, которые используют большинство разработчиков.

Даже в стане "универсальных" языков существуют специализации. Не будете же вы операционную систему класса Unix писать на Java. Или web-приложение на C++. Я не говорю, что это не возможно, но ведь никому и в голову это не придёт, разве что в очень редких — исключительных случаях.
Да и универсальными эти языки назвать всё-таки сложно... Говорю же, попробуйте написать семантическую сеть на плюсах, вам очень быстро станет плохо, а это вполне рядовая и достаточно распространённая задача. А меж тем даже на прологе можно решать задачи, предназначеные как раз для плюсов и ассемблера: я один раз видел драйвер мыши написаный на ЧИСТОМ ПРОЛОГЕ!
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[43]: Суть полимор
От: hrg Россия  
Дата: 16.11.04 14:39
Оценка:
Mr. None -> "Re[42]: Суть полимор"

hrg>>Вообщем получается картина — под конкретную задачу — конкретный

hrg>>язык/технология.

MN> Да так оно и есть и это правильно. Я регулярно сталкиваюсь с

MN> осознанием этой истины.

Нуууу... за понимание

Yury Kopyl aka hrg | Хоббиты — маздай! Мордовия — фарева
Posted via RSDN NNTP Server 1.9 gamma
Re[39]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 16.11.04 20:05
Оценка: -1
Здравствуйте, Mr. None, Вы писали:

MN>Вот только не нало поясничать.. Я привёл вам ссылку на книгу, почитайте на досуге, узнаете очень много нового.

[flame mode on]
Не узнаю. Вы этой книге сделали отличную рекламу, чтобы ее избегать. "Классы имеют абстрактные типы данных." Групповуха какая-то.

MN>Интересно, чем может помочь теория типов для понимания языков в которых отсутствует понятие типа...

Да что вы? То есть там к строке можно прибавить число, и не вылетит ошибки ни компиляции ни выполнения?
То, что вы не хотите тип называть типом уже не ново, и само по себе мало интересно .

MN>Вся теория физических типов данных сводится к адресной арифметике,



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

...а уж знания теория множеств точно делают вас специалистом в ООП.

G>>Я-то как раз (в отличии от) говорю не о конкретной реализации, а о теории типа, близко к в варианту Лисков.

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

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

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

MN>Для начала будьте добры сформулируйте основные положения модели и докажите её полноту и непротиворечивость, а уж после этого бросайтесь определениями самой модели!

Уж вы определитесь, что вы хотите услышать сначала. Спрашивать, что вы имеете в виду под полнотой и непротиворечивостью в данном случае не буду — боюсь получить brain damage.

MN> Что не можете?

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

MN> И это понятно, потому что пока что ещё никому не удалось подвести под ООП строгую математическую базу — только философские заключения. В отличие от теории типов, которая прочно сидит на теории множеств.

Да и мне тоже это понятно, что скрывать . Вы меня подловили просто мастерски, конечно. Как я могу успеть что-то доказать, если вы еще на нажали кнопку "отправить"? Чистая победа, сдаюсь. Про то, что теория типов и есть та самая "база", здесь говорить как-то не к месту.

MN>Поэтому, например, ваше заявление о "соотвествии терминологии из теории типа и ООП" просто несостоятельно — они не могут соответствовать потому что терминология теории типов жёстко определена, а терминология ООП весьма расплывчата.

Послушать вас, похоже она до такой степени у вас расплывчата, что вы порой (тсс! шепотом ловите себя на мысли, что и сами даже толком не знаете что это такое!

MN>Это как с фракталами, все понимают, что такое фрактал, все могут привести несколько десятков реализаций, но никто не может дать чёткого определения.

MN>И если уж на то пошло, то "наследование, инкапсуляция, полиморфизм" — это очень узкая реализация. Есть более широкие определения, включающие в том числе и данную (НИП), я привёл ссылку на книгу, где расказывается об одной из них.
Там наверно что-то настолько неприличное написано, что вы об этом в форуме рассказывать стесняетесь. А я порнуху не читаю.
[flame mode off]

Ну что, продолжим дальше в том же духе?
Re[40]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 17.11.04 04:29
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Ну что, продолжим дальше в том же духе?


На оскорбления не отвечаю, делаю вывод — вам нечего сказать, поэтому вы перешли на личности и поливание грязью печатные издания, ссылки на которые так у меня просили. Мой вам совет, ознакомьтесь со следующими разделами математики: теория множеств, формальные модели и знаковые системы, алгебра логики, а уж потом вступайте в спор по этим понятиям.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[44]: Суть полимор
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 17.11.04 04:30
Оценка:
Здравствуйте, hrg, Вы писали:

hrg>Mr. None -> "Re[42]: Суть полимор"


hrg>>>Вообщем получается картина — под конкретную задачу — конкретный

hrg>>>язык/технология.

MN>> Да так оно и есть и это правильно. Я регулярно сталкиваюсь с

MN>> осознанием этой истины.

hrg>Нуууу... за понимание


Вобщем миру beer!
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[41]: Суть полимор
От: Gaperton http://gaperton.livejournal.com
Дата: 17.11.04 08:56
Оценка: -1
Здравствуйте, Mr. None, Вы писали:

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


G>>Ну что, продолжим дальше в том же духе?


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

Вы, как всегда, делаете неправильный вывод. Правильный — вы меня достали по самые печенки, и общаться с вами я не хочу. Как и отвечать на откровенный флейм. А ссылок на мукулатуру я вам и сам могу привести предостаточно, однако я почему-то дал ссылку на книгу Лисков.

MN>Мой вам совет, ознакомьтесь со следующими разделами математики: теория множеств, формальные модели и знаковые системы, алгебра логики, а уж потом вступайте в спор по этим понятиям.

Я кажется не просил у вас никаких советов. Мой вам совет — не лезьте к людям со своими советами.
Re[42]: Суть полимор
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.11.04 21:53
Оценка: 2 (2) :)
Здравствуйте, Gaperton, Вы писали:

G>Правильный — вы меня достали по самые печенки, и общаться с вами я не хочу.


Извини, но все же вмешаюсь. Не смотря на то кто тут прав я вижу, что тебя задевает банальное несгласие с товоей точкой зрения и ты готов на этом основании унижать человека. Ты очень тонко чувствуешь обиду в свою сторону и спокойно обижашь других. По-моему, это очень и оченьо плохо.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.