Login
как правильно программировать?
17.09.09 22:44
Я работаю над проэктом, который писали множество программистов уже лет 15 как, и до сих пор вставляем новые возможности, исправляем старые(вносим новые :) ) ошибки.
Глядя на исходные тексты, точнее на их халтурность, я не могу понять: толи некоторые(большинство из них) программисты не владеют языком С++, толи они специально пишут запутанно, чтобы только они и могли там разобраться. Некоторые из этих программистов до сих пор работают на фирме, и стиль их нисколько не поменялся.
Например, копируют куски кода, вместо того чтобы оформить в виде функции и вызывать её. Используют #definы или константы, там где по смыслу надо использовать enum. В качестве битовых масок тоже используют DWORD, long - но только не enum! И частенько встречаешь "волшебные" константы прямо в коде без каких либо комметрариев, типа 0x00200. И попробуй пойми, чего сие значит. (Разобраться конечно можно, но сходу не понятно, и нужно тратить время чтобы понять).
Я сейчас много меняю таких мест, вместо DWORD(и т.п.) ставлю конкретный тип (enum), глядя на который сразу видно какие значения могут быть.
А вы как думаете, нужно ли писать код интуитивно понятный (а стало быть лёгкий в поддержке и для других программистов) или лучше шифровать (чтобы другие попотели пока поймут)?
Дело в том что если ты успеешь написать кучу "зашифрованного" кода, то на фирме ты будешь незаменимый человек, единственный способный делать в нём изменения :).
Глядя на исходные тексты, точнее на их халтурность, я не могу понять: толи некоторые(большинство из них) программисты не владеют языком С++, толи они специально пишут запутанно, чтобы только они и могли там разобраться. Некоторые из этих программистов до сих пор работают на фирме, и стиль их нисколько не поменялся.
Например, копируют куски кода, вместо того чтобы оформить в виде функции и вызывать её. Используют #definы или константы, там где по смыслу надо использовать enum. В качестве битовых масок тоже используют DWORD, long - но только не enum! И частенько встречаешь "волшебные" константы прямо в коде без каких либо комметрариев, типа 0x00200. И попробуй пойми, чего сие значит. (Разобраться конечно можно, но сходу не понятно, и нужно тратить время чтобы понять).
Я сейчас много меняю таких мест, вместо DWORD(и т.п.) ставлю конкретный тип (enum), глядя на который сразу видно какие значения могут быть.
А вы как думаете, нужно ли писать код интуитивно понятный (а стало быть лёгкий в поддержке и для других программистов) или лучше шифровать (чтобы другие попотели пока поймут)?
Дело в том что если ты успеешь написать кучу "зашифрованного" кода, то на фирме ты будешь незаменимый человек, единственный способный делать в нём изменения :).
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 18.09.09 10:13
in Antwort anly 17.09.09 22:44
Может они выросли из asm программистов а привычки остались!?
1. не факт что enum лутше для битовых масок.
2. Тем более если работать например с MAPI. Там все маски в DWORD
ну и при программирование для CE платформ битовая маска например комбинаций дней недели в DWORD/long будет менее ресурсоемкой чем enum. Да и вообще как бы принято что битовые комбинации integer а не enum.
01000101 для меня более предпочтителен чем (Days::Monday | Days::Friday | Days::Sunday)
да и вообще в спецификациях языка ето не оговорено, так что тут все на любителя.
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
Так что разбиение на функции или нет должно быть отдельно продумано для каждого проекта и т.д. и т.п.
Ну и само собой чем больше вы напишите код под себя тем дольше будет привязан заказчик к вам, что является весьма не хилым фактором в программирование. :)
P.S.: Все выше сказанное вообще фиолетово при написание калькулятора :)
1. не факт что enum лутше для битовых масок.
2. Тем более если работать например с MAPI. Там все маски в DWORD
ну и при программирование для CE платформ битовая маска например комбинаций дней недели в DWORD/long будет менее ресурсоемкой чем enum. Да и вообще как бы принято что битовые комбинации integer а не enum.
01000101 для меня более предпочтителен чем (Days::Monday | Days::Friday | Days::Sunday)
да и вообще в спецификациях языка ето не оговорено, так что тут все на любителя.
В ответ на:
Например, копируют куски кода, вместо того чтобы оформить в виде функции и вызывать её.
Например, копируют куски кода, вместо того чтобы оформить в виде функции и вызывать её.
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
Так что разбиение на функции или нет должно быть отдельно продумано для каждого проекта и т.д. и т.п.
Ну и само собой чем больше вы напишите код под себя тем дольше будет привязан заказчик к вам, что является весьма не хилым фактором в программирование. :)
P.S.: Все выше сказанное вообще фиолетово при написание калькулятора :)
NEW 18.09.09 16:44
man встроенные функции(inline)
а за копипасту расстреливать на месте надо.
in Antwort Erfurt_2005_12 18.09.09 10:13
В ответ на:
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
man встроенные функции(inline)
а за копипасту расстреливать на месте надо.
NEW 18.09.09 16:53
in Antwort anly 17.09.09 22:44
нужно ли писать код интуитивно понятный
-----
Другой писать и не надо. И документацию методик не забывать...
то на фирме ты будешь незаменимый человек
------
Не будешь. Через годик-другой забудешь об том как именно это было шифровано и будешь ляпать ляпы один за другим... или изменения займут столько же времени, сколько у любого другого.
-----
Другой писать и не надо. И документацию методик не забывать...
то на фирме ты будешь незаменимый человек
------
Не будешь. Через годик-другой забудешь об том как именно это было шифровано и будешь ляпать ляпы один за другим... или изменения займут столько же времени, сколько у любого другого.
NEW 18.09.09 16:55
На таком языке как плюсы трудно писать интуитивно понятный код :-)
Проблема в том что пишут на коленке, не продумывая архитектуру .
А константы использовать или перечисления - это мелочи.
in Antwort anly 17.09.09 22:44
В ответ на:
А вы как думаете, нужно ли писать код интуитивно понятный (а стало быть лёгкий в поддержке и для других программистов) или лучше шифровать (чтобы другие попотели пока поймут)?
А вы как думаете, нужно ли писать код интуитивно понятный (а стало быть лёгкий в поддержке и для других программистов) или лучше шифровать (чтобы другие попотели пока поймут)?
На таком языке как плюсы трудно писать интуитивно понятный код :-)
Проблема в том что пишут на коленке, не продумывая архитектуру .
А константы использовать или перечисления - это мелочи.
NEW 18.09.09 17:05
А что такое " при компилирование оптимизация вызовов будет построена оптимально" ?
компилятор обычно с этим справляется лучше чем программист.
И почему по-твоему копипаста лучше чем встроеннье функции ?
in Antwort Erfurt_2005_12 18.09.09 16:59
В ответ на:
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут.
В ответ на:
про inline речи не было
про inline речи не было
А что такое " при компилирование оптимизация вызовов будет построена оптимально" ?
компилятор обычно с этим справляется лучше чем программист.
И почему по-твоему копипаста лучше чем встроеннье функции ?
NEW 18.09.09 17:20
in Antwort Erfurt_2005_12 18.09.09 10:13
1. не факт что enum лутше для битовых масок.
------
Лучше. Поименованные константы всегда будут лучше... ибо иначе их не вводили бы.
2. Тем более если работать например с MAPI. Там все маски в DWORD
------
Ну и? Проинициализируй заданные enum-константы... работа конечно не из приятных, но делать ее надо однажды...
01000101 для меня более предпочтителен чем
------
Ну и чем он для тебя лучше? Простой вопрос - есть две системы нумерации дней: европейская - с Понедельника... американская - с Воскресения... В принципе есть и еще одна - ирландская, для рабочих дней - со Среды... Как у тебя будет с порядком единичек при переделке?
бональный loop разбитый на кучу функций - ето еще куда хуже
------
Пссс... Была бы функциональность функций правильной и цикл легко читаемым/понимаемым, а куда там управление будет Juvp'ать - пофиг...
Ну и само собой чем больше вы напишите код под себя тем дольше будет привязан заказчик к вам
------
Чем больше ты успеваешь производить кода, тем больше у тебя заказчиков и тем чаще они к тебе возвращаются...
Ну подумай сам - пусть есть задачка объемом этак с 200Мб, под 1000 форм, 4-5 тыс типов объектов...
ты месяц роешься в хитром коде, пытаясь что-то поправить как надо заказчику...
или
за 10 минут делаешь нужную заказчику правку и через 20 минут генерации и компиляции готов передать заказчику требуемое...
Куда он пойдет?
------
Лучше. Поименованные константы всегда будут лучше... ибо иначе их не вводили бы.
2. Тем более если работать например с MAPI. Там все маски в DWORD
------
Ну и? Проинициализируй заданные enum-константы... работа конечно не из приятных, но делать ее надо однажды...
01000101 для меня более предпочтителен чем
------
Ну и чем он для тебя лучше? Простой вопрос - есть две системы нумерации дней: европейская - с Понедельника... американская - с Воскресения... В принципе есть и еще одна - ирландская, для рабочих дней - со Среды... Как у тебя будет с порядком единичек при переделке?
бональный loop разбитый на кучу функций - ето еще куда хуже
------
Пссс... Была бы функциональность функций правильной и цикл легко читаемым/понимаемым, а куда там управление будет Juvp'ать - пофиг...
Ну и само собой чем больше вы напишите код под себя тем дольше будет привязан заказчик к вам
------
Чем больше ты успеваешь производить кода, тем больше у тебя заказчиков и тем чаще они к тебе возвращаются...
Ну подумай сам - пусть есть задачка объемом этак с 200Мб, под 1000 форм, 4-5 тыс типов объектов...
ты месяц роешься в хитром коде, пытаясь что-то поправить как надо заказчику...
или
за 10 минут делаешь нужную заказчику правку и через 20 минут генерации и компиляции готов передать заказчику требуемое...
Куда он пойдет?
NEW 18.09.09 17:52
in Antwort Chipolino 18.09.09 16:55
На таком языке как плюсы трудно писать интуитивно понятный код :-)
------
Угу... на VB6 - лЯХко... прямо сейчас ищут писателя для _нового_ проекта...
------
Угу... на VB6 - лЯХко... прямо сейчас ищут писателя для _нового_ проекта...
NEW 18.09.09 20:49
in Antwort Murr 18.09.09 17:52
как-то писал конечный автомат, который чё-та там парсил. На VB. Странное дело - не плевался.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 18.09.09 23:03
in Antwort voxel3d 18.09.09 20:49
Конечный автомат, который парсит там чего-то, в зависимости от того, чего он там парсит
- LR(0), LL(1) или LARL - занимает 10-15 строк... если, конечно, не писать что-то типа
рекурсивного спуска и называть его автоматом...
Я уже описывал один VB6 проект... точнее - одну его форму, весом в ~250Кб... там мешанина
из управления элементами формы, локального пересчета значений и кусков SQL. Там никто
не в состоянии гарантировать, что изменения корректны...
Из того, что Я видел в других проектах и что ваял сам на Аксесе, система программрования
(плюс сроки и область применения) вынуждает лепить именно такой код. Изменить методику
можно, но это совсем не дешево...
- LR(0), LL(1) или LARL - занимает 10-15 строк... если, конечно, не писать что-то типа
рекурсивного спуска и называть его автоматом...
Я уже описывал один VB6 проект... точнее - одну его форму, весом в ~250Кб... там мешанина
из управления элементами формы, локального пересчета значений и кусков SQL. Там никто
не в состоянии гарантировать, что изменения корректны...
Из того, что Я видел в других проектах и что ваял сам на Аксесе, система программрования
(плюс сроки и область применения) вынуждает лепить именно такой код. Изменить методику
можно, но это совсем не дешево...
NEW 19.09.09 00:01
А вот константы или перечисления - это совсем не мелочи, если говорить о программах посложнее Хелоуворда, хоть в пару тысяч файлов.
Я предпочитаю использовать конкретный тип(т.е. определённый мной) там где это возможно. DWORD это не конкретный тип, это может быть всё что угодно. Например параметр функции (DWORD dwMode) ни о чем не говорит. Какие значения может принимать dwMode? Может быть все возможные, т.е. от 0 до 0xFFFFFFFF ? Где искать константы или дэфайны которые могут быть использованы в качестве фактического параметра? Попробуй найди в сотне заголовков! Понять параметр можно только анализируя код функции, а если он там не используется(а только передаётся дальше), может придётся полазить в 20 других функций по стеку пока увидишь подстановку конкретной константы (что может быть и не возможным, если напр. она считана из файла), или придётся шагать внутрь 20ти других функций куда передается этот параметр пока не доберёшся до кода зависящего от этого dwMode. Другое дело если это не DWORD, а enum TMode. Глянув на него сразу видишь смысл этого типа, диапазон значений. К тому же мной опредёлённому типу можно присвоить значение только этого типа и никакого другого(если конечно я не разрешу), что есть гарантия от случайной ошибки типа: вместо дня недели подставил месяц.
in Antwort Chipolino 18.09.09 16:55
В ответ на:
На таком языке как плюсы трудно писать интуитивно понятный код :-)
Проблема в том что пишут на коленке, не продумывая архитектуру .
А константы использовать или перечисления - это мелочи.
мне нравится с++. А на каком языке проще писать понятный код?На таком языке как плюсы трудно писать интуитивно понятный код :-)
Проблема в том что пишут на коленке, не продумывая архитектуру .
А константы использовать или перечисления - это мелочи.
А вот константы или перечисления - это совсем не мелочи, если говорить о программах посложнее Хелоуворда, хоть в пару тысяч файлов.
Я предпочитаю использовать конкретный тип(т.е. определённый мной) там где это возможно. DWORD это не конкретный тип, это может быть всё что угодно. Например параметр функции (DWORD dwMode) ни о чем не говорит. Какие значения может принимать dwMode? Может быть все возможные, т.е. от 0 до 0xFFFFFFFF ? Где искать константы или дэфайны которые могут быть использованы в качестве фактического параметра? Попробуй найди в сотне заголовков! Понять параметр можно только анализируя код функции, а если он там не используется(а только передаётся дальше), может придётся полазить в 20 других функций по стеку пока увидишь подстановку конкретной константы (что может быть и не возможным, если напр. она считана из файла), или придётся шагать внутрь 20ти других функций куда передается этот параметр пока не доберёшся до кода зависящего от этого dwMode. Другое дело если это не DWORD, а enum TMode. Глянув на него сразу видишь смысл этого типа, диапазон значений. К тому же мной опредёлённому типу можно присвоить значение только этого типа и никакого другого(если конечно я не разрешу), что есть гарантия от случайной ошибки типа: вместо дня недели подставил месяц.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 19.09.09 00:18
В идеале, если кусочку кода (это может быть и одна строчка) можно присвоить имя (которое учавствует в мышлении программиста при описании алгоритма), то это участок кода должен быть оформлен в виде функции. Даже если вызов её встречается только один раз.
Если напр. 5 строк программы, которые можно было оформить в виде функции, всё же(как зачастую и бывает) являются просто строками некой большой функции, то через год какой нибудь программист вставит внутрь этих строчек свой код, а через год внутрь этих еще и т.д. Тогда каша получается - всё перемешано. А я такие каши вижу частенько.
in Antwort Erfurt_2005_12 18.09.09 10:13
В ответ на:
бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут
для большинства задач лучше не думать об оптимизации, лучше думать о понятности кода. Потому что пользователю всё равно: отреагирует программа на нажатие энтера за 1милисекуну или за 10. Только там где это критично стоит думать. Но экономить на функциях (если применение их оправдано большей понятность программы) не стоит никогда. Ведь их можно и inline сделать.бональный loop разбитый на кучу функций - ето еще куда хуже. не факт что при компилирование оптимизация вызовов будет построена оптимально. так что процессор прыгающий на хз какие интервалы вместо sbs не есть гут
В идеале, если кусочку кода (это может быть и одна строчка) можно присвоить имя (которое учавствует в мышлении программиста при описании алгоритма), то это участок кода должен быть оформлен в виде функции. Даже если вызов её встречается только один раз.
Если напр. 5 строк программы, которые можно было оформить в виде функции, всё же(как зачастую и бывает) являются просто строками некой большой функции, то через год какой нибудь программист вставит внутрь этих строчек свой код, а через год внутрь этих еще и т.д. Тогда каша получается - всё перемешано. А я такие каши вижу частенько.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 19.09.09 01:02
Я выбираю плюсы если есть выбор только между c и c++.
Последнее время плотно занимаюсь питоном, вот на нем точно проще писать понятный код.
А также до кучи из мэйнстрима : шарп, джава.
Хотя плохому танцору...
А вот такой подход избавляет от случайных ошибок приведения целых чисел к перечислению.
class Month {
public:
static Month Januar() { return Month(1); }
....
static Month December() { return Month(12); }
private:
explicit Month(int);
};
in Antwort anly 19.09.09 00:01
В ответ на:
мне нравится с++. А на каком языке проще писать понятный код?
мне нравится с++. А на каком языке проще писать понятный код?
Я выбираю плюсы если есть выбор только между c и c++.
Последнее время плотно занимаюсь питоном, вот на нем точно проще писать понятный код.
А также до кучи из мэйнстрима : шарп, джава.
Хотя плохому танцору...
В ответ на:
Другое дело если это не DWORD, а enum TMode. Глянув на него сразу видишь смысл этого типа, диапазон значений. К тому же мной опредёлённому типу можно присвоить значение только этого типа и никакого другого(если конечно я не разрешу), что есть гарантия от случайной ошибки типа: вместо дня недели подставил месяц.
Другое дело если это не DWORD, а enum TMode. Глянув на него сразу видишь смысл этого типа, диапазон значений. К тому же мной опредёлённому типу можно присвоить значение только этого типа и никакого другого(если конечно я не разрешу), что есть гарантия от случайной ошибки типа: вместо дня недели подставил месяц.
А вот такой подход избавляет от случайных ошибок приведения целых чисел к перечислению.
class Month {
public:
static Month Januar() { return Month(1); }
....
static Month December() { return Month(12); }
private:
explicit Month(int);
};
NEW 19.09.09 11:09
"Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения."
что это значит? типа dynamic_cast в c++?
Но мне кажется что компилятор должен как можно больше делать во время компиляции(поменьше оставлять на время выполнения). т.е. выявлять ошибки несоотверствия типов.
Когда пишешь свою программу, во время написания можно всё протестировать. Но когда лазишь в огромной программе, которую не ты писал, и делаешь много изменений - нет возможности всё протестировать. Здесь безопастно полагаться только на компилятор, что он сообщит если что не так. А оставлять выявление проблемы на время выполнения - я бы не рискнул.
В с++ я предпочитаю и dynamic_cast не пользоваться(только за редкими исключениями). А в питоне получается только эта возможность и есть. Что то мне это не нравится...
in Antwort Chipolino 19.09.09 01:02
В ответ на:
Последнее время плотно занимаюсь питоном, вот на нем точно проще писать понятный код.
питон никогда еще не пробовал. вот почитал чуть чуть и увидел это:Последнее время плотно занимаюсь питоном, вот на нем точно проще писать понятный код.
"Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения."
что это значит? типа dynamic_cast в c++?
Но мне кажется что компилятор должен как можно больше делать во время компиляции(поменьше оставлять на время выполнения). т.е. выявлять ошибки несоотверствия типов.
Когда пишешь свою программу, во время написания можно всё протестировать. Но когда лазишь в огромной программе, которую не ты писал, и делаешь много изменений - нет возможности всё протестировать. Здесь безопастно полагаться только на компилятор, что он сообщит если что не так. А оставлять выявление проблемы на время выполнения - я бы не рискнул.
В с++ я предпочитаю и dynamic_cast не пользоваться(только за редкими исключениями). А в питоне получается только эта возможность и есть. Что то мне это не нравится...
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 19.09.09 11:57
in Antwort anly 19.09.09 11:09
"Полиморфизм (все функции виртуальные)."
копаясь в проэкте на работе обнаружил бездумное использование virtual функций. Программист 'просто так' сделал кучу функций виртуальными. На самом деле большинство из этих функций не использовались как виртуальные, т.е. наследники их не переопределяли. Дело в том что каждая виртуальная функция увеличивает трудность поддержки кода. Если я хочу изменить аргументы виртуальной функции, то мне нужно быть внимательным чтобы изменить его и у всех переобределённых функций наследников. А если я не замечу у насленика такую функцию - я сделал ошибку, которую компилятор не обнаружит, а вылезет она только во время работы.
Поэтому "все функции виртуальные" считаю недостатком языка.
копаясь в проэкте на работе обнаружил бездумное использование virtual функций. Программист 'просто так' сделал кучу функций виртуальными. На самом деле большинство из этих функций не использовались как виртуальные, т.е. наследники их не переопределяли. Дело в том что каждая виртуальная функция увеличивает трудность поддержки кода. Если я хочу изменить аргументы виртуальной функции, то мне нужно быть внимательным чтобы изменить его и у всех переобределённых функций наследников. А если я не замечу у насленика такую функцию - я сделал ошибку, которую компилятор не обнаружит, а вылезет она только во время работы.
Поэтому "все функции виртуальные" считаю недостатком языка.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 19.09.09 19:54
Ты рассуждаешь о предмете о котором не имеешь ни малейшего представления .
dynamic typing
in Antwort anly 19.09.09 11:09
В ответ на:
что это значит? типа dynamic_cast в c++?
Но мне кажется что компилятор должен как можно больше делать во время компиляции(поменьше оставлять на время выполнения). т.е. выявлять ошибки несоотверствия типов.
Когда пишешь свою программу, во время написания можно всё протестировать. Но когда лазишь в огромной программе, которую не ты писал, и делаешь много изменений - нет возможности всё протестировать. Здесь безопастно полагаться только на компилятор, что он сообщит если что не так. А оставлять выявление проблемы на время выполнения - я бы не рискнул.
В с++ я предпочитаю и dynamic_cast не пользоваться(только за редкими исключениями). А в питоне получается только эта возможность и есть. Что то мне это не нравится...
что это значит? типа dynamic_cast в c++?
Но мне кажется что компилятор должен как можно больше делать во время компиляции(поменьше оставлять на время выполнения). т.е. выявлять ошибки несоотверствия типов.
Когда пишешь свою программу, во время написания можно всё протестировать. Но когда лазишь в огромной программе, которую не ты писал, и делаешь много изменений - нет возможности всё протестировать. Здесь безопастно полагаться только на компилятор, что он сообщит если что не так. А оставлять выявление проблемы на время выполнения - я бы не рискнул.
В с++ я предпочитаю и dynamic_cast не пользоваться(только за редкими исключениями). А в питоне получается только эта возможность и есть. Что то мне это не нравится...
Ты рассуждаешь о предмете о котором не имеешь ни малейшего представления .
dynamic typing
NEW 19.09.09 20:11
А зачем менять аргументы ? Просто перегрузи и используй свой вариант.
Еще раз повторяю, ты не имеешь понятия о чем рассуждаешь.
in Antwort anly 19.09.09 11:57
В ответ на:
Дело в том что каждая виртуальная функция увеличивает трудность поддержки кода. Если я хочу изменить аргументы виртуальной функции, то мне нужно быть внимательным чтобы изменить его и у всех переобределённых функций наследников.
Дело в том что каждая виртуальная функция увеличивает трудность поддержки кода. Если я хочу изменить аргументы виртуальной функции, то мне нужно быть внимательным чтобы изменить его и у всех переобределённых функций наследников.
А зачем менять аргументы ? Просто перегрузи и используй свой вариант.
В ответ на:
Поэтому "все функции виртуальные" считаю недостатком языка.
Поэтому "все функции виртуальные" считаю недостатком языка.
Еще раз повторяю, ты не имеешь понятия о чем рассуждаешь.
NEW 19.09.09 23:10
Тогда объясни.
in Antwort Chipolino 19.09.09 20:11, Zuletzt geändert 19.09.09 23:18 (anly)
В ответ на:
Еще раз повторяю, ты не имеешь понятия о чем рассуждаешь.
разумеется я рассуждаю только на основе моих знаний с++. Разве в питоне виртуальность не такая как в с++? разве в питоне динамическое приведение типа не такое как dynamic_cast в с++(за исключением того что в с++ это нужно писать явно, а в питоне это делается интерпретатором неявно, за кулисами)?Еще раз повторяю, ты не имеешь понятия о чем рассуждаешь.
Тогда объясни.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 19.09.09 23:16 
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
in Antwort Chipolino 19.09.09 20:11
В ответ на:
А зачем менять аргументы ? Просто перегрузи и используй свой вариант.
интересный вопрос: зачем? А зачем менять аргументы ? Просто перегрузи и используй свой вариант.

Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 01:25
in Antwort anly 19.09.09 23:16
...то 21й наследник будет использовать именно её...
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.
NEW 20.09.09 08:46
Так и быть объясню вам, далеко от плюсов отошедших.
Во-первых, везёт вам что занимаетесь такими программами, что есть возможность всё протестировать. Во вторых, даже тест не гарантирует отсутствие ошибок. Особенно, если тестирует не девелопер, а тестировщик, который исходники не видит, да и частенько языка не понимает. Но даже если девелопер тестирует, тоже гарантии нет. Ошибка может проявиться только после изменений, косвенно влияющих на данный код или зависящих от данного кода.
Во вторых пример.(только по существу вопроса, т.е. виртуальности. не обращайте внимание например на утечки памяти, не хочу отвлекать от сути).
У базового класса есть виртуальная функция, которая не пустая, а что-то делает. И некоторые наследники не переопределяют её. А некоторые наследники переопределяют.
class A
{
virtual void myfun(int n);
}
class B : A
{
}
class C : A
{
virtual void myfun(int n);
}
// ..... и еще 25 наследников ...
main()
{
A* p = new B;
p->myfun(76); // вызов A::myfun()
p = new C;
p->myfun(33); // вызов С::myfun()
}
Прошло сто лет и надо добавить параметр в функцию. Этот параметр обрабатывается только в функции одного из наследников (которого я здесь даже не показал), функция базового класса(А) новый параметр просто игнорирует, класса С - тоже.
class A
{
virtual void myfun(int n, bool b);
}
в A добавил, и во всех других наследниках, которые переопределяют эту функцию, кроме С. в C не добавил, не доглядел.
В main подправим, это даже компилятор потребует.
main()
{
A* p = new B;
p->myfun(76, false); // вызов A::myfun()
p = new C;
p->myfun(33, false); // вызов A::myfun() !!!!!!!!!!!!!!!!!!! ошибка !!!!!
}
in Antwort Murr 20.09.09 01:25, Zuletzt geändert 20.09.09 08:57 (anly)
В ответ на:
...то 21й наследник будет использовать именно её...
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.
да вот мат часть кажись я получше знаю. ...то 21й наследник будет использовать именно её...
------
21-й наследник будет использовать ту, которая определена правилами.
В случае Плюсов, дай бог памяти, это будет последняя из определенных в предках соответсвующих факическому типу объекта.
Учи матчасть.
Что и есть ошибка, которая может проявиться
------
Она "проявляется" при тестировании. По этому вопросу, опять таки - учи матчасть.

