реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проверка условия внутри функции или снаружи - как лучше.
Jenya7
сообщение Sep 28 2017, 09:58
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Сижу пару дней размышляю. Есть функции которые исполняются по условию.
Скажем если энкодер для данного мотора активирован - проверяй позицию, если не активирован - то соответственно и проверять нечего.
можно записать так
Код
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 - Sep 28 2017, 10:04
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Sep 28 2017, 10:32
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Неоднократно встречал рекомендацию: функция должна делать что-то одно. Функция, выполняющая 2 разных действия (проверяет позицию и регулирует ток) - моветон. Но если функция выставляет привод на указанную позицию с помощью регулировки тока - почему бы и нет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 28 2017, 10:45
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

Сообщение отредактировал Jenya7 - Sep 28 2017, 10:47
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 28 2017, 10:48
Сообщение #4


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Sep 28 2017, 10:50
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



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

Тогда лучше пусть эта функция только проверяет позицию. А условие оставить снаружи. Потом понятнее будет читать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 28 2017, 10:55
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

я понял. спасибо.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 28 2017, 18:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

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

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

Тут конечно, более интересно решение на ООП, энкодер+мотор==объект.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 05:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01461 секунд с 7
ELECTRONIX ©2004-2016