Автор Тема: Почему наследование не может быть основой ОС?  (Прочитано 54699 раз)

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #90 : Январь 31, 2013, 01:14:18 pm »
Не получится... Дело в том, что "засунуть в библиотеку" можно простой алгоритм... а если этот алгоритм требует активной работы с полями класса/объекта? То как быть? Представлять все нужные поля классов в виде формальных параметров? А обращения к другим методам класса, заменять обращением к библиотечным подпрограммам?.. каждый раз передавая огромное количество параметров?.. И Вы считаете, что такая практика способна снизить количество ошибок?..
А это будет объектно-ориентированная библиотека.
Например, если у строки и блоба есть что-то общее в хранении данных, то возникнет некий класс технического назначения BinaryStorage, допустим, и мы будем его использовать и внутри реализации строки, и внутри реализации блоба.
Да, всё бы ничего... Но объект типа pool имел порядка 15 полей (если мне память не изменяет), и Вы предлагаете передавать эти данные в виде формально/фактических параметров в каждую подпрограмму Вашей библиотеки?.. А как же... инкапсуляция?..

Цитировать
И вот... (дальнейшие рассуждения я опускаю, Вы с ними знакомы)... логически пришли к классам/объектам, где данные и код инкапсулированы. Теперь надо обеспечить расширяемость классов, так, чтобы повторно не переписывать уже отлаженный код. Появилось наследование... А Вы говорите: "Долой наследование! Давайте каждый раз будем переписывать код!".
Здесь Вы пропустили логический этап: сначала расширяемость классов нужна, чтобы выражать отношения "род-вид" (и обеспечивать полиморфизм, расширяемость системы, когда я могу всюду, где нужна "рыба", дать и хоть "селёдку", хоть "камбалу"). То, что в Симуле при этом сразу же решили через это проблему и повторного использования кода из базовых классов, не означает автоматически, что это лучшее решение. Позже появился подход (не уверен, кто его начал первым пропагандировать - возможно всё же Гамма и Ко. в книге "Паттерны ООП"), рекомендующий устанавливать отношения наследования между абстрактными классами, а классы, реализующие эти абстракции, делать "финальными" и недоступными "по имени".
Да не пропускал я никаких отношений "род-вид" - надуманно это... IMHO. Речь шла о логическом развитии идей структурного программирования в ООП.

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

Финальные классы, которые содержат реализацию, ничего не знают друг о друге (я могу жонглировать разными реализациями хоть прямо во время выполнения, просто "воткнув" другую фабрику, а попробуйте Вы подмените на ходу реализацию String или Blob. Даже попробуйте просто поддерживать 2-3 реализации String. У Вас возникнет 2-3 версии ОДНОГО КЛАССА, а значит - ОДНОГО ФАЙЛА. Бррр. А у меня эти 2-3 реализации будут в разных финальных классах и жить будут параллельной жизнью).
Подмена одних классов другими происходит очень просто. Я уже говорил о полиморфизме на уровне классов/объектов.

Если применять наследование реализации в случае с атрибутами, то, например, та самая техническая абстракция BinaryStorage, являющаяся "общим знаменателем" и для String, и для Blob, просто не возникнет. Её код будет "вмазан" в абстракцию "Атрибут переменной длины" (вмазан в абстрактное понятие!!!).
Зачем?.. А если появится ещё один класс атрибута переменного размера... снова будете ручками "вмазывать"? Для чего эти проблемы? Какую задачу Вы решаете... таким образом?

А так этот BinaryStorage становится полезным техническим средством и, заметьте, совершенно независимым от других абстракций Вашей СУБД. Вы его можете отделить от своей СУБД и "подарить" кому-нибудь, кто делает другую СУБД :)
Эта абстракция имеет смысл в рамках данной иерархии, вне иерархии она не имеет смысла...

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

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

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Почему наследование не может быть основой ОС?
« Ответ #91 : Январь 31, 2013, 02:43:26 pm »
В Аде, сколь я помню, есть полноценные Storage_Pool'ы. В том числе там есть ограничения, что ссылки у тех кто сидит внутри такого пула могут быть только на тех кто в том же пуле. Это проверка статическая, компилятором.