Во-первых, везёт вам что занимаетесь такими программами, что есть возможность всё протестировать. Во вторых, даже тест не гарантирует отсутствие ошибок. Особенно, если тестирует не девелопер, а тестировщик, который исходники не видит, да и частенько языка не понимает. Но даже если девелопер тестирует, тоже гарантии нет. Ошибка может проявиться только после изменений, косвенно влияющих на данный код или зависящих от данного кода.
Во вторых пример.(только по существу вопроса, т.е. виртуальности. не обращайте внимание например на утечки памяти, не хочу отвлекать от сути).
У базового класса есть виртуальная функция, которая не пустая, а что-то делает. И некоторые наследники не переопределяют её. А некоторые наследники переопределяют.
class A
{
virtual void myfun(int n);
}
class B : A
{
}
class C : A
{
virtual void myfun(int n);
}
// ..... и еще 25 наследников ...
main()
{
A* p = new B;
p->myfun(76); // вызов A::myfun()
p = new C;
p->myfun(33); // вызов С::myfun()
}
Прошло сто лет и надо добавить параметр в функцию. Этот параметр обрабатывается только в функции одного из наследников (которого я здесь даже не показал), функция базового класса(А) новый параметр просто игнорирует, класса С - тоже.
class A
{
virtual void myfun(int n, bool b);
}
в A добавил, и во всех других наследниках, которые переопределяют эту функцию, кроме С. в C не добавил, не доглядел.
В main подправим, это даже компилятор потребует.
main()
{
A* p = new B;
p->myfun(76, false); // вызов A::myfun()
p = new C;
p->myfun(33, false); // вызов A::myfun() !!!!!!!!!!!!!!!!!!! ошибка !!!!!
}
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 10:31
dynamic_cast работает только с полиморфными типами и связь с питоном вообще отсутствует.
Ознакомься с темой, почитай о языках с динамической типизацией.
in Antwort anly 19.09.09 23:10
В ответ на:
разумеется я рассуждаю только на основе моих знаний с++. Разве в питоне виртуальность не такая как в с++? разве в питоне динамическое приведение типа не такое как dynamic_cast в с++(за исключением того что в с++ это нужно писать явно, а в питоне это делается интерпретатором неявно, за кулисами)?
Тогда объясни.
разумеется я рассуждаю только на основе моих знаний с++. Разве в питоне виртуальность не такая как в с++? разве в питоне динамическое приведение типа не такое как dynamic_cast в с++(за исключением того что в с++ это нужно писать явно, а в питоне это делается интерпретатором неявно, за кулисами)?
Тогда объясни.
dynamic_cast работает только с полиморфными типами и связь с питоном вообще отсутствует.
Ознакомься с темой, почитай о языках с динамической типизацией.
NEW 20.09.09 10:37
Это говорит о хреновом проектировании.
Потом ты звонишь всем клиентам и просишь поменять сигнатуры функций в клиентском коде ? :-)
in Antwort anly 19.09.09 23:16
В ответ на:
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
Это говорит о хреновом проектировании.
Потом ты звонишь всем клиентам и просишь поменять сигнатуры функций в клиентском коде ? :-)
20.09.09 10:49
Спасибо, о Гуру ! :-)
Хоть вся твоя проблема кажется надуманной, но можно сделать вот так.
class superclass{
virtual void myfun(int n, bool b)=0;
};
class A:superclass{};
С помощью компилятора найдешь все классы.
in Antwort anly 20.09.09 08:46
В ответ на:
Так и быть объясню вам, далеко от плюсов отошедших.
Так и быть объясню вам, далеко от плюсов отошедших.
Спасибо, о Гуру ! :-)
В ответ на:
Прошло сто лет и надо добавить параметр в функцию. Этот параметр обрабатывается только в функции одного из наследников (которого я здесь даже не показал), функция базового класса(А) новый параметр просто игнорирует, класса С - тоже.
Прошло сто лет и надо добавить параметр в функцию. Этот параметр обрабатывается только в функции одного из наследников (которого я здесь даже не показал), функция базового класса(А) новый параметр просто игнорирует, класса С - тоже.
Хоть вся твоя проблема кажется надуманной, но можно сделать вот так.
class superclass{
virtual void myfun(int n, bool b)=0;
};
class A:superclass{};
С помощью компилятора найдешь все классы.
NEW 20.09.09 12:55
in Antwort anly 20.09.09 08:46
везёт вам
------
Не нам везет - куЁм свое везение сами. Частенько это стоит большего количества
работы...
может проявиться только после изменений
-----
А после изменений тестировать не надо?
ошибка !!!!!
-----
Это не ошибка - это именно то, что ты написал.
И с подобными описками тоже можно бороться. Например, можно, изначально,
еще в правилах кодинга, задать требование об отсутствии использования встроенных
типов в качестве параметров и тогда это выглядит так:
class MyFuncParam { ... }
class A
{
virtual void myfun(MyFuncParam& n);
}
...etc...
тут любые изменения не затрагивают базовый код, независимо от изменений содержимого
MyFuncParam.
------
Не нам везет - куЁм свое везение сами. Частенько это стоит большего количества
работы...
может проявиться только после изменений
-----
А после изменений тестировать не надо?
ошибка !!!!!
-----
Это не ошибка - это именно то, что ты написал.
И с подобными описками тоже можно бороться. Например, можно, изначально,
еще в правилах кодинга, задать требование об отсутствии использования встроенных
типов в качестве параметров и тогда это выглядит так:
class MyFuncParam { ... }
class A
{
virtual void myfun(MyFuncParam& n);
}
...etc...
тут любые изменения не затрагивают базовый код, независимо от изменений содержимого
MyFuncParam.
NEW 20.09.09 13:05
in Antwort Chipolino 20.09.09 10:49
С помощью компилятора найдешь все классы.
-----
Что-то меня сомнения берут. Бо, чистую виртуальную функцию обязан определять _хотя бы один_ из потомков. Как только один определит - ситуация становится эквивалентной первичной - может быть опущена в потомках.
-----
Что-то меня сомнения берут. Бо, чистую виртуальную функцию обязан определять _хотя бы один_ из потомков. Как только один определит - ситуация становится эквивалентной первичной - может быть опущена в потомках.
NEW 20.09.09 13:22
В отличии от C++ питон выкинет исключение, а не дёрнет подходящий метод из цепочки наследования сверху. Которой и не будет вовсе. Просто, надо писать на питоне, а не на C++ с синтаксисом питона.
Наследование применяется в двух случаях - для создания функциональности в предке, чтобы не дублировать её в потомке и для реализации полиморфизма: имея ссылку или указатель на базовый класс, вызывать методы определённые в потомке. Для первой цели в питоне применяют наследование, для второй - нет.
Полиморфизм реализуют так:
in Antwort anly 19.09.09 23:16, Zuletzt geändert 20.09.09 13:27 (voxel3d)
В ответ на:
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
Представь себе бывает нужно поменять. Поменяешь у базового класса, поменяешь у 20ти наследников, а у 21го недоглядел, не поменял. И тогда, если у базового функция не абстрактная, то 21й наследник будет использовать именно её, а не свою специфическую. Что и есть ошибка, которая может проявиться сразу, а может и через год.
В отличии от C++ питон выкинет исключение, а не дёрнет подходящий метод из цепочки наследования сверху. Которой и не будет вовсе. Просто, надо писать на питоне, а не на C++ с синтаксисом питона.
Наследование применяется в двух случаях - для создания функциональности в предке, чтобы не дублировать её в потомке и для реализации полиморфизма: имея ссылку или указатель на базовый класс, вызывать методы определённые в потомке. Для первой цели в питоне применяют наследование, для второй - нет.
Полиморфизм реализуют так:
class Оne:
"One"
def write(self):
print "one"
class Тwo:
"Two"
def write(self):
print "two"
def writer(dest):
dest.write(" variable ")
print "start"
obj = Оne()
writer(obj)
obj = Тwo()
writer(obj)
Классы One и Two никак не обязаны быть связаными между собой, единственное, что требуется, наличие метода write(). Если мы меняем сигнатуру где-то в одном месте, а в другом забываем это сделать:
class Оne:
"One"
def write(self, var):
print "one " + var
то вызов:
def writer(dest):
dest.write(" variable ")
obj = Тwo()
writer(obj)
сгенерирует исключение:
Traceback (most recent call last):
File "test.py", line 21, in <module>
writer(obj)
File "test.py", line 12, in writer
dest.write(" variable ")
TypeError: write() takes exactly 1 argument (2 given)
Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 13:27
in Antwort anly 17.09.09 22:44
писать надо короткоги ясно - не должно быть ситуаций, когда один класс делает работу всего приложения через стотыщь мильонов функций-членов, или одна функция на 10 тыс строк выполняет всю работу определенной подсистемы. Тут важно грамотное проектирование, и желательно сразу с поддержкой unit-тестов...
Очень хорошой в смысле писания "правильного" кода является книжка Code Complete - там много полезных советов на такие темы.
унаследованный код тоже можно рефакторить, избавляться от дублирования кода, разбивать длиные функции на меньшие, например, центральная функция является точкой входа, и определяет логику вычислений, но из нее зовуться только другие функции, которые и выполняют всю работу.
Очень хорошой в смысле писания "правильного" кода является книжка Code Complete - там много полезных советов на такие темы.
унаследованный код тоже можно рефакторить, избавляться от дублирования кода, разбивать длиные функции на меньшие, например, центральная функция является точкой входа, и определяет логику вычислений, но из нее зовуться только другие функции, которые и выполняют всю работу.
NEW 20.09.09 14:24
Если в потомке, определена, то в потомках потомка конечно не надо.
Но в его примере все наследуют от одного 'A'.
in Antwort Murr 20.09.09 13:05
В ответ на:
Что-то меня сомнения берут. Бо, чистую виртуальную функцию обязан определять _хотя бы один_ из потомков. Как только один определит - ситуация становится эквивалентной первичной - может быть опущена в потомках.
Что-то меня сомнения берут. Бо, чистую виртуальную функцию обязан определять _хотя бы один_ из потомков. Как только один определит - ситуация становится эквивалентной первичной - может быть опущена в потомках.
Если в потомке, определена, то в потомках потомка конечно не надо.
Но в его примере все наследуют от одного 'A'.
NEW 20.09.09 14:41
Виртуальность хорошая вещь, но использовать её нужно только там где без нее не обойтись. И в шею гнать надо программистов которые 'на всякий случай' делают каждую функцию виртуальной. А питон сразу делает это, даже тебя не спросит...
in Antwort Chipolino 20.09.09 10:37, Zuletzt geändert 20.09.09 14:55 (anly)
В ответ на:
Это говорит о хреновом проектировании.
дык, а я о чем говорю! Но выбирать уже не приходится. Ты пришел на работу и у тебя есть хреново спроектированная программа. Те люди которые её писали уже здесь не работают. И твоя задача перепроектировать её получше. Эту задачу вообщето тебе начальство не ставит, начальству надо чтоб притензий от заказчиков не было и не более. Но тебе в этом дерьме ковыряться и поэтому ты сам хочешь навести там порядок, на свой страх и риск. Так вот каждая виртуальная функция усложняет эту задачу. Т.к. ошибку, которую я привёл в примере, можно обнаружить только в результате тестирования. А протестировать огромную программу не всегда возможно. Просто хотя бы из за отсутствия времени. Там где нет
виртуальности - проще, т.к. об ошибке сообщит компилятор, и ты никуда не денешся - подправиш. Это говорит о хреновом проектировании.
Виртуальность хорошая вещь, но использовать её нужно только там где без нее не обойтись. И в шею гнать надо программистов которые 'на всякий случай' делают каждую функцию виртуальной. А питон сразу делает это, даже тебя не спросит...
В ответ на:
Потом ты звонишь всем клиентам и просишь поменять сигнатуры функций в клиентском коде ? :-)
не понял. клиенты - простые пользователи и ни о чём вышеописанном не подозревают.Потом ты звонишь всем клиентам и просишь поменять сигнатуры функций в клиентском коде ? :-)
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 14:49
in Antwort voxel3d 20.09.09 13:22
В ответ на:
В отличии от C++ питон выкинет исключение, а не дёрнет подходящий метод из цепочки наследования сверху
это тоже ошибка выполнения, которая обнаруживается только тестированием.В отличии от C++ питон выкинет исключение, а не дёрнет подходящий метод из цепочки наследования сверху
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 15:01
Unittest входит в базовую библиотеку питона, юнит-тестирование выявляет эту ошибку (в С++, кстати, нет). Проверка же типов / сигнатур в рантайме - особенность динамических языков.
in Antwort anly 20.09.09 14:49
В ответ на:
это тоже ошибка выполнения, которая обнаруживается только тестированием.
это тоже ошибка выполнения, которая обнаруживается только тестированием.
Unittest входит в базовую библиотеку питона, юнит-тестирование выявляет эту ошибку (в С++, кстати, нет). Проверка же типов / сигнатур в рантайме - особенность динамических языков.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 15:13
Разве этот тест не сам программист должен написать? Разве всегда возможно написать тест который обнаружит любые ошибки? А тест для теста тоже надо писать? ведь и в тесте может ошибка оказаться. Я не против юниттестов, наверняка очень хорошая практика, но не панацея, 100процентной гарантии нет.
in Antwort voxel3d 20.09.09 15:01
В ответ на:
Unittest входит в базовую библиотеку питона, юнит-тестирование выявляет эту ошибку (в С++, кстати, нет).
для меня, как незнатока питона, это звучит несколько "волшебно". Т.е. юниттест "чудестным" образом обнаружит ошибку. Unittest входит в базовую библиотеку питона, юнит-тестирование выявляет эту ошибку (в С++, кстати, нет).
Разве этот тест не сам программист должен написать? Разве всегда возможно написать тест который обнаружит любые ошибки? А тест для теста тоже надо писать? ведь и в тесте может ошибка оказаться. Я не против юниттестов, наверняка очень хорошая практика, но не панацея, 100процентной гарантии нет.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 15:24
in Antwort anly 20.09.09 15:13, Zuletzt geändert 20.09.09 15:27 (voxel3d)
Это не "любая ошибка". Программа 100% валится на попытке вызова метода - соответственно, независимо от того, что именно будет проверять юнит-тест, ошибка будет выявлена.
Тесты, да, пишет сам программист.
Это у тебя с твоим вариантом полиморфизма нет, а в тут есть.
Тесты, да, пишет сам программист.
В ответ на:
Я не против юниттестов, наверняка очень хорошая практика, но не панацея, 100процентной гарантии нет.
Я не против юниттестов, наверняка очень хорошая практика, но не панацея, 100процентной гарантии нет.
Это у тебя с твоим вариантом полиморфизма нет, а в тут есть.

Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 15:34
Я это говорю только чтобы подчеркнуть что ошибки компиляции гораздо безопаснее ошибок выполнения.
in Antwort voxel3d 20.09.09 15:24
В ответ на:
Это у тебя с твоим вариантом полиморфизма нет, а в питоне есть.
чтобы тест выявил ошибку нужно в тесте вызвать эту функцию. а ежели не вызвал? т.е. не написал именно этого теста. что тогда? (может не ты, а тот кто писал этот тест много лет назад)Это у тебя с твоим вариантом полиморфизма нет, а в питоне есть.
Я это говорю только чтобы подчеркнуть что ошибки компиляции гораздо безопаснее ошибок выполнения.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 16:01
in Antwort anly 20.09.09 14:41, Zuletzt geändert 20.09.09 16:04 (Simple)
http://www.amazon.de/Working-Effectively-Legacy-Robert-Martin/dp/0131177052
ps
Эта цель должна быть поставлена сверху, иначе можно сразу забить. У меня та же проблема, и время на наведение порядка уже выделено. Надо грамотно работать с начальством ;)
ps
В ответ на:
Но тебе в этом дерьме ковыряться и поэтому ты сам хочешь навести там порядок, на свой страх и риск.
Но тебе в этом дерьме ковыряться и поэтому ты сам хочешь навести там порядок, на свой страх и риск.
Эта цель должна быть поставлена сверху, иначе можно сразу забить. У меня та же проблема, и время на наведение порядка уже выделено. Надо грамотно работать с начальством ;)
NEW 20.09.09 16:29
in Antwort anly 20.09.09 15:34
Ошибки выявляемые на этапе компиляции безопаснее, только все разговоры об этом в сообществе С++ сильно преувеличивают значимость статической типизации. 

Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 16:34
ну не знаю, может стоит профессию поменять :-)
in Antwort anly 20.09.09 15:34
В ответ на:
чтобы тест выявил ошибку нужно в тесте вызвать эту функцию. а ежели не вызвал? т.е. не написал именно этого теста. что тогда? (может не ты, а тот кто писал этот тест много лет назад)
чтобы тест выявил ошибку нужно в тесте вызвать эту функцию. а ежели не вызвал? т.е. не написал именно этого теста. что тогда? (может не ты, а тот кто писал этот тест много лет назад)
ну не знаю, может стоит профессию поменять :-)
NEW 20.09.09 17:02
in Antwort anly 20.09.09 15:34
а ежели не вызвал?
-----
Почитай, хоть на ознакомительном уровне, документацию к NUnit\JUnit
и посмотри примеры.
что тогда?
-----
Тогда тебя уволят. Ибо сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код...
-----
Почитай, хоть на ознакомительном уровне, документацию к NUnit\JUnit
и посмотри примеры.
что тогда?
-----
Тогда тебя уволят. Ибо сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код...
NEW 20.09.09 17:06
in Antwort Murr 20.09.09 17:02
З.Ы. Ответь себе на простой вопрос - Какой код является правильным? - отчень многие
вопросы отпадут.
вопросы отпадут.
NEW 20.09.09 17:07
in Antwort anly 17.09.09 22:44
Преймущество С++ перед Java, Python и иже с ними это скорость. Если скорость не важна, то выбирать нужно тот язык, реализация на котором проще для данной задачи. В противном случае, использование любых конструкций, снижающих скорость выполнения программы, не приветствуется. В частности, виртуальных функции в С++.
NEW 20.09.09 17:37
Речь идёт о ситуации когда проектирование, тесты и сам код были написаны задолго до тебя! И написано не лучшим образом.
in Antwort Murr 20.09.09 17:02
В ответ на:
Тогда тебя уволят. Ибо сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код...
редко встретишь такое непонимание!Тогда тебя уволят. Ибо сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код...
Речь идёт о ситуации когда проектирование, тесты и сам код были написаны задолго до тебя! И написано не лучшим образом.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 17:50
это спорный и далеко не однозначный вопрос
Если скорость важна, то обычно покупают больше железа. А выбирать нужно тот язык который знаешь.
Всё ИМХО
in Antwort pkrasnop 20.09.09 17:07
В ответ на:
Преймущество С++ перед Java, Python и иже с ними это скорость.
Преймущество С++ перед Java, Python и иже с ними это скорость.
это спорный и далеко не однозначный вопрос

