|
static variable |
|
|
|
Apr 4 2016, 06:22
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Baser @ Apr 3 2016, 17:38)  При "правильном" программировании Но такой подход убивает чистоту функции, а в некоторых языках программирования чистота функции большой плюс. Функцию с внутренней переменной step не особенно запихнешь в библиотеку для повторного использования. С многопоточностью будут проблемы у такой функции. Совпадение имен глобальной и локальной переменной тоже лучше не практиковать - попутать что где легче простого.
|
|
|
|
|
Apr 5 2016, 04:55
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (adnega @ Apr 4 2016, 12:22)  Но такой подход убивает чистоту функции, а в некоторых языках программирования чистота функции большой плюс. Функцию с внутренней переменной step не особенно запихнешь в библиотеку для повторного использования. С многопоточностью будут проблемы у такой функции. Ну, с глобальной переменной будет ровно то же самое. Что касается полезности, то завит от. У локальных статических функций есть свои плюсы. Например, функции-генераторы. Или тот же синглтон Мейерса. Реализация получается простая и эффективная. Конечно, в любом случае программист должен чётко представлять, что он делает и какие последствия могут возникнуть из-за неправильного использования. QUOTE (adnega @ Apr 4 2016, 12:22)  Совпадение имен глобальной и локальной переменной тоже лучше не практиковать - попутать что где легче простого. Это да. К слову, глобальных переменных нужно стараться избегать, во всяком случае, минимизировать их количество.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 5 2016, 08:04
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(dxp @ Apr 5 2016, 07:55)  Ну, с глобальной переменной будет ровно то же самое. А если все необходимые переменные передавать в функцию (в виде списка или сложного объекта)? Разумеется, что совсем без побочных действий не обойтись, но если данные можно отделить от кода, то я такой возможностью пользуюсь. Тут пример для управления шаговым двигателем приводили. Предложенная реализация возможна для одного двигателя, а если их много больше? Я бы сделал массив объектов, которые бы хранили все необходимое - и текущий шаг, и скорость, и ускорение, и целевое значение, обратную связь по энкодеру или потенциометру, адреса пинов, если это необходимо. А функцию, решающую что делать с полем step, сделал бы универсальной. Разумеется static переменных в ней не было бы. Оформил бы это в виде библиотеки и таскал из проекта в проект, где есть хоть один шаговый двигатель.
|
|
|
|
|
Apr 5 2016, 10:13
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(adnega @ Apr 4 2016, 09:22)  Но такой подход убивает чистоту функции, а в некоторых языках программирования чистота функции большой плюс. С многопоточностью будут проблемы у такой функции. С этим никто не спорит, но нужно решать в каждом конкретном случае, как будет удобней. Цитата Функцию с внутренней переменной step не особенно запихнешь в библиотеку для повторного использования. А вот тут никто вам не запрещает это делать. Более того, в стандартных библиотеках Си полно функций с таким финтом, в описаниях отдельно пишут, что они "опасные", не реентерабельные, дописывают новые варианты безопасных, но нестандартных функций. Но стандартные функции то уже никуда не денешь  Вот пример, функция парсинга текстовых строк strtokЦитата Совпадение имен глобальной и локальной переменной тоже лучше не практиковать - попутать что где легче простого. Одинаковые глобальные и локальные переменные тоже не советую применять. А вот одинаковые локальные и статические внутри функций - очень даже можно применять. Цитата(adnega @ Apr 5 2016, 11:04)  А если все необходимые переменные передавать в функцию (в виде списка или сложного объекта)? Такой подход тоже имеет место быть, когда есть несколько одинаковых кусков кода обработки. Цитата(Сергей Борщ @ Apr 5 2016, 11:52)  Все это хорошо, но локальные данные могут быть и константными (скажем, таблица для перевода номера микрошага в коэф... Для таблиц и констант можно применять указатели, которые тоже передаются в функцию. Можно передавать также и переменные свойства таблиц (длину, структуру). Много чего можно придумать, главное чтобы понятность кода не страдала. А то сам иногда так накручу код для компактности, потом смотрю на тот ужОс, который получился и понимаю, что написание "тупо в лоб методом copy-paste" было бы лучше
|
|
|
|
|
Apr 5 2016, 10:48
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Baser @ Apr 5 2016, 12:13)  Для таблиц и констант можно применять указатели, которые тоже передаются в функцию. Порой проще и естественней засунуть таблицу в функцию. Например, таблицу перекодировки тетрады в ASCII для вывода чисел в шестнадцатиричном формате. Такая таблица больше нигде не понадобится, какой смысл ее выностить из функции? Цитата(Baser @ Apr 5 2016, 12:13)  А то сам иногда так накручу код для компактности, потом смотрю на тот ужОс, который получился и понимаю, что написание "тупо в лоб методом copy-paste" было бы лучше  Серега, ты созрел для перехода на C++
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 5 2016, 12:08
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Сергей Борщ @ Apr 5 2016, 13:48)  Серега, ты созрел для перехода на C++  Увы, все никак... Даже осилил почти весь учебник Шилдса, но до конца прочуствовал только одну фразу во введении, где говорится, что смысл применять плюсы есть только начиная с определенного уровня сложности проектов. У меня проекты сравнительно простые, поэтому я никак не пойму для чего мне все эти фантики (обертки) которые скрывают реальную сущность объектов. С переходом с асма на си было все понятно, выгоды очевидны, а тут...
|
|
|
|
|
Apr 7 2016, 07:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Baser @ Apr 5 2016, 15:08)  где говорится, что смысл применять плюсы есть только начиная с определенного уровня сложности проектов. Да что этот Шилдс понимает... :-) Я осваивал плюсы на scmRTOS ("кишки" довольно сложные, но снаружи всё просто и понятно) и на Qt (супер-понятный внешний интерфейс, в "кишки" даже не лазил). Рекомендую! После этого свои классы без особых проблем придумываются. При этом проекты не сказать, чтоб прямо сложные. Пара сотен килобайт исходников - это немного совсем...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 7 2016, 07:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Сергей Борщ @ Apr 5 2016, 13:48)  ...созрел для перехода на C++  Мой первый сиобразный язык был С++, а не С. В незапамятные времена, когда только появился первый (первый, потому, что 1.0 версии не было  ) борлондячий Борланд С++ 2.0 я получил персональный компьютер и решил сваять для работы некую приблуду для которой требовалась, то, что я назвал, "оконной библиотекой" - то есть всякие окошки, текстовые естественно, но все же типа "Windows". В КБ у меня уже был уже бывалый сишный программисто, который утверждал, что писать нужно на Си с большими вкраплениями ASM, иначе будет безумно медленно. В обшем-то он был прав, поскольку тогдашний массовый персональный компьютер был восьмибитовым и имел тактовую 4,7MHz  . Он даже взялся на спор показать мастеркласс в соревновании на скорость работы оконной библиотеки. В общем вечерами сидели и писали. Я на плюсах, правда с вкрапелениями на ASM, ибо уровень оптимизации тогдашних компиляторов был просто никакой, он на Си. Результат был как бы неожиданный - плюсовая работала быстрее  . Причина на самом деле проста - уже больно она красиво и хорошо ложилась она во все эти классы и иже с ними. Выигрыш был за счет лучшей системной оптимизации. На самом деле обе , библиотеки работали медленно  . Так что дальше начался этап писания на Си, но опираясь на понимание пришедшее с плюсов. Компиляторы с тех пор сделали громадный скачек так что СЕГОДНЯ откатываться на Си уже не пришлось-бы. Сегодня надо писать на C++, хотя я так и остался де-факто на Си. Но С++ подход к делу НАВСЕГДА остался со мной.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|