Перейти к содержанию
    

Проверка условия внутри функции или снаружи - как лучше.

Сижу пару дней размышляю. Есть функции которые исполняются по условию.

Скажем если энкодер для данного мотора активирован - проверяй позицию, если не активирован - то соответственно и проверять нечего.

можно записать так

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;

 

Вопрос как лучше?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет.

функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи.

если внутри то я привязываю к функции глобальную переменную. хорошо ли это.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен.
Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

функция только проверяет позицию и не делает ничего другого. но я хочу проверять позицию по условию - если энкодер включен. вопрос где проверять это условие - внутри или снаружи.

если внутри то я привязываю к функции глобальную переменную. хорошо ли это.

Тогда лучше пусть эта функция только проверяет позицию. А условие оставить снаружи. Потом понятнее будет читать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вынесите проверку условия в функцию-обертку. Основную функцию сделайте статической, чтобы исключить возможность ее случайного вызова не из обертки, без проверки условия. В плюсах все это реализуется красивее защищенным наследованием. Если оставите условие вне функции - или забудете его написать или проверите что-то не то, к гадалке не ходите.

я понял. спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

По общепринятой схеме.

 

static int Coordinate = 0;

RetCode = EncoderStateGet( &Coordinate, . . . . );

 

По коду возврата определяем, имеет ли смысл смотреть координату.

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

выдавать "некритичные" ошибки, вроде "возможна потеря синхронизации" итп

 

Тут конечно, более интересно решение на ООП, энкодер+мотор==объект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...