![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#41 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
На другом сайте размышляли об этом. В итоге пришли к выводам, что процедурное программирование использует функции возвращающие или не возвращающие значения, но и значение и аргументы являются данными.
В функциональном программировании, причём это всё применительно к C++ говорю, используются указатели на функции. То есть вместо данных передаются функции. Далее идёт обобщённое программирование (template), где как аргументы уже передаются типы. И под конец ООП - объектно-ориентированное программирование цель которого комбинировать данные и методы в виде единой сущности - объектов. Лично я описал это так: 1. процедурное - данные как аргументы 2. функциональное - функции как аргументы 3. обобщённое - типы как аргументы 4. объектно-ориентированное - создание типов Всё это можно использовать в разнообразных сочетаниях. К сожалению стандартные и расширенные библиотеки C++ пошли по пути обобщённого функционального и естественно процедурного программирования. ООП в них по сути отсутствует, а вместо классов для совместимости с Си задействованы структуры. Речь в данном случае идёт не просто о решении какой-либо задачи, а решения этой задачи другим способом и применяя другие парадигмы (ментальные модели) программирования. |
![]() |
![]() |
![]() |
#42 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]()
В С++ ООП вообще слабенькое. Давно хочу язык D посмотреть, но всё руки никак не дойдут, там вроде ООП посерьезнее сделали
![]() |
![]() |
![]() |
![]() |
#43 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Если рассматривать native С++, то ООП там совсем не слабенькое, но это касается языка. Ни Java, ни C# не превосходят этот язык, насчёт D не знаю, но судя по описаниям не думаю, что его стоит изучать ради написания реальных проектов.
Хотя кто знает, во всяком случае поддержка ООП в C++ одна из самых мощнейших среди языков программирования, а вот библиотеки используют эти особенности крайне мало или вообще не используют. Потому собственно говоря и родилась эта тема. |
![]() |
![]() |
![]() |
#44 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
Если да, то: 1) нет поддержки интерфейсов и в итоге приходится создавать некрасивые астрактные классы с пустыми виртуальными деструкторами 2) typedef - вводит в заблуждение (не ООП конечно, но в построениях абстракций может навредить) Допустим есть какой-то: typedef a b; и пытаемся перегрузить функцию для 2-х типов параметров: Код:
Придется "пустых" наследников видимо создавать в случае чего и зачем этот typedef нужен непонятно 3) RTTI неудобен. Попробуйте сделать коллекцию, у которой ключ - это тип, а значение - какое-то значение - не суть важно. Чтобы работать потом с ней можно было бы так: Код:
![]() ![]() Ну это из того, с чем я столкнулся на практике ЗЫ. Извиняюсь за оффтоп ![]() |
|
![]() |
![]() |
![]() |
#45 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
1. Какие классы напишешь, такими они и будут. Напишешь красиво, будет красиво, ну а в противном случае и так понятно.
2. Не используй typedef если он тебе не нужен. Как я понимаю наиболее удобное его применение в моментальной замене на нужный тип, когда в процессе происходят замены, в частности в кроссплатформенном программировании. Иными словами если одно имя типа заменяется на другой, то использование первого нецелесообразно в коде. 3. А по поводу третьего ничего сказать не могу, выглядит странно. Для начала нужно сообразить для чего нужен тип вместо ключа. |
![]() |
![]() |
![]() |
#46 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
![]() Код:
![]() Слишком много лишней информации, отвлекающей от самого интерфейса (все эти virtual, = 0,...). Кроме того, допустим, есть два интерфейса, у которых есть метод с одинаковым именем. Пытаемся реализовать оба интерфейса в одном классе (типа множественное наследование применяем). В итоге получится фигня, т.к. нельзя указать для какого именно интерфейса реализация метода идёт. Цитата:
Код:
|
||
![]() |
![]() |
![]() |
#47 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
У тебя тут упрощённый пример с IMy оринтированный на полиморфизм самих виртуальных чисто абстрактных методов. В наследовании можно ещё кое-что дописать. В целом же если не вдаваться в детали, а в C++ их не мало, так как это язык с избыточным программированием, то на любую проблему есть вполне простое решение.
На запись объектов в базу и из базы тоже есть, но там всё специфично и зависит от проекта. По мне так результаты зависят исключительно от программистов, и то что C++ не стесняет в выборе средств, а значит и в выборе неудачных стратегий развития программы, не является его недостатком. |
![]() |
![]() |
![]() |
#48 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
На C# легко это дело пишется: Код:
1) Не надо указывать модификаторы доступа (public, private,..) т.к. интерфейс и отвечает только за public 2) Никаких виртуалов и нулей. Коротко и ясно Надо будет как-нибудь протестить еще на таком примерчике: Код:
Цитата:
Ну лично меня С++ временами стесняет и иногда заставляет совершать лишние телодвижения ![]() |
||
![]() |
![]() |
![]() |
#49 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
В C# можно указать из какого интерфейса используется метод. Указание квалификаторов доступа можно опустить для открытых интерфейсов, но ведь бывают разные варианты использования, так что это не преимущество, совсем нет.
К тому же как писать и наследовать интерфейсы посвящены целые главые в некоторых книгах. В целом у них своя ниша использования. Что же касается абстрактных классов, то в C# они тоже странно срабатывают, а интерфейсы везде не поставишь. Да и вообще, интерфейсы ограничены в применении. Но если говорить глобально, то я не могу сказать, что C# лучше C++ в этом плане или наоборот. Для меня и то и другое одинаково. Я пытаюсь мыслить вне языков, хотя в поисках абстракций использую ООП, но опять же тоже вне языков. Важны сами идеи сочетания разных данных, функций, типов и прочего. |
![]() |
![]() |
![]() |
#50 | |||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
Допустим, есть клавиатура. Интерфейс для пользователя - это кнопочки клавиатуры и что там внутри и как устроено - не важно. Пользователь с клавиатурой общается через этот интерфейс и больше ему ничего не нужно. Для компа же интерфейс для той же клавиатуры - это уже собственно механизм, по которому с драйвером общение происходит. Тут уже до кнопочек и рычажков никакого дела, а главное уже как внутри это всё устроено. Абстрактный класс клавиатуры уже будет возможно реализовывать частично оба этих интерфейсы и что-то еще содержать. При реализации интерфейса, класс как бы говорит: "я могу вот это". При наследовании от другого класса скорее: "я являюсь вот этим". Таким образом, в интерфейсе, кроме модификатора public, по определению не может быть никакого другого. Для разных вариантов использования требуются разные интерфейсы, а иначе это уже будут не интерфейсы, а что-то другое. Цитата:
Ничего интерфейсы не ограничены, а как Вы сами сказали: "у них своя ниша использования". К сожалению, в плюсах этой ниши получается что нет. Цитата:
![]() Аналогично. Только неприятно, когда в итоге упираешься в невозможность нормальной реализации идеи из-за особенностей языка. |
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
в поисках органайзера | crazy horse | Софт | 6 | 11.02.2008 16:56 |
Нахождение совершенных чисел. Паскаль | NikLik | Помощь студентам | 3 | 23.11.2007 22:19 |