В ответ на:
Если скорость не важна, то выбирать нужно тот язык, реализация на котором проще для данной задачи.
Если скорость не важна, то выбирать нужно тот язык, реализация на котором проще для данной задачи.
Если скорость важна, то обычно покупают больше железа. А выбирать нужно тот язык который знаешь.
Всё ИМХО
NEW 20.09.09 19:06
в этом то и проблема, но это скорее это проблема не только самих программеров а скорее всего и самой организации в целом и прежде всего проэкт менеджмента.
среднестатистическому проэктлидеру, который допустим мало разбираетется в программировании, наверняка пофиг как и что там реализовано и насколько рационально, для него важно что продукт работает, т.е. цели и задачи выполнены и прежде всего что все сделано в срок.
Когда требуется новые фичерс для готового продукта, то все исходят из того что готовый продукт уже работает и испробыван временем,
какието изменения в нем самом, пусть даже и необходимые, череваты тем что:
а.) эти измененя могут повлиять на сам исходный продукт.
б) на изменеение и тестерование требудется время и ресурсы, которые незапланированы.
в) соответсвенно их останется меньше для реализации самой новой функции.
Хорошо если руководство понимает что нужно навести порядок в проекте, и выделяет на это время и ресурсы, а если это делать на свой страх и риск то так или иначе, останишся крайним.
in Antwort anly 17.09.09 22:44
В ответ на:
Я работаю над проэктом, который писали множество программистов уже лет 15 как, ...
Я работаю над проэктом, который писали множество программистов уже лет 15 как, ...
в этом то и проблема, но это скорее это проблема не только самих программеров а скорее всего и самой организации в целом и прежде всего проэкт менеджмента.
среднестатистическому проэктлидеру, который допустим мало разбираетется в программировании, наверняка пофиг как и что там реализовано и насколько рационально, для него важно что продукт работает, т.е. цели и задачи выполнены и прежде всего что все сделано в срок.
Когда требуется новые фичерс для готового продукта, то все исходят из того что готовый продукт уже работает и испробыван временем,
какието изменения в нем самом, пусть даже и необходимые, череваты тем что:
а.) эти измененя могут повлиять на сам исходный продукт.
б) на изменеение и тестерование требудется время и ресурсы, которые незапланированы.
в) соответсвенно их останется меньше для реализации самой новой функции.
Хорошо если руководство понимает что нужно навести порядок в проекте, и выделяет на это время и ресурсы, а если это делать на свой страх и риск то так или иначе, останишся крайним.
все что вы сделаете в интернете может быть использовано против вас!
NEW 20.09.09 19:11
Это однозначный вопрос. Чем "ближе" я к железу, тем больше у меня возможностей для оптимизации.
С Web разработками такой подход часто имеет место быть. А для решения вычислительно сложных задач требуется не только количественный рост, но и качественный.
in Antwort katran76 20.09.09 17:50
В ответ на:
это спорный и далеко не однозначный вопрос
это спорный и далеко не однозначный вопрос
Это однозначный вопрос. Чем "ближе" я к железу, тем больше у меня возможностей для оптимизации.
В ответ на:
Если скорость важна, то обычно покупают больше железа. А выбирать нужно тот язык который знаешь.
Если скорость важна, то обычно покупают больше железа. А выбирать нужно тот язык который знаешь.
С Web разработками такой подход часто имеет место быть. А для решения вычислительно сложных задач требуется не только количественный рост, но и качественный.
NEW 20.09.09 19:24
а сколько человек способны реализовать все или хотя бы большинство возможностей оптимизации, т.е. обладают опытом и знаниями для этого?
Сейчас ты это сформулировал как "возможность" и тут ты конечно прав, возможностей больше. Но разработка на языке высокого уровня позволяет достичь результата (и поддерживать готовый продукт) с меньшими затратами ресурсов. Если рассматривать только скорость работы готовой программы то это сферический конь в вакууме.
Такой подход имеет место быть везде
Т.е. плюсы - это наиболее качественное из имеющихся?
in Antwort pkrasnop 20.09.09 19:11
В ответ на:
Это однозначный вопрос. Чем "ближе" я к железу, тем больше у меня возможностей для оптимизации.
Это однозначный вопрос. Чем "ближе" я к железу, тем больше у меня возможностей для оптимизации.
а сколько человек способны реализовать все или хотя бы большинство возможностей оптимизации, т.е. обладают опытом и знаниями для этого?
Сейчас ты это сформулировал как "возможность" и тут ты конечно прав, возможностей больше. Но разработка на языке высокого уровня позволяет достичь результата (и поддерживать готовый продукт) с меньшими затратами ресурсов. Если рассматривать только скорость работы готовой программы то это сферический конь в вакууме.
В ответ на:
С Web разработками такой подход часто имеет место быть
С Web разработками такой подход часто имеет место быть
Такой подход имеет место быть везде

