![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Для C++ существует огромное множество библиотек выполненных в различных техниках исполнения. Программисты создавшие их следовали разным ментальным моделям. К сожалению лично мне использование этих творений неудобно, хотя они и предоставляют весь нужный функционал. Похоже проблема в том, что сами программисты создавая свои творения мыслили в парадигме обобщённого функционального, вместо обобщённого объектно-ориентированного программирования.
Совершенную абстракцию создать не получится, потому что в мире нет ничего совершенного. Но если она достигнет хотя бы уровня в котором возможности языка будут использоваться в наибольшей степени, думаю этого будет вполне достаточно. Потому открываю тему микрообсуждений особенностей абстрактных ядер и их использования. Вряд ли у многих ли вызывает удивление, что алгоритмы вычисления контрольных сумм записываются в виде отдельных классов. Более того, они все идут от базы и имеют специальную виртуальную функцию, которая через единый потоковый интерфейс позволяет работать с различными источниками данных. Возникает вопрос, почему такие алгоритмы как MD5, SHA1, TTH и другие имеют право называться сущностью, тогда как арифметические операции: сложение, вычитание, умножение, деление, или тригонометрические: синус, тангенс, косинус и прочие, лишены возможности иметь собственную сущность и обречены находится в одном классе. Как гласит правило объектно-ориентированного программирования, плохо, когда в одном классе больше семи сущностей. А поскольку в стандартных математических классах, да и многих других, как правило лежит гораздо больше операций, получается простой и очевидный вывод, такое программирование относится к функциональному или в случае применения шаблонов обобщённому функциональному программированию, но уж никак не к объектно-ориентированному. Последний раз редактировалось MaTBeu; 03.05.2009 в 13:12. |
![]() |
![]() |
![]() |
#2 |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
![]()
Даже если математические сущности разбить по классам, арифметические, тригонометрические, комплексные и прочие - разве это придаст удобства при работе с ними? В данном случае не стоит говорить о принадлежности к обобщенному объектно-ориентированному программированию, ибо все можно, но не все НУЖНО приводить к объектам. Простой пример: как вам лучше будет писать?
Так Код:
Код:
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]()
Предположим у нас есть операция сложения. Вопрос как лучше её воспринимать, функцией, следуя парадигме функционального программирования или как сущность в объектно-ориентированном переопределяя однотипные методы.
В языке C++ существуют операторы, благодаря им есть возможность записывать последовательность определённых видов операций в кратком виде выражением, однако сути это не меняет. Для начала можно написать что-либо наподобие этого, все равно в последствии оно будет оптимизировано исключив повторные определения, потому что Addition и operator+ одно и тоже, а static Addition почти. Код:
|
![]() |
![]() |
![]() |
#4 | |
Регистрация: 05.05.2009
Сообщений: 9
|
![]() Цитата:
1) ассоциативность - т.е. например a+b+c+d+e+f можно считать как (a+b)+(c+d)+(e+f) что на больших массивах позволило бы распараллеливать вычисления 2) a+b=b+a что может использоваться только например чтобы тестировать реализацию для каких-нибудь новых типов, хотя например для double это всё равно не выполняется ![]() 3) сложение имеет обратную операцию - вычитание Можно попробовать выразить это через ООП, например пронаследовав операцию сложения от какой-нибудь абстрактной ассоциативной операции, добавить также классы, проверяющие, что некоторые операции - обратные по отношению к другим и т.д. Хотя в практических приложениях такие сложности для сложения помоему вряд ли понадобятся, по крайней мере на С++ |
|
![]() |
![]() |
![]() |
#5 | |||
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
![]() Цитата:
Цитата:
Цитата:
|
|||
![]() |
![]() |
![]() |
#6 | |||
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() Цитата:
Однако все равно появляется существенный повод задуматься, над масштабируемостью, балансировкой вычислительной мощности и так далее Цитата:
Цитата:
Код:
Код:
Код:
Вот интересные ресурсы: http://www.ietf.org/rfc.html http://www.w3.org/ Задокументировано множестов стандартов (например,w3.org именнованные цвета и т.д.). Последний раз редактировалось atomicxp; 05.05.2009 в 20:43. |
|||
![]() |
![]() |
![]() |
#7 |
Eclipse Foundation
Старожил
Регистрация: 19.09.2007
Сообщений: 2,604
|
![]()
Если вы делаете вычитание, то логично было бы сделать класс Substraction наследованным от Addition. Так как свойства у них одинаковые, у разности, просто один из аргументов - отрицательный, а сложение делается так же.
|
![]() |
![]() |
![]() |
#8 | |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() Цитата:
Здесь гораздо интереснее вопрос, каким же шаблоном проектирования реализовать антоним, то есть получать обратную операцию по текущей. |
|
![]() |
![]() |
![]() |
#9 | |
Регистрация: 05.05.2009
Сообщений: 9
|
![]()
Из-за округлений, но для этого просто при сравнении можно допускать маленькую разницу (епсилон).
Цитата:
Последний раз редактировалось mustaf0id; 05.05.2009 в 23:02. |
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 110
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
в поисках органайзера | crazy horse | Софт | 6 | 11.02.2008 16:56 |
Нахождение совершенных чисел. Паскаль | NikLik | Помощь студентам | 3 | 23.11.2007 22:19 |