По сути, это такие отдельные кучи/кучки внутри программы.
Про ссылки только внутри пула не понял. Вот есть класс Телефонов, и есть класс Звонков. У каждого свой кэш для повторного использования объектов. Каждый кэш создаёт и удаляет объекты за O(1). Во время работы Звонки имеют указатели на Телефоны, а Телефоны имеют указатели на Звонки. На Аде это нельзя будет написать через какие-то там полноценные Storage_Pool'ы?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #92 : Январь 31, 2013, 03:04:11 pm »
В Аде, сколь я помню, есть полноценные Storage_Pool'ы. В том числе там есть ограничения, что ссылки у тех кто сидит внутри такого пула могут быть только на тех кто в том же пуле. Это проверка статическая, компилятором.

По сути, это такие отдельные кучи/кучки внутри программы.
Про ссылки только внутри пула не понял. Вот есть класс Телефонов, и есть класс Звонков. У каждого свой кэш для повторного использования объектов. Каждый кэш создаёт и удаляет объекты за O(1). Во время работы Звонки имеют указатели на Телефоны, а Телефоны имеют указатели на Звонки. На Аде это нельзя будет написать через какие-то там полноценные Storage_Pool'ы?
Не могу четко ответить на вопрос. Нужно поковыряться.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #93 : Январь 31, 2013, 03:05:32 pm »
Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается.
Лисков - это она.
И иностранные женские фамилии в русском языке не склоняются по падежам.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #94 : Январь 31, 2013, 04:03:04 pm »
И иностранные женские фамилии в русском языке не склоняются по падежам.

Очень может быть, что на самом деле она все-таки Лискова :) Например, в штатах дочка в семье Лисковых будет фигурировать в свидетельстве о рождении как "Лисков". Просто потому, что англоязычным бюрократам трудно объяснить, что фамилия может склоняться и надо записать "Лискова".

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #95 : Январь 31, 2013, 05:10:18 pm »
И иностранные женские фамилии в русском языке не склоняются по падежам.

Очень может быть, что на самом деле она все-таки Лискова :) Например, в штатах дочка в семье Лисковых будет фигурировать в свидетельстве о рождении как "Лисков". Просто потому, что англоязычным бюрократам трудно объяснить, что фамилия может склоняться и надо записать "Лискова".

Девичья фамилия у неё вообще Губерман, предки по отцу -- выходцы из России.
Лисков по мужу, так что видимо не стоит склонять (как, например, Ада Лавлейс или там Джейн Остин)...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #96 : Январь 31, 2013, 05:15:06 pm »
Пусть в нашей СУБД вдруг появляется тип "целое неограниченной длины". Куда мы его засунем? По своему интерфейсу это - целое число. Операции к нему применяются такие же, как к числу. Но по реализации это - атрибут переменной длины.
Куда же мы его отнесём?
И таких случаев много, когда, казалось бы, "гармоничное" дерево наследования рушится при введении какого-то класса, который попадает и туда, и туда. Это может происходить даже и при наследовании абстрактных классов (по признаку общности интерфейса). Но если в дерево наследования подмешан признак общности реализации, то это будет обязательно.
Мы засунули в дерево наследования развилку "атрибут постоянной длины" - "атрибут переменной длины" в первую очередь не по принципу того, что такие атрибуты похожи "снаружи", а потому, что нам удобно обобщить их по реализации, будет класс, в который "засунуть" общий код.
И получили почву для будущих противоречий.

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

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #97 : Январь 31, 2013, 05:18:14 pm »
И иностранные женские фамилии в русском языке не склоняются по падежам.
Так это же русская фамилия. Вообще говоря, иностранность слова определяется не гражданством.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #98 : Январь 31, 2013, 05:31:25 pm »
И иностранные женские фамилии в русском языке не склоняются по падежам.
Так это же русская фамилия. Вообще говоря, иностранность слова определяется не гражданством.

Варвара Лискова (а то и Лисицына) :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #99 : Январь 31, 2013, 05:33:05 pm »
И иностранные женские фамилии в русском языке не склоняются по падежам.