В ответ на:
А для решения вычислительно сложных задач требуется не только количественный рост, но и качественный.
А для решения вычислительно сложных задач требуется не только количественный рост, но и качественный.
Т.е. плюсы - это наиболее качественное из имеющихся?
NEW 20.09.09 19:24
in Antwort anly 20.09.09 17:37
редко встретишь такое непонимание!
-----
Или наоборот. Понимание. Причем до уровня, когда сначала оценивается то,
с чем придется работать и только по результатам принимается решение по
извечному вопросу - Что делать?
задолго до тебя!
-----
Разумеется.
И написано не лучшим образом.
-----
Вот это уже вопрос к тебе.
Когда брался за работу как оценивал Сколько Работы нужно выполнить?
Насколько имеющийся код соответствует документации?
Как поставлен процесс разработки?
Что вообще от тебя ждут?
Уже сколько раз приходилось отказываться от работы просто потому, что
объем необходимой работы был много больше, чем заявляемый при найме.
-----
Или наоборот. Понимание. Причем до уровня, когда сначала оценивается то,
с чем придется работать и только по результатам принимается решение по
извечному вопросу - Что делать?
задолго до тебя!
-----
Разумеется.
И написано не лучшим образом.
-----
Вот это уже вопрос к тебе.
Когда брался за работу как оценивал Сколько Работы нужно выполнить?
Насколько имеющийся код соответствует документации?
Как поставлен процесс разработки?
Что вообще от тебя ждут?
Уже сколько раз приходилось отказываться от работы просто потому, что
объем необходимой работы был много больше, чем заявляемый при найме.
NEW 20.09.09 19:24
да это написано в любой книжке по проэктменеджменту.
Что нужно как можно больше времени и сил отдавать спецификации
и продумать все возможные ситуации для каждого этапа
проекта и прежде всего для тестирования и только потом писать код.
Это все конечно так, вопрос только на сколько это используется на практике?
Опятьже все упирается в организацию процессов на фирме и насколько
"умный" проэктменеджмент и слаженный коллектив...
in Antwort Murr 20.09.09 17:02
В ответ на:
...сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код..
...сначала делается проектирование, потом пишутся
тесты, и только потом делается и тестируется код..
да это написано в любой книжке по проэктменеджменту.
Что нужно как можно больше времени и сил отдавать спецификации
и продумать все возможные ситуации для каждого этапа
проекта и прежде всего для тестирования и только потом писать код.
Это все конечно так, вопрос только на сколько это используется на практике?
Опятьже все упирается в организацию процессов на фирме и насколько
"умный" проэктменеджмент и слаженный коллектив...
все что вы сделаете в интернете может быть использовано против вас!
NEW 20.09.09 19:28
in Antwort pkrasnop 20.09.09 17:07
это скорость.
------
Скорость это количество процессоров в кластере.
А писать надо на том, на чем будет проще и понятнее.
------
Скорость это количество процессоров в кластере.
А писать надо на том, на чем будет проще и понятнее.
NEW 20.09.09 19:47
В чём заключается результат? Что такое "рабочая программа"?
Если вас устраивает расчёт стоимотси опциона за 1день тогда программа делающая это за 12часов - рабочая. Но если у меня есть программа делающая это за 6 часов, то вы понимаете, кто получит прибыль ;-), которая к слову не идёт ни в какое сравнение с расходами.
Качество программы должно расти, а не только количество железа :-) Иначе бы на 8корах был бы занят только 1 :-)
in Antwort katran76 20.09.09 19:24, Zuletzt geändert 20.09.09 19:48 (pkrasnop)
В ответ на:
а сколько человек способны реализовать все или хотя бы большинство возможностей оптимизации, т.е. обладают опытом и знаниями для этого?
Сейчас ты это сформулировал как "возможность" и тут ты конечно прав, возможностей больше. Но разработка на языке высокого уровня позволяет достичь результата (и поддерживать готовый продукт) с меньшими затратами ресурсов. Если рассматривать только скорость работы готовой программы то это сферический конь в вакууме.
а сколько человек способны реализовать все или хотя бы большинство возможностей оптимизации, т.е. обладают опытом и знаниями для этого?
Сейчас ты это сформулировал как "возможность" и тут ты конечно прав, возможностей больше. Но разработка на языке высокого уровня позволяет достичь результата (и поддерживать готовый продукт) с меньшими затратами ресурсов. Если рассматривать только скорость работы готовой программы то это сферический конь в вакууме.
В чём заключается результат? Что такое "рабочая программа"?
Если вас устраивает расчёт стоимотси опциона за 1день тогда программа делающая это за 12часов - рабочая. Но если у меня есть программа делающая это за 6 часов, то вы понимаете, кто получит прибыль ;-), которая к слову не идёт ни в какое сравнение с расходами.
В ответ
на:
Т.е. плюсы - это наиболее качественное из имеющихся?
Т.е. плюсы - это наиболее качественное из имеющихся?
Качество программы должно расти, а не только количество железа :-) Иначе бы на 8корах был бы занят только 1 :-)
NEW 20.09.09 19:51
in Antwort katran76 20.09.09 17:50
покупать больше железа получается только если у тебя веб-сервис или т.п. SaaS. а вот если у тебя сотни клиентов, то приходится оптимизовывать софт, чтобы он выжимал все возможное из железок...
NEW 20.09.09 19:53
in Antwort Murr 20.09.09 19:24
В ответ на:
Когда брался за работу как оценивал Сколько Работы нужно выполнить?
Насколько имеющийся код соответствует документации?
да я уже давно работаю на этой фирме. Просто раньше я писал свою программу с нуля. Сейчас она уже написана и редко меняется. Теперь я больше поддерживаю другие программы фирмы. А вот документации зачастую вообще нет. Впрочем есть которая описывает разные настройки, внутренние переменные которые включают-отключают фичи. Но документация реализации - такого практически нет. Да она и не нужна если программа написана понятно.Когда брался за работу как оценивал Сколько Работы нужно выполнить?
Насколько имеющийся код соответствует документации?
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 20.09.09 19:55
in Antwort pkrasnop 20.09.09 17:07
кстати, OCaml вполне себе доганяет C++ по скорости, при этом получается куча полезных вещей типа статической проверки типов и т.п. на гугл видео есть рассказ 'Caml Trading', ну и у lionet.livejournal.com есть описания производительности окамла как замены С++
NEW 20.09.09 20:05
in Antwort pkrasnop 20.09.09 19:11
Чем "ближе" я к железу, тем больше у меня возможностей для оптимизации.
------
Чем ближе ты к железу, тем меньше у тебя возможностей для оптимизации.
Просто потому, что объем низкоуровневого кода "несколько" больше и "за
деревьями леса не видно"... выиграешь в оптимизации трех команд пару нансек
и потеряешь на чем-то глобальном пару милисек...
но и качественный.
-----
Чтобы код был качественным, ты должен видеть и понимать его целиком.
На низком уровне возможность это сделать теряется.
вычислительно сложных задач
-----
Хммм... году этак в... ну да ладно об годах... В распоряжении прогера были
СМ-3, какие-то килобайты памяти, немножко мебагайт диска и транслятор с
Фортрана. Задача была не сложная - что-то из трассировки многослойных
печатных плат... Единственная проблема - размерность задачи. Она явно не
соответствовала возможностям системы - памяти не хватало.
Если кто-то возмется сейчас за день написать подсистему кеширования для
подобной задачи и справится за день - Я его буду уважать... но оценил бы
полную задачку, учитывая то железо и язык, в пару-тройку недель...
Тем не мение мужичек, которому пришлось писать код, справился с задачей
на 5-ть... и всего за день.
------
Чем ближе ты к железу, тем меньше у тебя возможностей для оптимизации.
Просто потому, что объем низкоуровневого кода "несколько" больше и "за
деревьями леса не видно"... выиграешь в оптимизации трех команд пару нансек
и потеряешь на чем-то глобальном пару милисек...
но и качественный.
-----
Чтобы код был качественным, ты должен видеть и понимать его целиком.
На низком уровне возможность это сделать теряется.
вычислительно сложных задач
-----
Хммм... году этак в... ну да ладно об годах... В распоряжении прогера были
СМ-3, какие-то килобайты памяти, немножко мебагайт диска и транслятор с
Фортрана. Задача была не сложная - что-то из трассировки многослойных
печатных плат... Единственная проблема - размерность задачи. Она явно не
соответствовала возможностям системы - памяти не хватало.
Если кто-то возмется сейчас за день написать подсистему кеширования для
подобной задачи и справится за день - Я его буду уважать... но оценил бы
полную задачку, учитывая то железо и язык, в пару-тройку недель...
Тем не мение мужичек, которому пришлось писать код, справился с задачей
на 5-ть... и всего за день.
NEW 20.09.09 20:17
in Antwort viger2 20.09.09 19:24
вопрос только на сколько это используется на практике?
------
Тут всего два варианта.
Первый - это используется - проект живет и если он имеет смысл - развивается.
Второй - это не используется - проект развивается до некоторого уровня и затем помирает.
Третьего варианта нет.
От проектменеджеров конечно зависит "многое", но они ограничены тем что знают и что
документировано...
------
Тут всего два варианта.
Первый - это используется - проект живет и если он имеет смысл - развивается.
Второй - это не используется - проект развивается до некоторого уровня и затем помирает.
Третьего варианта нет.
От проектменеджеров конечно зависит "многое", но они ограничены тем что знают и что
документировано...
NEW 20.09.09 20:19
Согласен. Поэтому не ассемблер или машинный код ;-)
Здесь я имею ввиду качественный по скорости, а не по поддержке. Ещё раз, если нужна скорость, то иногда приходится немного жертвовать дизайном. Если скорость не нужна - то и с++ часто не нужен.
in Antwort Murr 20.09.09 20:05
В ответ на:
объем низкоуровневого кода "несколько" больше и "за
деревьями леса не видно"... выиграешь в оптимизации трех команд пару нансек
и потеряешь на чем-то глобальном пару милисек...
объем низкоуровневого кода "несколько" больше и "за
деревьями леса не видно"... выиграешь в оптимизации трех команд пару нансек
и потеряешь на чем-то глобальном пару милисек...
Согласен. Поэтому не ассемблер или машинный код ;-)
В ответ на:
Чтобы код был качественным, ты должен видеть и понимать его целиком.
На низком уровне возможность это сделать теряется.
Чтобы код был качественным, ты должен видеть и понимать его целиком.
На низком уровне возможность это сделать теряется.
Здесь я имею ввиду качественный по скорости, а не по поддержке. Ещё раз, если нужна скорость, то иногда приходится немного жертвовать дизайном. Если скорость не нужна - то и с++ часто не нужен.
NEW 20.09.09 20:28
В С++ есть возможности для мета-программирования. То, что какой-то компилятор для OCalm может сделать быстрый код, который работает быстрее кода, сгенерированного каким-то компилятором для с++ я согласен.
in Antwort AlexOtt 20.09.09 19:55
В ответ на:
кстати, OCaml вполне себе доганяет C++ по скорости, при этом получается куча полезных вещей типа статической проверки типов и т.п. на гугл видео есть рассказ 'Caml Trading', ну и у lionet.livejournal.com есть описания производительности окамла как замены С++
кстати, OCaml вполне себе доганяет C++ по скорости, при этом получается куча полезных вещей типа статической проверки типов и т.п. на гугл видео есть рассказ 'Caml Trading', ну и у lionet.livejournal.com есть описания производительности окамла как замены С++
В С++ есть возможности для мета-программирования. То, что какой-то компилятор для OCalm может сделать быстрый код, который работает быстрее кода, сгенерированного каким-то компилятором для с++ я согласен.
NEW 20.09.09 20:29
in Antwort AlexOtt 20.09.09 19:51
чтобы он выжимал все возможное из железок...
------
Ну это кому как...
Кто-то выжимает что может из железок, кто-то заменяет 1000 Писюков Майнфреймом...
Об том, что объем требуемых вычислений растет быстрее производительности
систем Я помню...
------
Ну это кому как...
Кто-то выжимает что может из железок, кто-то заменяет 1000 Писюков Майнфреймом...
Об том, что объем требуемых вычислений растет быстрее производительности
систем Я помню...
NEW 20.09.09 20:35
in Antwort Murr 20.09.09 20:29
ну вот мы продаем продукт. мейнфрейм клиенту для него не нужен, но вот в потолки существующих железок мы вполне упираемся...
NEW 20.09.09 20:36
in Antwort pkrasnop 20.09.09 20:28
большая часть возможностей метапрограммирования в С++ используется для эмуляции функциональных вещей :-)
NEW 20.09.09 20:48
in Antwort anly 20.09.09 19:53
Да она и не нужна если программа написана понятно.
-----
Она нужна всегда. Даже когда имеется идеально написанный код, то в этом коде
не описаны условия его корректной работы. Например, написан анализатор для
грамматики типа LL(1)... по коду требования к грамматике не определишь...
Теперь я больше поддерживаю другие программы фирмы.
-----
Тут два пути.
Путь первый. Первое - оцениваешь каждую новую задачу. Второе - говоришь шефу
- это займет столько времени. Несогласный шеф получает задачу обратно и ищет
другого исполнителя.
Второй, путь. Ищешь новую работу.
-----
Она нужна всегда. Даже когда имеется идеально написанный код, то в этом коде
не описаны условия его корректной работы. Например, написан анализатор для
грамматики типа LL(1)... по коду требования к грамматике не определишь...
Теперь я больше поддерживаю другие программы фирмы.
-----
Тут два пути.
Путь первый. Первое - оцениваешь каждую новую задачу. Второе - говоришь шефу
- это займет столько времени. Несогласный шеф получает задачу обратно и ищет
другого исполнителя.
Второй, путь. Ищешь новую работу.
20.09.09 20:57
in Antwort pkrasnop 20.09.09 20:19
если нужна скорость, то иногда приходится немного жертвовать дизайном.
-----
Когда-то Я думал так же. Как показала практика - Я был не прав.
качественный по скорости
-----
Сначала профайлер, а там - видно будет. Возможно, что решение не в оптимизации
кода, а в новом железе...
-----
Когда-то Я думал так же. Как показала практика - Я был не прав.
качественный по скорости
-----
Сначала профайлер, а там - видно будет. Возможно, что решение не в оптимизации
кода, а в новом железе...
NEW 20.09.09 21:06
in Antwort AlexOtt 20.09.09 20:35
в потолки существующих железок мы вполне упираемся...
------
В потолки существующих железок упираюсь даже Я на своем домашнем
компостере... притом, что у меня ДЕЛЛ 1420 - пара ксеонов...
------
В потолки существующих железок упираюсь даже Я на своем домашнем
компостере... притом, что у меня ДЕЛЛ 1420 - пара ксеонов...
NEW 20.09.09 21:10
in Antwort Murr 20.09.09 21:06
у нас сейчас стандартные модели - 4xQuadCore + куча памяти. Но потоки передаваемых данных растут быстрее чем мощность железа...
NEW 20.09.09 21:20
Вы не подумайте, я за дизайн :-). И рефакторинг у меня занимает достаточно много времени. Но всё таки, в частности, виртуальные функции работают медленнее обычных, и иногда приходится это как-то обходить, особенно если функция вызывается очень часто.
in Antwort Murr 20.09.09 20:57
В ответ на:
если нужна скорость, то иногда приходится немного жертвовать дизайном.
-----
Когда-то Я думал так же. Как показала практика - Я был не прав.
если нужна скорость, то иногда приходится немного жертвовать дизайном.
-----
Когда-то Я думал так же. Как показала практика - Я был не прав.
Вы не подумайте, я за дизайн :-). И рефакторинг у меня занимает достаточно много времени. Но всё таки, в частности, виртуальные функции работают медленнее обычных, и иногда приходится это как-то обходить, особенно если функция вызывается очень часто.
NEW 20.09.09 21:23
in Antwort AlexOtt 20.09.09 21:10
Но потоки передаваемых данных растут быстрее чем мощность железа...
------
Повторюсь:
Об том, что объем требуемых вычислений растет быстрее производительности
систем Я помню...
------
Повторюсь:
Об том, что объем требуемых вычислений растет быстрее производительности
систем Я помню...
NEW 20.09.09 21:30
in Antwort pkrasnop 20.09.09 21:20
виртуальные функции работают медленнее обычных
-----
Если это становится фактором, то есть смысл подумать об другой архитектуре
для решения задачи...
...или об другом железе...
-----
Если это становится фактором, то есть смысл подумать об другой архитектуре
для решения задачи...
...или об другом железе...
NEW 20.09.09 21:35
in Antwort pkrasnop 20.09.09 21:32
NEW 20.09.09 21:36
in Antwort pkrasnop 20.09.09 21:32
Разумеется ООП, но с пересмотром архитектуры задачи.
NEW 20.09.09 21:44
in Antwort Murr 20.09.09 21:36
не могли бы на примере. Что такое архитектура задачи?
Вот простой пример:
У меня есть класс отвечающий за преобразование систем координат (читай трансформацию объектов). Я ему передаю точки, он мне их трансформирует.
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
Т.к. объекты могут быть большими вызов функции будет частым, и если преобразование будет простым, то стоимость вызова функции будет сопоставима со стоимостью её вычисления.
Что делать? :-)
Вот простой пример:
У меня есть класс отвечающий за преобразование систем координат (читай трансформацию объектов). Я ему передаю точки, он мне их трансформирует.
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
Т.к. объекты могут быть большими вызов функции будет частым, и если преобразование будет простым, то стоимость вызова функции будет сопоставима со стоимостью её вычисления.
Что делать? :-)
NEW 20.09.09 21:45
А что пишете-то?
in Antwort pkrasnop 20.09.09 21:20
В ответ на:
в частности, виртуальные функции работают медленнее обычных, и иногда приходится это как-то обходить, особенно если функция вызывается очень часто
в частности, виртуальные функции работают медленнее обычных, и иногда приходится это как-то обходить, особенно если функция вызывается очень часто
А что пишете-то?
Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 21:51
in Antwort pkrasnop 20.09.09 21:44
можно не наследовать, а передавать функцию как параметер... я в одном из своих DSL строю дерево вычислений, где сразу подставляются нужные функции, а не используется наследование и вызов виртуальных функций - производительность выросла заметно...
NEW 20.09.09 21:58
1. Параметр чего?
2. То есть у преобразований нет общего класса?
in Antwort AlexOtt 20.09.09 21:51
В ответ на:
можно не наследовать, а передавать функцию как параметер
можно не наследовать, а передавать функцию как параметер
1. Параметр чего?
2. То есть у преобразований нет общего класса?
NEW 20.09.09 22:03
in Antwort pkrasnop 20.09.09 21:58
NEW 20.09.09 22:07
in Antwort pkrasnop 20.09.09 21:44
У меня есть класс отвечающий за преобразование систем координат
...
Что делать? :-)
------
Как меня учили в школе - т.е. на втором курсе физмата ЛУ - если в имеющейся системе считать сложно, например, в связи с нелинейностями, то надо перевести задачу в систему, где вычисления будут простыми. Всю задачу. Вопрос об том, какой должна быть система координат и есть один из вопросов архитектуры.
...
Что делать? :-)
------
Как меня учили в школе - т.е. на втором курсе физмата ЛУ - если в имеющейся системе считать сложно, например, в связи с нелинейностями, то надо перевести задачу в систему, где вычисления будут простыми. Всю задачу. Вопрос об том, какой должна быть система координат и есть один из вопросов архитектуры.
NEW 20.09.09 22:09
Завтра посмотрю, но я пока склоняюсь применить статический полиморфизм
template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
in Antwort AlexOtt 20.09.09 22:03
В ответ на:
да - тут вообще не обязателен ООП. пример можно найти в разделе 2.2.4 в SICP, это реализуется и в C++ без особых проблем
да - тут вообще не обязателен ООП. пример можно найти в разделе 2.2.4 в SICP, это реализуется и в C++ без особых проблем
Завтра посмотрю, но я пока склоняюсь применить статический полиморфизм
template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
NEW 20.09.09 22:13
Согласен, надо интерпретировать задачу с выгодной стороны для себя. Понял что вы имели ввиду.
in Antwort Murr 20.09.09 22:07
В ответ на:
Как меня учили в школе - т.е. на втором курсе физмата ЛУ - если в имеющейся системе считать сложно, например, в связи с нелинейностями, то надо перевести задачу в систему, где вычисления будут простыми. Всю задачу. Вопрос об том, какой должна быть система координат и есть один из вопросов архитектуры.
Как меня учили в школе - т.е. на втором курсе физмата ЛУ - если в имеющейся системе считать сложно, например, в связи с нелинейностями, то надо перевести задачу в систему, где вычисления будут простыми. Всю задачу. Вопрос об том, какой должна быть система координат и есть один из вопросов архитектуры.
Согласен, надо интерпретировать задачу с выгодной стороны для себя. Понял что вы имели ввиду.
NEW 20.09.09 22:40
А, вроде бы, понятно в какой области пишите. Если идёт речь о пересчёте координат вершин, когда сцена содержит их десятки тысяч и более, то вменяемые люди делают плоский массив вершин всей сцены, и трансформация дёргается не на каждую вершину, а сразу на весь массив. Ну, и, ессно, оптимизация должна отсекать вершины не попадающие в поле зрения.
in Antwort pkrasnop 20.09.09 21:44
В ответ на:
У меня есть класс отвечающий за преобразование систем координат (читай трансформацию объектов). Я ему передаю точки, он мне их трансформирует.
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
Т.к. объекты могут быть большими вызов функции будет частым, и если преобразование будет простым, то стоимость вызова функции будет сопоставима со стоимостью её вычисления.
У меня есть класс отвечающий за преобразование систем координат (читай трансформацию объектов). Я ему передаю точки, он мне их трансформирует.
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
Т.к. объекты могут быть большими вызов функции будет частым, и если преобразование будет простым, то стоимость вызова функции будет сопоставима со стоимостью её вычисления.
А, вроде бы, понятно в какой области пишите. Если идёт речь о пересчёте координат вершин, когда сцена содержит их десятки тысяч и более, то вменяемые люди делают плоский массив вершин всей сцены, и трансформация дёргается не на каждую вершину, а сразу на весь массив. Ну, и, ессно, оптимизация должна отсекать вершины не попадающие в поле зрения.
"God is dead" (Nietzsche). "Nietzsche is
dead" (God).
http://reaper507.blogspot.com
http://reaper507.blogspot.com
Dropbox - средство синхронизации и бэкапа файлов.
NEW 20.09.09 23:55
in Antwort voxel3d 20.09.09 22:40
Что значит "сразу на весь массив"? В цикле? Если функция оптимизирована как inline то разве это не одно и то же.
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
NEW 21.09.09 00:21
in Antwort pkrasnop 20.09.09 23:55
разве это не одно и то же.
-----
нет.
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
-----
Так ведь без разницы. Можно задать три произвольные парно непаралельные плоскости
и тем самым определить точку в пространстве... А можно и упростить до двумерности,
или даже одномерности, если модель позволяет...
Именно об этом Я тебе и писал...
-----
нет.
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
-----
Так ведь без разницы. Можно задать три произвольные парно непаралельные плоскости
и тем самым определить точку в пространстве... А можно и упростить до двумерности,
или даже одномерности, если модель позволяет...
Именно об этом Я тебе и писал...

