Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проверка условия внутри функции или снаружи - как лучше.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Сижу пару дней размышляю. Есть функции которые исполняются по условию.
Скажем если энкодер для данного мотора активирован - проверяй позицию, если не активирован - то соответственно и проверять нечего.
можно записать так
Код
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;


Вопрос как лучше?
novikovfb
Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет.
Jenya7
Цитата(novikovfb @ Sep 28 2017, 15:32) *
Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет.

функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи.
если внутри то я привязываю к функции глобальную переменную. хорошо ли это.
Сергей Борщ
QUOTE (Jenya7 @ Sep 28 2017, 13:45) *
функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен.
Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите.
novikovfb
Цитата(Jenya7 @ Sep 28 2017, 14:45) *
функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи.
если внутри то я привязываю к функции глобальную переменную. хорошо ли это.

Тогда лучше пусть эта функция только проверяет позицию. А условие оставить снаружи. Потом понятнее будет читать.
Jenya7
Цитата(Сергей Борщ @ Sep 28 2017, 15:48) *
Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите.

я понял. спасибо.
k155la3
Я бы сделал ф-ию более "умной", позволяющей проверять состояние энкодера даже если он отключен.
По общепринятой схеме.

static int Coordinate = 0;
RetCode = EncoderStateGet( &Coordinate, . . . . );

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

Тут конечно, более интересно решение на ООП, энкодер+мотор==объект.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.