jenya7 0 28 сентября, 2017 Опубликовано 28 сентября, 2017 (изменено) · Жалоба Сижу пару дней размышляю. Есть функции которые исполняются по условию. Скажем если энкодер для данного мотора активирован - проверяй позицию, если не активирован - то соответственно и проверять нечего. можно записать так case MOT_ST_RUN: if (mot_data[mot_num].enc_num > 0) MOT_PositionLoop(mot_idx); break; или спрятать проверку условия в функцию void MOT_PositionLoop(uint32_t mot_num) { if (mot_data[mot_num].enc_num > 0) { } } и потом case MOT_ST_RUN: MOT_PositionLoop(mot_idx); break; Вопрос как лучше? Изменено 28 сентября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 сентября, 2017 Опубликовано 28 сентября, 2017 (изменено) · Жалоба Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет. функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи. если внутри то я привязываю к функции глобальную переменную. хорошо ли это. Изменено 28 сентября, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен.Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи. если внутри то я привязываю к функции глобальную переменную. хорошо ли это. Тогда лучше пусть эта функция только проверяет позицию. А условие оставить снаружи. Потом понятнее будет читать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите. я понял. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба Я бы сделал ф-ию более "умной", позволяющей проверять состояние энкодера даже если он отключен. По общепринятой схеме. static int Coordinate = 0; RetCode = EncoderStateGet( &Coordinate, . . . . ); По коду возврата определяем, имеет ли смысл смотреть координату. Кроме того такой подход позволяет последующее расширение функциональности, например, выдавать "некритичные" ошибки, вроде "возможна потеря синхронизации" итп Тут конечно, более интересно решение на ООП, энкодер+мотор==объект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться