Re[5]: стиль: объявление статической переменной внутри функции
От: igna Россия  
Дата: 05.09.07 15:41
Оценка:
Здравствуйте, dandy, Вы писали:

D>Вопрос личный.


И что? Я же не спрашиваю, где ты работаешь, да сколько тебе платят, да с кем ты спишь. В первом же сообщении ты написал довольно странное преобразование ссылки в константную ссылку через указатель, а рассуждаешь как большой; вот я и спросил. А ты как рыба об лед.
Re[12]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 15:50
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я считаю, что это не нужно.

E>Я не люблю синглетоны, но в данном случае, ИМХО, имеет место случай так называемого перебдения
D>>Вред от такого подхода обычно начинается сразу после ухода с проекта 1 — го разработчика.
E>И состоит он в том, что?..

Вы там написали (и еще напишете) глобальных функций, следующий разработчик продолжит эту тенденцию, так как ему либо переписывать ваш код заново — либо продолжать в том же духе. Представьте, что из этого проекта получится лет через 5. Не представляете? Получатся функции длиной несколько тысяч строк с очень сложной внутренней логикой. А теперь представьте, что вы пришли на новую работу, что проект такой, как описан выше, что в проекте ошибка на ошибке, а вам нужно их устранить, и добавить еще кое — какую функциональность. Делайте выводы.
Re[13]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 15:53
Оценка:
Здравствуйте, dandy, Вы писали:

E>>И состоит он в том, что?..


D>Вы там написали (и еще напишете) глобальных функций, следующий разработчик продолжит эту тенденцию, так как ему либо переписывать ваш код заново — либо продолжать в том же духе. Представьте, что из этого проекта получится лет через 5. Не представляете? Получатся функции длиной несколько тысяч строк с очень сложной внутренней логикой. А теперь представьте, что вы пришли на новую работу, что проект такой, как описан выше, что в проекте ошибка на ошибке, а вам нужно их устранить, и добавить еще кое — какую функциональность. Делайте выводы.


Э-э-э, а какая связь между статическими константами, определёнными в функциях и всеми описанными ужасами?
Предположим, что рассматриваемая функция -- это метод. И что? В методе уже можно заводить статическую константу?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: стиль: объявление статической переменной внутри функции
От: Sergey Россия  
Дата: 05.09.07 15:55
Оценка: +1
> Потому что код получается нечитаемый.

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

> Если эта переменная употребляется только в одной функции, то модификатор static вообще не нужен (и просто вреден).


И в чем же его вред?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 16:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>НУ в целом "6 лет писали 3 месяца отлаживали" соотношение неплохое. Но от чего 6 лет писали "с гулькин хвост кода" не понятно


Основная проблема была с отсутствием толковой документации по API программы, к ней писался плагин. Да и сам плагин был не из простых.
Re[7]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 16:08
Оценка:
Здравствуйте, dandy, Вы писали:

D>Основная проблема была с отсутствием толковой документации по API программы, к ней писался плагин. Да и сам плагин был не из простых.


6 лет люди с API разбирались? А купить доку не пробовали? Или хачили чего? Что можно с выгодой хачить 6 лет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 16:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>Э-э-э, а какая связь между статическими константами, определёнными в функциях и всеми описанными ужасами?

E>Предположим, что рассматриваемая функция -- это метод. И что? В методе уже можно заводить статическую константу?

Если пишете класс — то не вижу смысла заводить в нем статическую константу (в классах для этого заводят protected & private части), статические константы объявляются (как правило) в глобальных функциях любителями этого стиля программирования. Ну и так далее. Что вы здесь видите смешного?
Re[15]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 16:25
Оценка: +1
Здравствуйте, dandy, Вы писали:

D>Если пишете класс — то не вижу смысла заводить в нем статическую константу (в классах для этого заводят protected & private части), статические константы объявляются (как правило) в глобальных функциях любителями этого стиля программирования. Ну и так далее. Что вы здесь видите смешного?


Короче не видишь, значит не видишь. А я вижу. Что тут поделаешь. Видимо у нас различный опыт. Я на всякий случай приведу пример, а ты потом можешь сам решать есть смысл нет и всё такое.

class CMyFormulaCalculator {
public:
   static double Process( double x, double y, double z )
   {
       const double A = 0.928745;
       const double B = 0.98455096;
       const double C = 0.023756;

       static const double ABC = formulaPart1( A, B, C );
       static const double BCA = formulaPart2( B, C, A );
       static const double CAB = formulaPart3( C, A, B );

       return ABC * formulaPart3( z, x, y ) + BCA * formulaPart1( x, y, z) + CAB * formulaPart2( y, z, x );
   }

private:
   // Эти три функции вычисляются очень долго.
   static double formulaPart1( double x, double y, double z );
   static double formulaPart2( double x, double y, double z );
   static double formulaPart3( double x, double y, double z );
};