Так это же русская фамилия. Вообще говоря, иностранность слова определяется не гражданством.

Лисков -- русская фамилия? о_О Да такого слова -- "лиск(а)" -- в русском языке даже нету.

http://dic.academic.ru/dic.nsf/brokgauz_efron/61637/Лисков
Цитировать
Лисков
(Христиан-Людвиг Liscow) — нем. сатирик (1701-1760).
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #100 : Январь 31, 2013, 05:41:20 pm »
... если бы для фиксированных целых чисел понадобилось бы выполнение операций присущих строкам (конкатенация, поиск (битовой) подстроки и т.п.), то эти операции были бы просто наложены на существующие классы целых чисел.
Каким образом эти операции были бы наложены? С помощью наследования (получение нового класса целых чисел с дополнительными методами)?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #101 : Январь 31, 2013, 06:01:12 pm »
... если бы для фиксированных целых чисел понадобилось бы выполнение операций присущих строкам (конкатенация, поиск (битовой) подстроки и т.п.), то эти операции были бы просто наложены на существующие классы целых чисел.
Каким образом эти операции были бы наложены? С помощью наследования (получение нового класса целых чисел с дополнительными методами)?

Вот тоже хотел об этом спросить.
Правда, варианты у меня другие были -- реализация интерфейсов, реализующие арифметические операции и операции работы со строками,
или же множественное наследование.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #102 : Январь 31, 2013, 06:20:50 pm »
... если бы для фиксированных целых чисел понадобилось бы выполнение операций присущих строкам (конкатенация, поиск (битовой) подстроки и т.п.), то эти операции были бы просто наложены на существующие классы целых чисел.
Каким образом эти операции были бы наложены? С помощью наследования (получение нового класса целых чисел с дополнительными методами)?
Наложены - реализованы в классах.
Наверное, надо отметить, что СУБД создавалась на ассемблере (TASM), было это в начале 90-х... Объектность и многое другое реализовывались через макросы. Позже появился TASM 3.0 с поддержкой ООП, но он был очень глючный. Более или менее работоспособный TASM 3.1 появился ещё позже, когда проектом уже не занимались.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #103 : Январь 31, 2013, 07:09:24 pm »
Да, всё бы ничего... Но объект типа pool имел порядка 15 полей (если мне память не изменяет), и Вы предлагаете передавать эти данные в виде формально/фактических параметров в каждую подпрограмму Вашей библиотеки?.. А как же... инкапсуляция?..
Так большая часть этих полей и пойдёт внутрь "технического объекта", видимо.

Цитировать
Они нужны поскольку имеют смысл в предметной области, а не потому, что они мне понравились...
....
Иерархия строится на основе... смысла... (или замысла).
А почему класс "числовые" является подклассом "постоянной длины"? Насколько это основано "на смысле"?
Разве для пользователя СУБД важно, что он "постоянной длины"?
Это разные классификационные признаки - способ реализации и какие-то ещё категории атрибутов (числовые и др.) А они оказываются в одном дереве.
А Вася будет разрабатывать СУБД на базе какого-нибудь движка хранения - и для него окажется существенным деление не на переменной длины и постоянной длины, а на "реализованы в движке" - "будут реализовываться мной". И он это тоже впендючит в Самое Главное Дерево Классов своей программы.
Таким образом, способ реализации начинает влиять на дерево главных абстракций, что не есть хорошо.

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

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #104 : Январь 31, 2013, 07:24:51 pm »
Если бы стояла задача обеспечить максимально быстрое, гибкое, эффективное... преобразование данных, то иерархия была бы иной. Объектная иерархия классов - это инструмент, которым надо пользоваться по назначению, исходя из задач и условий.

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

Я предпочитаю иметь отдельно дерево абстрактных классов - и отдельно его реализации. И технические абстракции уровня реализации.

Кстати, я так и не понял, как именно Вы будете поступать, если у Вас для методов, реализованных в классе "Атрибут переменной длины", появится несколько вариантов реализации. Как Вы будете оформлять и управлять этими вариантами.