NEW 21.09.09 05:35
Шаблоны второго типа я использовал в своей практике. А вот шаблоны с виртуальным функциями - не помню. Даже наоборот, чтобы избавиться от виртуальности класса я делал его(или его пользователя) шаблонным. Т.е. эти два приёма (в моей практике)исключают друг друга: либо шаблонность, либо виртуальность.
in Antwort pkrasnop 20.09.09 22:09, Zuletzt geändert 21.09.09 06:04 (anly)
В ответ на:
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
В ответ на:
template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
а ведь задача в первом случае поставлена некорректно. Некорректо тем что сразу предлагается абстрактый базовый класс. Т.е. предполагается что пользователь этого класса(функция или класс которые будут с ним работать) будет работать именно с базовым классом, не зная о реальном классе(наследнике). Однако второй вариант не удовлетворяет этому требованию, т.к. здесь уже работа с конкретным классом образованным аргументами шаблона. Уже нельзя например передать пользователю массив указателей на базовый класс (где смесь указателей на разные наследники, у каждого из которых своя функцию трансформ).template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
Шаблоны второго типа я использовал в своей практике. А вот шаблоны с виртуальным функциями - не помню. Даже наоборот, чтобы избавиться от виртуальности класса я делал его(или его пользователя) шаблонным. Т.е. эти два приёма (в моей практике)исключают друг друга: либо шаблонность, либо виртуальность.
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 21.09.09 09:26
почему?
А можно Point = std::vector<Point3> к примеру
in Antwort Murr 21.09.09 00:21
В ответ на:
разве это не одно и то же.
-----
нет.
разве это не одно и то же.
-----
нет.
почему?
В ответ на:
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
-----
Так ведь без разницы. Можно задать три произвольные парно непаралельные плоскости
и тем самым определить точку в пространстве... А можно и упростить до двумерности,
или даже одномерности, если модель позволяет...
Именно об этом Я тебе и писал...
К слову Point здесь может использоваться не только как точка в прямом смыле ;-).
-----
Так ведь без разницы. Можно задать три произвольные парно непаралельные плоскости
и тем самым определить точку в пространстве... А можно и упростить до двумерности,
или даже одномерности, если модель позволяет...
Именно об этом Я тебе и писал...
А можно Point = std::vector<Point3> к примеру

