moevm / oclint_extensions

2 stars 1 forks source link

Критерий - совмещение логики обработки данных и вывода в stdout #11

Open AndrewGavril opened 11 months ago

AndrewGavril commented 11 months ago

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

zmm commented 11 months ago

@AndrewGavril покажите, пожалуйста, пример - как правильно и как не правильно (и желательно возможные исключения из правила:)

AndrewGavril commented 11 months ago

Плохой пример:

void search_time(char** array_text, int *count_sentence){
    for(int i = 0; i < *count_sentence; i++){
        int hours = 0;
        int minutes = 0;
        int seconds = 0;
        int flag = 0;
        char* word;
        while((word = strtok(array_text[i], " ,")) != NULL){
            array_text[i] = NULL;
            if(strstr(word, "sec") != NULL){
                int sec;
                if (sscanf(word, "%dsec", &sec) == 1){
                    seconds += sec;
                    flag = 1;
                }
            }
        }
        if(flag){
        minutes = seconds / 60;
        seconds = seconds % 60;
        hours = minutes / 60;
        minutes = minutes % 60;
        printf("%02d:%02d:%02d\n", hours, minutes, seconds);
        }
    }
}

В данном случае происходит поиск шаблона в строке и преобразования в строку другого вида, совмещенной с выводом в stdout, Последствия такого вывода таковы, что может быть очень сложно найти всю последовательность функций из которых склеивается строка в потоке вывода (к тому же такое решение не будет работать в многопоточном режиме, но к этому курсу это не относится). Лучше так:

#define TIME_STR_LEN 10
void search_time(char** array_text, int *count_sentence){
    for(int i = 0; i < *count_sentence; i++){
        int hours = 0;
        int minutes = 0;
        int seconds = 0;
        int flag = 0;
        char* word;
        while((word = strtok(array_text[i], " ,")) != NULL){
            array_text[i] = NULL;
            if(strstr(word, "sec") != NULL){
                int sec;
                if (sscanf(word, "%dsec", &sec) == 1){
                    seconds += sec;
                    flag = 1;
                }
            }
        }
        char * result_str = NULL;
        if(flag){
          result_str = malloc(TIME_STR_LEN * sizeof(char));
          minutes = seconds / 60;
          seconds = seconds % 60;
          hours = minutes / 60;
          minutes = minutes % 60;
          sprintf(result_str, "%02d:%02d:%02d\n", hours, minutes, seconds);
        }
        return result_str;
    }
}
...
char **process_text(char** array_text, int *count_sentences){
    /* итерации по предложениями */
    char *time_str;
    ...
    time_str = search_time(array_text, i);
    /* конкатенация всех подстрок предложения*/
    retun result_text;
}

/* в отдельной функции вывода результата циклический обход предложений и вывод строк */