Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2011-09-18 16:46:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Линус Торвальдс не прав!
Надо б написать программу, в порядке упражнения и демонстрации возможностей ООП, решающую систему линейных уравнений. Пожалуй, можно даже и нелинейных, можно даже и диффренциальных. При правильном дизайне - какая, собственно, разница?

В идеале, система уравнений должна быть контейнером объектов, каждый из которых представляет собой уравнение, инкапсулирующий внутри себя значения коэффициетов (для линейных уравнений) или же вообще математическое выражение общего типа и наследующее некоторый стандартный интерфейс CBaseEquation. Т.е., подробнее, объекты эти сами по себе композитные, включают в себя объекты "левая" и "правая" часть уравнения, хотя для простоты можно считать правую часть уравнения равной нулю. Ну, положим, оставим левую часть, которая представляет из себя дерево операторов и операндов. Оператор может быть, опять же, объектом, имплементриующим некоторый стандартный интерфейс, будь это оператор сложения или, скажем, дифференцирования, ну а операнды - другие операторы, константы и переменные, опять же со своими интерфейсами. Еще, для повышения универсальности, сделаем "равенство" левой и правой части опять же, не встроенным жестко в систему, а некоторым объектом.

Теперь мы, значит, всё это объектно-ориентированно построим, вызовем метод "resolve" и объект "система уравнений" разошлёт подходящие сообщения каждому отдельному уравнению, те в свою очередь своим внутренним компонентам (разумеется, понадобятся call-backs, то есть отдельные уравнения могут запросить объект "система уравнений" данные о работе других уравнений, например. И всё заработает, т.е. система уравнений решится. Осталось только подобрать подходящую имплементацию каждого метода, но это уже частности, главное что мы построили более-менее вменяемый Объектно-ориентированный дизайн, а не свалили всё тупо в кучу, как делают программисты, не владеющие объектно-ориентированным подходом.

Между прочим, этот дизайн легко расширяется до задач линейного и нелинейного программирования, достаточно только сделать, чтобы объект "уравнение" поддерживал не только равенство нулю, но и неравенства (больше, больше или равно) и некоторое расширение вроде "максимизировать левую часть" (при этом значение правой части, которая у нас всегда равна нулю, можно вообще проигнорировать.

Т.е. практически только переопределением объектов производного класса мы решаем куда как больший класс задач, чем планировали изначально. Мне даже сложно представить потенциальную расширяемость подобной системы, она практически ничем не ограничена.


(Добавить комментарий)


[info]graynm@lj
2011-09-18 18:34 (ссылка)
Дадада, вот после таких дизайнов и появляются мифы, что С++ очень тормозной язык, а писать нужно на С(Java, Python, Haskell и т.д., нужное подчеркнуть). Хм, или это ты просто так стебёшься?

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 18:41 (ссылка)
на диспетчеризацию уйдет не так много времени по сравнению с собственно содержательной частью кода. Т.е. мифы мифами, а код этот будет работать сравнимо с имплементацией на С, и при этом быть куда как более универсальным. Кстати, на Java это тоже можно написать, Java вполне пригодна для ОО- стиля, у неё даже функция main объектно ориентирована.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]graynm@lj
2011-09-19 01:45 (ссылка)
Зависит от много чего.

Если говорить про обычные классы, то использование интерфейсов не бесплатно, и дробление на мелкие объекты только увеличивает стоимость. По поводу стоимости, например, есть тут: http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf

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

(Ответить) (Уровень выше)


[info]spamsink@lj
2011-09-18 21:03 (ссылка)
Осталось только подобрать подходящую имплементацию каждого метода

Представил себе метод Гаусса, написанный таким образом - вспомнил анекдот про гинеколога на курсах автомехаников.

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 21:11 (ссылка)
метод Гаусса для решения подобной системы не применим - он нарушает инкапсуляцию объектов.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-18 21:31 (ссылка)
Вот-вот. Поэтому если цель - решать систему методом Гаусса, то нужно не принципиальничать, а писать процедурно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 22:13 (ссылка)
Нет и не может быть цели "решать методом Гаусса". Цель - писать легко поддерживаемый и расширяемый, хорошо задизайненный объектно-ориентированный код. Уже в рамках этого дизайна можно реализовывать те или иные методы. Но, похоже, Гаусс (ксати, кто это? В какой фирме работает? Я кроме того, что есть метод Гаусса про него ничего не слышал) плохо изучал принципы объектного дизайна, так что его метод оказался не совместим с ООП.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 02:19 (ссылка)
А я, дурак, думал, что программы пишутся ради решения каких-то задач.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 11:59 (ссылка)
еще можно сказать, что задачи решаются ради зарабатывания денег, а деньги зарабатываются ради блек джека со шлюхами, поэтому давайте будем не делать нормальный объектно-ориентированный дизайн для решения системы уравнений, а пойдем и ограбим банк.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 12:05 (ссылка)
Так и до образа мыслей Райзера недалеко.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:30 (ссылка)
Райзер? кто это?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 12:44 (ссылка)
http://en.wikipedia.org/wiki/Hans_Reiser

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]cmm@lj
2011-09-19 13:07 (ссылка)
надо уже под это дело закон Годвина модифицировать.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 13:10 (ссылка)
Заметьте, говорить о нарушениях закона не я первый начал.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 15:06 (ссылка)
Заметьте, но отказ от написаения легко поддерживаемого и расширяемого, хорошо задизайненного объектно-ориентированный кода - это еще хуже, чем нарушение закона.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 15:41 (ссылка)
Это еще почему? Я не в бирюльки играю, а задачи решаю. Если решение задачи в требуемый срок с требуемыми затратами в свою очередь требует написания кода, не отвечающего одному (а именно ОО) или более (что, впрочем, маловероятно) перечисленным атрибутам - значит, так тому и быть.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 16:00 (ссылка)
в долгосрочной перспективе написание легко поддерживаемого и расширяемого ОО кода окупается - это всем известно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]spamsink@lj
2011-09-19 16:07 (ссылка)
Из того, что продажа черных бумеров окупается, вовсе не следует, что все бумеры должны быть черными.

(Ответить) (Уровень выше)


[info]kot_begemot@lj
2011-09-18 21:55 (ссылка)
В Линуксе есть объект типа file descriptor. На нём определены операции open(), read(), write(), close(), select(), etc.
Разные реализации могут оказаться файлами, сокетами, named pipes, character devices, etc.
И написать реализацию новой файловой системы всегда можно. То же самое - с новыми драйверами для (псевдо)устройств.
И всё это вполне в духе Торвальдса, и на C - C++ тут нафиг не сдался. VFS работает замечательно.
Более того, в некотором смысле всё ядро Линукса (да и любого Unix'а, и даже Windows) - предельно объектно-ориентировано (т.е. подсистемы общаются через строго описанные (почти абстрактные) интерфейсы, и каждая новая подсистема обязана реализовать их, если хочет нормально встроиться в систему.
Так что либо ты Линуса недопонял, либо у него просто не было времени разъяснять причины, по которым C++ в ядре - это очень плохая идея.
Кстати, по секрету, если выкинуть из C++ exceptions, RTTI и ещё кое-какие мелочи, для поддержки которых нужен libC, то вполне можно и для ядра писать на C++. Я это даже периодически делаю, хотя чем дальше, тем реже.

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 22:15 (ссылка)
при чем тут ядро? Линус принципиально против использования С++ в ЛЮБЫХ проектах.

(Ответить) (Уровень выше)


[info]panchul@lj
2011-09-19 01:34 (ссылка)
*** Кстати, по секрету, если выкинуть из C++ exceptions, RTTI и ещё кое-какие мелочи, для поддержки которых нужен libC, то вполне можно и для ядра писать на C++. ***

Но тогда C++ превращается просто в syntactic sugar. Ведь тогда вся разница между C и C++ - это разница между P_f (p, abc) и p->f (abc). Виртуальные функции реализуются с помощью указателей на функции, темплейты - препроцессором.

Впрочем я не против использования C++ как fancy препроцессора С. В конце-концов exceptions и RTTI - штуки сомнительной полезности.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]heller_i@lj
2011-09-19 04:34 (ссылка)
все перечисленное и на ассемблере можно написать, это не приравнивает ассемблер к плюсам.
Одни только конструкторы/деструкторы выводят плюсы за рамки "fancy препроцессора С".
И таких простых но очень полезных фич там довольно много.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dima_stat@lj
2011-09-20 06:35 (ссылка)
у борланда и ассемблер объектно-ориентированный был если чё.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-20 11:26 (ссылка)
у них даже менеджер оверлеев был объектно ориентирован, они так писали. )))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dima_stat@lj
2011-09-20 14:21 (ссылка)
Borland's Virtual Run-time Object-Oriented Memory Management (VROOMM) technology

окак.
у них наверно просто маркетологом ктонибудь из ихних программистов подрабатывал.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-20 14:33 (ссылка)
ага. оно самое. как им стыд глаза не выел.

(Ответить) (Уровень выше)


[info]thesz@lj
2011-09-19 03:26 (ссылка)
Чего здесь нет в принципе, так это 1) оценки производительности и 2) оценки точности.

Для реальных задач как раз они и важны. Можно сказать, что только они и важны.

А в таком неограниченном дизайне вполне можно налететь на O(N2) при реальной сложности O(N). Что я однажды и наблюдал, когда мне рассказывали о чём-то подобном. Диагонально-ленточная матрица постоянной ширины была скрыта за общим интерфейсом матрицы, в результате умножение вектора на неё имело сложность O(N2).

Не говоря уж о том, что решение задач линейного программирования не использует неравенства, а использует ограниченные переменные (>=0). И решение, кто же будет загнан в 0 (очередной шаг) принимается главным циклом, а не уравнением.

(Ответить)


[info]occuserpens@lj
2011-09-19 16:45 (ссылка)
Между нами девочками говоря, первая чума реальных проектов - сотни экранов нечленораздельных гуев. Вторая - тысячи директорий нечленораздельного кода.

(Ответить)