NEW 21.09.09 10:21
Зависит от того как ты сделаешь. Если начнёшь огород городить с ооп как в этом примере, то будет не одно и тоже. Заинлайнишь функции, будешь держать все вершины в одном линейном пуле - будет одно и тоже, получишь хорошо оптимизированный компилятором код на выхлопе.
А теперь к нашим баранам - виртуальным функциям. 99% случаев когда заводят речь про издержки виртуальных функций - гонят. Потому, что либо задача такая, где две лишние милисикунды не играют роли, либо архитектура кривая, либо неверно выбран алгоритм. Тут как бы глобально разговор завели, про динамические языки сказав: а) виртуальные функции порождают проблемы при изменении кода, б) они медленные. Так вот, глобально - они не порождают там проблем и они быстрые, а специфичные случаи десятков миллионов вызовов, это просто специфичные случаи, где оптимизация в виде отказа от лишнего такта на поиск в vtbl должна проводиться в самую последнюю очередь, после выбора правильной архитектуры и алгоритма.
in Antwort pkrasnop 20.09.09 23:55
В ответ на:
Если функция оптимизирована как inline то разве это не одно и то же.
Если функция оптимизирована как inline то разве это не одно и то же.
Зависит от того как ты сделаешь. Если начнёшь огород городить с ооп как в этом примере, то будет не одно и тоже. Заинлайнишь функции, будешь держать все вершины в одном линейном пуле - будет одно и тоже, получишь хорошо оптимизированный компилятором код на выхлопе.
А теперь к нашим баранам - виртуальным функциям. 99% случаев когда заводят речь про издержки виртуальных функций - гонят. Потому, что либо задача такая, где две лишние милисикунды не играют роли, либо архитектура кривая, либо неверно выбран алгоритм. Тут как бы глобально разговор завели, про динамические языки сказав: а) виртуальные функции порождают проблемы при изменении кода, б) они медленные. Так вот, глобально - они не порождают там проблем и они быстрые, а специфичные случаи десятков миллионов вызовов, это просто специфичные случаи, где оптимизация в виде отказа от лишнего такта на поиск в vtbl должна проводиться в самую последнюю очередь, после выбора правильной архитектуры и алгоритма.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 21.09.09 10:31
Компилятору, я думаю, всё равно, метод класса или функция.
Согласен.
in Antwort voxel3d 21.09.09 10:21
В ответ на:
Зависит от того как ты сделаешь. Если начнёшь огород городить с ооп как в этом примере, то будет не одно и тоже. Заинлайнишь функции, будешь держать все вершины в одном линейном пуле - будет одно и тоже, получишь хорошо оптимизированный компилятором код на выхлопе.
Зависит от того как ты сделаешь. Если начнёшь огород городить с ооп как в этом примере, то будет не одно и тоже. Заинлайнишь функции, будешь держать все вершины в одном линейном пуле - будет одно и тоже, получишь хорошо оптимизированный компилятором код на выхлопе.
Компилятору, я думаю, всё равно, метод класса или функция.
В ответ на:
А теперь к нашим баранам - виртуальным функциям. 99% случаев когда заводят речь про издержки виртуальных функций - гонят. Потому, что либо задача такая, где две лишние милисикунды не играют роли, либо архитектура кривая, либо неверно выбран алгоритм. Тут как бы глобально разговор завели, про динамические языки сказав: а) виртуальные функции порождают проблемы при изменении кода, б) они медленные. Так вот, глобально - они не порождают там проблем и они быстрые, а специфичные случаи десятков миллионов вызовов, это просто специфичные случаи, где оптимизация в виде отказа от лишнего такта на поиск в vtbl должна проводиться в самую последнюю очередь, после выбора правильной архитектуры и алгоритма.
А теперь к нашим баранам - виртуальным функциям. 99% случаев когда заводят речь про издержки виртуальных функций - гонят. Потому, что либо задача такая, где две лишние милисикунды не играют роли, либо архитектура кривая, либо неверно выбран алгоритм. Тут как бы глобально разговор завели, про динамические языки сказав: а) виртуальные функции порождают проблемы при изменении кода, б) они медленные. Так вот, глобально - они не порождают там проблем и они быстрые, а специфичные случаи десятков миллионов вызовов, это просто специфичные случаи, где оптимизация в виде отказа от лишнего такта на поиск в vtbl должна проводиться в самую последнюю очередь, после выбора правильной архитектуры и алгоритма.
Согласен.
NEW 21.09.09 10:40
in Antwort pkrasnop 21.09.09 10:31
Компилятору не всё равно, будет ли линейно лежать или же по произвольным адресам раскидано обрабатываемое, когда он будет цикл обработки массива вершин оптимизировать.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 21.09.09 10:55
in Antwort voxel3d 21.09.09 10:40
Да, это понятно. Но если у меня объекты лежат в массиве и я на каждый объект вызваю функцию, то должно быть одинаково. Коммутативность вроде как. Поэтому и классы тут должны быть непричём.
NEW 23.09.09 11:15
in Antwort pkrasnop 21.09.09 10:55, Zuletzt geändert 23.09.09 11:17 (Murr)
На последнего. К вопросу об том, на каком уровне должно быть кодирование:
C# Trading Software Developer v Dublin City
A new position has opened up with one of Dublin-s financial trading companies.
We are seeking a talented Senior Software Engineer who has previous Trading platforms / investment banking development experience.
This position requires the candidate to have solid C# or C++ development skills. Java will also be accepted as long as you can demonstrate the ability to write low-level code. You will be working on a real-time trading system.
З.Ы. из вчерашней почты.
C# Trading Software Developer v Dublin City
A new position has opened up with one of Dublin-s financial trading companies.
We are seeking a talented Senior Software Engineer who has previous Trading platforms / investment banking development experience.
This position requires the candidate to have solid C# or C++ development skills. Java will also be accepted as long as you can demonstrate the ability to write low-level code. You will be working on a real-time trading system.
З.Ы. из вчерашней почты.
NEW 28.09.09 13:11
in Antwort anly 17.09.09 22:44
в ближайшее время с рынка провалят типичные процессоры типа Intel 86
их заменят FPGA
и програмирование на классическом С++ также к динозврам..
накроется медным тазом Windows и братва которая его так долго писала..... "Бил" почит в позе бозе туда ему и дорога.... придурку тормоз ходячий
ну если кому хочеться ещё париться на старых технологиях и инвестировать время в покойников ! почему бы не мусолить тему !
их заменят FPGA
и програмирование на классическом С++ также к динозврам..
накроется медным тазом Windows и братва которая его так долго писала..... "Бил" почит в позе бозе туда ему и дорога.... придурку тормоз ходячий
ну если кому хочеться ещё париться на старых технологиях и инвестировать время в покойников ! почему бы не мусолить тему !
Все вопросы на ответымаил triton@nefkom.net
NEW 28.09.09 13:41
in Antwort diatron 28.09.09 13:11
В ответ на:
и програмирование на классическом С++ также к динозврам..
а на чем программироваться будут эти процессоры?и програмирование на классическом С++ также к динозврам..
В ответ на:
накроется медным тазом Windows и братва которая его так долго писала
ну это вряд ли. Столько программ уже выпущено, они работают и поддерживаются. Никто их переписывать ради новых процессоров не будет. Разве что новые разработки возможно будут писаться сразу на для этой новинки. Но это - много лет, пока количество новых программ превысит и вытеснит количество старых, так что С++ уже нужен не будет.накроется медным тазом Windows и братва которая его так долго писала
Проклят нарушающий межи ближнего своего (Втор.27:17)
NEW 28.09.09 13:49
in Antwort diatron 28.09.09 13:11
мне кажется что вы немного выдаете желаемое за действительность:
1. FPGA никогда незаменят чипы процессоров, хотябы потому что они гораздо дороже чем ASIC при массовом производстве.
2.
гибко, универсально и намного дешевле? сомневаюсь. Стадартизированные языки как раз намного удещевляют и упрощают рещение
конкретных задач.
3.
ипользуются в бизнесе намного чаще чем остальные, и даже в индустрии, поэтому и для потребителя дещевле испльзовать системы для уже
существующих платформ чем заказывать новое железо, новые операционки и т.д.
1. FPGA никогда незаменят чипы процессоров, хотябы потому что они гораздо дороже чем ASIC при массовом производстве.
2.
В ответ на:
програмирование на классическом С++ также к динозврам
почему собственно? Т.е. вы думаете что "аппаратное" программирование намного проще,програмирование на классическом С++ также к динозврам
гибко, универсально и намного дешевле? сомневаюсь. Стадартизированные языки как раз намного удещевляют и упрощают рещение
конкретных задач.
3.
В ответ на:
Windows и братва которая его так долго писала.....
кто бы как неотносился к Билли но факт остается фактом, его продуктыWindows и братва которая его так долго писала.....
ипользуются в бизнесе намного чаще чем остальные, и даже в индустрии, поэтому и для потребителя дещевле испльзовать системы для уже
существующих платформ чем заказывать новое железо, новые операционки и т.д.
все что вы сделаете в интернете может быть использовано против вас!
NEW 28.09.09 13:55
скорее всего человек имеет ввиду чтото типа VHDL или Verilog
in Antwort anly 28.09.09 13:41
В ответ на:
а на чем программироваться будут эти процессоры?
а на чем программироваться будут эти процессоры?
скорее всего человек имеет ввиду чтото типа VHDL или Verilog
все что вы сделаете в интернете может быть использовано против вас!
NEW 28.09.09 15:43
in Antwort diatron 28.09.09 13:11
NEW 28.09.09 15:49
in Antwort anly 28.09.09 13:41
а на чем программироваться будут эти процессоры?
------
Они будут чудесным образом самопрограммирующиеся - на что захотят - на то и запрограммируются...
пока количество новых программ превысит и вытеснит количество старых
-----
Эээ... набери в поисковике "кобол программист" и посмотри насколько вытеснен Кобол последними новинками...
------
Они будут чудесным образом самопрограммирующиеся - на что захотят - на то и запрограммируются...

