Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
interpol
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
1

Совет по оформлению кода

24.01.2015, 13:38. Просмотров 939. Ответов 16
Метки нет (Все метки)

Есть программа, работает нормально. Обрабатывает из файла двумерный массив и выводит измененный (минимальный элемент ниже главной диагонали меняется с максимальным выше главной диагонали) в другой файл. Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <clocale>
#include <fstream>
#include <cstdlib>
 
struct OpenClose
{
    std::ifstream fin;
    std::ofstream fout;
};
 
void OpenFile_1(OpenClose &c)
{
    c.fin.open("array.txt");
    if (!c.fin.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
 
void OpenFile_2(OpenClose &c)
{
    c.fout.open("new_array.txt");
    if (!c.fout.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
 
int** CreateArray(int** arr, int &size)
{
    for (int j = 0; j < size; j++)
    {
        arr[j] = new int[size];
    }
    return arr;
}
 
void InPutArray(OpenClose &c, int** arr, int &size)
{
    
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            c.fin >> arr[i][j];
        }
    }
 
}
 
void ChangeArray(int** arr, int &size)
{
    int min = arr[1][0];
    int max = arr[0][size];
    int points[4];
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if (i != j && j < i)
            {
                if (arr[i][j] < min)
                {
                    min = arr[i][j];
                    points[0] = i;
                    points[1] = j;
                }
            }
            else if (i != j && j>i)
            {
                if (arr[i][j] > max)
                {
                    max = arr[i][j];
                    points[2] = i;
                    points[3] = j;
                }
            }
        }
    }
    int tmp = arr[points[2]][points[3]];
    arr[points[2]][points[3]] = arr[points[0]][points[1]];
    arr[points[0]][points[1]] = tmp;
}
 
void OutPutArray(OpenClose &c, int** arr, int &size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            c.fout << arr[i][j] << " ";
        }
        c.fout << "\n";
    }
}
 
void CloseFile_1(OpenClose &c)
{
    c.fin.close();
}
 
void CloseFile_2(OpenClose &c)
{
    c.fout.close();
}
 