ИМХО очквидно, что выделенные полужирным static ускорят эту программу в два раза.
Или в два раза -- это не смысл?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 16:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>6 лет люди с API разбирались? А купить доку не пробовали? Или хачили чего? Что можно с выгодой хачить 6 лет?


Эта прога — издательская система, купить доку пробовали — за нее попросили несуразную цену,
хачить пришлось уже после того как раздобыли доку, так как эта дока существует в таком виде, что толку с нее до смешного мало. Да и прога сама по себе еще та — разрабатывалась под MAC OS, под винду портируется. Названия проги упоминать не буду — здесь уже писал о ней здесь год назад — никто ничего об этой проге не знает, так что смысла не вижу. А насчет выгоды — юзеры говорят, что разработанный плагин лучший из тех, что они где — либо видели. Разрабатывался для внутреннего пользования.
Re[16]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 17:28
Оценка:
Здравствуйте, Erop, Вы писали:
E>Короче не видишь, значит не видишь. А я вижу. Что тут поделаешь. Видимо у нас различный опыт.
Ну, каждому — свое

Я на всякий случай приведу пример, а ты потом можешь сам решать есть смысл нет и всё такое.

E>
E>class CMyFormulaCalculator {
E>public:
E>   static double Process( double x, double y, double z )
E>   {
E>       const double A = 0.928745;
E>       const double B = 0.98455096;
E>       const double C = 0.023756;

E>       static const double ABC = formulaPart1( A, B, C );
E>       static const double BCA = formulaPart2( B, C, A );
E>       static const double CAB = formulaPart3( C, A, B );

E>       return ABC * formulaPart3( z, x, y ) + BCA * formulaPart1( x, y, z) + CAB * formulaPart2( y, z, x );
E>   }

E>private:
E>   // Эти три функции вычисляются очень долго.
E>   static double formulaPart1( double x, double y, double z );
E>   static double formulaPart2( double x, double y, double z );
E>   static double formulaPart3( double x, double y, double z );
E>};


E>ИМХО очквидно, что выделенные полужирным static ускорят эту программу в два раза.

E>Или в два раза -- это не смысл?

Иногда ускорение выполнения и на 20% — уже есть смысл.
А насчет кода — сделал бы что — то вроде такого (в первом приближении, можно и лучше, но думать лениво ):
Тут для экономии уменьшено количество параметров
class CCalculateFormulaPart
{
protected:
    BOOL _bCalculated;
    double _fResult;
public:
    CCalculateFormulaPart() : _bCalculated(0) {}
    virtual double Calculate(double) = 0;
};

class CCalculateFormulaPart_1 : public CCalculateFormulaPart
{
    double Calculate(double f)
    {
        if(!_bCalculated)
        {
            _fResult = formulaPart1(f);
            _bCalculated = TRUE;
        }
        return _fResult;
    }
};


+ еще 2 таких класса для formulaPart3 и formulaPart2, их обьекты — включил бы статическими членами в CMyFormulaCalculator

Тогда (псевдокод) функцию Process нужно было бы записать так:

E>       const double A = 0.928745;
E>       const double B = 0.98455096;
E>       const double C = 0.023756;

E>       const double ABC = _formulaPart_1.Calculate(A);
E>       const double BCA = _formulaPart_2.Calculate(B);
E>       const double CAB = _formulaPart_3.Calculate(C);

E>       return ABC * formulaPart3( z, x, y ) + BCA * formulaPart1( x, y, z) + CAB * formulaPart2( y, z, x ); // тут можно дополнить классы CCalculateFormulaPart_I, чтобы вызывать эти функции из них - для полного счастья :)


Мне такой код кажется более наглядным и проще при модификации, нежели исходный
Re[6]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 17:32
Оценка:
Здравствуйте, igna, Вы писали:

I>И что? Я же не спрашиваю, где ты работаешь, да сколько тебе платят, да с кем ты спишь. В первом же сообщении ты написал довольно странное преобразование ссылки в константную ссылку через указатель, а рассуждаешь как большой; вот я и спросил. А ты как рыба об лед.


Ну только без обид, пожалуйста!
Re[4]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 18:02
Оценка: 1 (1)
Здравствуйте, Sergey, Вы писали:

>> Потому что код получается нечитаемый.


S>По-настоящему нечитаемый код получается как раз при интенсивном использовании глобальных переменных.


Да, если их не группировать в объекты.

>> Если эта переменная употребляется только в одной функции, то модификатор static вообще не нужен (и просто вреден).


S>И в чем же его вред?


Возникает искушение обратиться к такой переменной из другой функции. Если таких обращений и функций много, то попробуйте такой код отладить.
Re[17]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 19:01
Оценка: +4
Здравствуйте, dandy, Вы писали:

D>Иногда ускорение выполнения и на 20% — уже есть смысл.

Ну вот и хорошо. Смысл мы уже отыскали. Теперь поговорим о сестре таланта

D>Тут для экономии уменьшено количество параметров

D>
D>class CCalculateFormulaPart
D>{
D>protected:
D>    BOOL _bCalculated;
D>    double _fResult;
D>public:
D>    CCalculateFormulaPart() : _bCalculated(0) {}
D>    virtual double Calculate(double) = 0;
D>};

D>class CCalculateFormulaPart_1 : public CCalculateFormulaPart
D>{
D>    double Calculate(double f)
D>    {
D>        if(!_bCalculated)
D>        {
D>            _fResult = formulaPart1(f);
D>            _bCalculated = TRUE;
D>        }
D>        return _fResult;
D>    }
D>};
D>

D>+ еще 2 таких класса для formulaPart3 и formulaPart2, их обьекты — включил бы статическими членами в CMyFormulaCalculator

D>Тогда (псевдокод) функцию Process нужно было бы записать так:


D>
E>>       const double A = 0.928745;
E>>       const double B = 0.98455096;
E>>       const double C = 0.023756;

E>>       const double ABC = _formulaPart_1.Calculate(A);
E>>       const double BCA = _formulaPart_2.Calculate(B);
E>>       const double CAB = _formulaPart_3.Calculate(C);

E>>       return ABC * formulaPart3( z, x, y ) + BCA * formulaPart1( x, y, z) + CAB * formulaPart2( y, z, x ); // тут можно дополнить классы CCalculateFormulaPart_I, чтобы вызывать эти функции из них - для полного счастья :)
D>


D>Мне такой код кажется более наглядным и проще при модификации, нежели исходный

Это более наглядный код?
Сначала были просто формулы просто и прямо отображающие логику задачи.
А ты навертел 4 класса с наследованием и виртуальными функциями, синглетонами, линивыми вычислениями и прочей чешуёй. При этом ты ещё и параметры выкинул "для упрощения". Нехилое упрощение я тебе скажу.

Ты представляешь себе вычислительную прогу какую-нибудь серъёзную? Когда строк 100 000 вычислений. При этом непростых вычислений, сложно довольно организованных?

На хрена эту и без того сложную программу представлять в запутанное чудовище из таких вот объектов? ((
Почему тебе кажется, что это будет проще поддерживать?
Да ты никогда в жизни не поймёшь что надо поменять в такой программе, когда что-то поменяется в математике

ИМХО код надо писать выразительно и так просто, как только возможно, без потери выразительности. А не запуьывать и усложнять из каких-то идеологических предрассудков.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 19:06
Оценка:
Здравствуйте, dandy, Вы писали:

S>>По-настоящему нечитаемый код получается как раз при интенсивном использовании глобальных переменных.

D>Да, если их не группировать в объекты.

О да, прекрасный объект "PI делённое на различные натуральные числа" конечно же грандиозно повышает читабельность программы. Как же
Вот в обсуждаемой формуле ты вместо констант предложил какие-то уродские полиморфные синглетоны использовать, например.
Интересно, как бы ты класс с константами ABC, BCA и CAB назвал бы?

>>> Если эта переменная употребляется только в одной функции, то модификатор static вообще не нужен (и просто вреден).

S>>И в чем же его вред?
D>Возникает искушение обратиться к такой переменной из другой функции. Если таких обращений и функций много, то попробуйте такой код отладить.
О мудрейший Гуру! Открой нам, сирым, как можно обратиться к static in function переменной, объевленной в одной функции из другой функции? Я, например, так не умею...
Зато я умею обращаться к безумным глобальным константам... Но предпочитаю этого не делать и безумных констант не иметь тоже
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 19:09
Оценка:
Здравствуйте, dandy, Вы писали:

D>А насчет выгоды — юзеры говорят, что разработанный плагин лучший из тех, что они где — либо видели. Разрабатывался для внутреннего пользования.


Ну, то есть разработка была успешной, не смотря на все твои мрачные замечания?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: стиль: объявление статической переменной внутри функции
От: Sergey Россия  
Дата: 05.09.07 19:27
Оценка: +1
Здравствуйте, dandy, Вы писали:

S>>По-настоящему нечитаемый код получается как раз при интенсивном использовании глобальных переменных.


D>Да, если их не группировать в объекты.


Чего группировать в объекты? В одной функции у меня, допустим, конфиг как static объявлен, в другой — логфайл. Мне что их теперь, в один объект сувать?

>>> Если эта переменная употребляется только в одной функции, то модификатор static вообще не нужен (и просто вреден).


S>>И в чем же его вред?


D>Возникает искушение обратиться к такой переменной из другой функции. Если таких обращений и функций много, то попробуйте такой код отладить.


Такой код отлаживать не придется. Потому что он не скомпилируется.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[18]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 19:57
Оценка:
Здравствуйте, Erop, Вы писали:

E>Это более наглядный код?

E>Сначала были просто формулы просто и прямо отображающие логику задачи.
E>А ты навертел 4 класса с наследованием и виртуальными функциями, синглетонами, линивыми вычислениями и прочей чешуёй.

Эти 4 класса добавляют (если не считать базового) по 3 строки кода к вызову функции. Это усложняет? Базовый класс написан для того, чтобы уменьшить количество кода и упростить логику производных классов А синглетонов там нет, их там и не нужно.

E>При этом ты ещё и параметры выкинул "для упрощения". Нехилое упрощение я тебе скажу.


А если бы параметров было бы 30, а не три? Это всего лишь пример, а не рабочий код, и думаю, ни к чему его раздувать, смысл и без того понятен.


E>Ты представляешь себе вычислительную прогу какую-нибудь серъёзную? Когда строк 100 000 вычислений. При этом непростых вычислений, сложно довольно организованных?


Не, вычислительные проги писал только в универе на вычах и только на фортране. Естественно, маленькие. Код типа этого как раз и пишется для сложных программ, для разбиения сложного функционала на относительно простые части.

E>На хрена эту и без того сложную программу представлять в запутанное чудовище из таких вот объектов? ((

E>Почему тебе кажется, что это будет проще поддерживать?
E>Да ты никогда в жизни не поймёшь что надо поменять в такой программе, когда что-то поменяется в математике

Да какое же это чудовище? Мне оно кажется и симпатичнее и выразительнее. Хотя о вкусах не спорят. И по — моему в таком коде разобраться таки — проще.

E>ИМХО код надо писать выразительно и так просто, как только возможно, без потери выразительности.


Обычно в первую очередь думаю о возможности дальнейшей поддержки и выразительности. На мой взгляд такой код более выразителен, хотя вы с этим сейчас и не согласны. А простота — вещь обманчивая.

E> А не запуьывать и усложнять из каких-то идеологических предрассудков.

Согласен.
Re[6]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 20:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Вот в обсуждаемой формуле ты вместо констант предложил какие-то уродские полиморфные синглетоны использовать, например.


Вы считаете, что на это нужно отвечать?
Re[19]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 20:33
Оценка:
Здравствуйте, dandy, Вы писали:

D>Эти 4 класса добавляют (если не считать базового) по 3 строки кода к вызову функции. Это усложняет? Базовый класс написан для того, чтобы уменьшить количество кода и упростить логику производных классов А синглетонов там нет, их там и не нужно.

Это как назвать. Вот статические экземпляры тех самых классов -- самый, что ни на есть синглетон...

У них ещё и семантика мутная, вообще-то. Зачем нужно, чтобы метод Calculate считал только первый раз за время жизни объекта. А потом игнорировал сой аргумент?
Это такое упрощение или это зачем?
Вот напишу я такой код, скажем:
foo()
{
    CCalculateFormulaPart_1 calculator;
    double v1 = calculator.Calculate( a1 );
    double v2 = calculator.Calculate( a2 );
    assert( v1 == v2 ); // сюрприз! сюрприз! сюрприз!!!
}


D> ...смысл и без того понятен.

Смысл такой, что из очень простого кода, где для оптимизации некоторые константы вычислялись единожды за время жизни программы ты предлагаешь сделать какого-то мегакрокодила, в котором надо разбираться и разбираться. С наследованиями, виртуальными методами, неявными состояниями, игнорируемыми параметрами и т. д.
Давно это называется упрощением?: )

D>Не, вычислительные проги писал только в универе на вычах и только на фортране. Естественно, маленькие. Код типа этого как раз и пишется для сложных программ, для разбиения сложного функционала на относительно простые части.


ИМХО ты говоришь о о чём-то другом. Похоже о управлении временим жизни объектов. Да, это дело учше не запутывать. Но в вычпрограммах обычно очень простые схемы владения как раз... Зачем их "улучшать"?

E>>Да ты никогда в жизни не поймёшь что надо поменять в такой программе, когда что-то поменяется в математеке

D>Да какое же это чудовище? Мне оно кажется и симпатичнее и выразительнее. Хотя о вкусах не спорят. И по — моему в таком коде разобраться таки — проще.

Обрати вниание, что ты ответил вовсе и не на моё замечание, а на какое-то своё...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 20:34
Оценка:
Здравствуйте, dandy, Вы писали:

E>>Вот в обсуждаемой формуле ты вместо констант предложил какие-то уродские полиморфные синглетоны использовать, например.


D>Вы считаете, что на это нужно отвечать?


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