пока количество новых программ превысит и вытеснит количество старых
-----
Эээ... набери в поисковике "кобол программист" и посмотри насколько вытеснен Кобол последними новинками...

NEW 28.09.09 16:07
кстати когда пред миром остро встала проблема Y2K то многие большие фирмы приглашали "пионеров-пенсионеров" которые знают старые языки и платили им за это неплохие денюЖки...
in Antwort Murr 28.09.09 15:49
В ответ на:
Эээ... набери в поисковике "кобол программист" и посмотри насколько вытеснен Кобол последними новинками...
Эээ... набери в поисковике "кобол программист" и посмотри насколько вытеснен Кобол последними новинками...
кстати когда пред миром остро встала проблема Y2K то многие большие фирмы приглашали "пионеров-пенсионеров" которые знают старые языки и платили им за это неплохие денюЖки...
все что вы сделаете в интернете может быть использовано против вас!
NEW 28.09.09 16:29
in Antwort viger2 28.09.09 16:07
многие большие фирмы приглашали
------
Они и сейчас ищут. И делают это на регулярной основе. Просто далеко не каждый прогер
может работать в режиме - "строка 576, идентификатор 'Home29' заменить на 'Home28'"...
------
Они и сейчас ищут. И делают это на регулярной основе. Просто далеко не каждый прогер
может работать в режиме - "строка 576, идентификатор 'Home29' заменить на 'Home28'"...