void DeleteArray(int** arr, int &size)
{
    for (int i = 0; i < size; i++)
    {
        delete[] arr[i];
    }
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    OpenClose m;
    m.fin;
    m.fout;
    OpenFile_1(m);
    OpenFile_2(m);
 
    int size;
    std::cout << "Введите размерность квадратной матрицы ";
    std::cin >> size;
    int **arr = new int*[size];
    CreateArray(arr, size);
    InPutArray(m, arr, size);
    ChangeArray(arr, size);
    OutPutArray(m, arr, size);
    CloseFile_1(m);
    CloseFile_2(m);
    DeleteArray(arr, size);
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2015, 13:38
Ответы с готовыми решениями:

Нужна конструктивная критика по оформлению и читабельности кода (Game Trainer C++)
Относительно недавно начал изучать C++. Для обучения решил написать трейнер...

нужен совет по написанию кода
Здравствуйте уважаемые программисты начинающие и специолисты у меня к вам очень...

Спрашиваю совет по стилю написания кода
#include &lt;vector&gt; #include &lt;string&gt; class Errors { private: size_t...

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

Нужен совет в компоновки этого кода, что-бы работал как одна программа
С клавиатуры вводится текстовая строка. Разработать программу, реализующая...

16
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
24.01.2015, 13:52 2
Ну если функции слишком простые и вызываются по одному разу, то можно и без них.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
24.01.2015, 14:02 3
Цитата Сообщение от interpol Посмотреть сообщение
Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
Все это делается на случай необходимости в дальнейшем поддерживать код, вносить изменения, доработки.

Да и твой код есть куда улучшать.

К примеру мне не понятно чем обосновано наличие двух ф-ций OpenFile_1() и OpenFile_2() ну и структуры OpenClose.
Кроме того ф-ции это хорошо но в инструментарии с++ есть еще классы.

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

Да и твой код есть куда улучшать.

К примеру мне не понятно чем обосновано наличие двух ф-ций OpenFile_1() и OpenFile_2() ну и структуры OpenClose.
Кроме того ф-ции это хорошо но в инструментарии с++ есть еще классы. Т.е твой код написан больше в стиле Си нежели С++


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Array
{
   public:
       Array(std::size_t size);
       ~Array();
 
       bool loadFromStream(const std::istream& stream);
       bool saveToStream(std::ostream& stream);
 
       bool loadFromFile(std::string fileName);
       bool saveToFile(std::string fileName);
 
        // ....
    private:
       int ** data_;
       // ...
}
 
void changeArray(Array& array);
1
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
24.01.2015, 14:52 4
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата Сообщение от interpol Посмотреть сообщение
Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
1. Не делать без необходимости.
2. Монолитная простыня текста хуже читается, нежели разбитая на абзацы-функции.

В вашем случае реализацию функций можно даже и не смотреть.
Глаза сразу же находят main()

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

В итоге, несколько строчек в main дают полное представление о том, что делает программа.

Далее, зная, что хотел автор кода, реализация функций читается легко и просто: ведь читатель уже знает, зачем и как они все будут использованы.

В общем, бить код на функции - хорошая практика.

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

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

Поэтому, техника копипасто-ориентированного программирования рекомендует: "истина где то там, а гармония как всегда в золотой середине".
2
interpol
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
24.01.2015, 14:54  [ТС] 5
До классов, к сожалению, я еще не дошел. Но скоро с ними столкнусь. Можете посоветовать какой-нибудь конкретный источник, где достаточно внятно описаны самые основы по классам?
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
24.01.2015, 15:36 6
Одной "книгой" не ограничится, как в прочем и одним "чтением"
Шилд, Дейтелы, Страуструп собственно все есть тут Литература C++

Что такое анти-паттерны?

Добавлено через 26 минут
Можно писать и без классов тогда у твоего кода такие проблемы:
1. Вероятно все функции стоило вынести в отдельный модуль (*.h +*.cpp)
2. Объединение файловых потоков в OpenClose не логично, да и само название структуры сам понимаешь...
3. Нет необходимости в OpenFile_1 и OpenFile_2. Во первых можно было бы написать одну ф-цию и избежать дублирования.
C++
1
2
3
4
5
6
7
8
9
void openFile(std::fstream& fStream,const std::string& fileName)
{
    fStream.open(fileName.c_str());
    if (!fStream.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
И вызывать ее для каждого файла. Но это так для размышления, вряд ли вообще стоит писать ф-ции в "две строчки" что бы вызывать их всего дважды да и как бы назначение ф-ций немного различное (типы потоков разные - один для чтения другой для записи)
4.
C++
1
int** CreateArray(int** arr, int &size)
Зачем size передавать по ссылке если ты его не меняешь?
Зачем возвращать int** ?
1
The535
26 / 26 / 18
Регистрация: 16.01.2014
Сообщений: 161
24.01.2015, 19:30 7
Не стал читать код, отвечу сразу на вопрос.
Старайтесь писать больше функций. Понадобится в ООП и в общем в будущем.
0
rocknrolla1
Заблокирован
24.01.2015, 20:06 8
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если функции слишком простые и вызываются по одному разу, то можно и без них.
Плохой совет, имхо, т.к. код будет выглядеть ужасно.
SOLID принципы никто не отменял в хорошем проектировании, пусть проектируются не классы, но учиться нужно на маленьком.
Да и, если захочется вызвать функцию повторно или задача немного изменится, то придется все оформлять в функции.
Короче говоря, одна функция - одна задача.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
24.01.2015, 21:40 9
Цитата Сообщение от rocknrolla1 Посмотреть сообщение
Плохой совет
А какой совет хороший? Каждый оператор в свою функцию выносить? В приведённой программе функций больше, чем нужно. А расширять эту учебную программу никто не будет.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
24.01.2015, 21:49 10
Цитата Сообщение от nmcf Посмотреть сообщение
А какой совет хороший?
не пренебрегать SOLID.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
24.01.2015, 21:50 11
SOLID? А где классы?
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
24.01.2015, 21:51 12
Цитата Сообщение от nmcf Посмотреть сообщение
SOLID? А где классы?
А что, обязательно должны быть?
0
rocknrolla1
Заблокирован
24.01.2015, 21:52 13
Цитата Сообщение от nmcf Посмотреть сообщение
А расширять эту учебную программу никто не будет
Вот так и "рождаются" плохие программисты.
Знаете, при работе над проектами часто слышишь такого рода высказывания. А потом все переписывать приходится, как только руководство захотело расширить функционал.
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
24.01.2015, 21:56 14
SOLID относится к ООП.
Я пишу о конкретной программе, в которой даже закрытия файлов вынесены в функции и это лишнее.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
24.01.2015, 22:13 15
Цитата Сообщение от nmcf Посмотреть сообщение
SOLID относится к ООП.
SOLID - это просто пятерка принципов, следование которым позволяет сохранять оопнутый проект в более менее приличном состоянии.

Однако, если бы вы дали себе труда с ними ознакомиться, вы бы верно заметили, что его можно (и нужно) применять по отношению к любой парадигме, как минимум, которую включает в себя ООП.

Например, по отношению к процедурной.

Цитата Сообщение от nmcf Посмотреть сообщение
Я пишу о конкретной программе, в которой даже закрытия файлов вынесены в функции и это лишнее.
Конкретно в этой программе само разделение кода на "абзацы" не вполне оптимальное.
Но в целом, автор этого кода мыслит в правильном направлении.
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2015, 22:46 16
да вполне нормально. тут недавно была тема, где автор жаловался на то, что
функции по работе с файлами не бросают исключения, когда пытаются открыть
пустой файл. вот в такого рода функциях-обертках как раз самое место для кода
по дополнительной проверке чего-нибудь.
0
Avazart
Эксперт С++
7723 / 5632 / 549
Регистрация: 10.12.2010
Сообщений: 25,402
Записей в блоге: 17
24.01.2015, 23:35 17
Цитата Сообщение от nmcf Посмотреть сообщение
А какой совет хороший? Каждый оператор в свою функцию выносить? В приведённой программе функций больше, чем нужно. А расширять эту учебную программу никто не будет.
Я собственно и написал что нужно исходить из перспективы, а если перспективы нет - то скомпилил проверил и забыл.

Но дело в том что как правило перспектива есть (не helloWorld!) и тогда стоит задача "угадать" эту перспективу. Может стоит сразу к примеру писать целую библиотеку по работе с матрицами с плотным применением классов и шаблонов да еще в расчете на кроссплатформенность и опираясь на другие библиотеки.
0
24.01.2015, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2015, 23:35

Нужен совет по оформлению
Добрый день господа разработчики. Хочу спросить совета по оформлению странички....

Нужен совет по оформлению страницы
Вопрос - как создать эффект помех на странице сайта? Что нужно использовать?...

Соглашения по оформлению кода
Всем привет! Вот какой вопрос есть... где можно найти и существует ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru