Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
Результаты опроса: Нравится ли Гото, используете ли вы его
Да 21 37.50%
Нет 35 62.50%
Голосовавшие: 56. Вы ещё не голосовали в этом опросе

 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.81
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,338
Завершенные тесты: 1
#1

Хороший или плохой тон программирования - C++

28.03.2010, 13:42. Просмотров 5510. Ответов 49
Метки нет (Все метки)

вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а почему?очень нужная вещь,иногда лучше использовать это чем циклы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2010, 13:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хороший или плохой тон программирования (C++):

"Ляпы" в программе. Хороший стиль программирования - C++
Здравствуйте, уважаемые форумчане! Я на счет хорошего стиля программирования. Сделал маленькую программу. Эксперты ее осмотрели и...

TCHAR + float != дружба или плохой wsprintf - Visual C++
вот столкнулся с проблемой перевода float числа в строчку и наоборот: TCHAR milage; wsprintf(milage,"%f\0",Machines.Mileage);//3й...

Плохой проект - Visual C++
Нужна небольшая помошь, в общем вот проект, созданный в Вижуал Студио 2008, язык вроди бы С++. Цель проекта на сколько я понял...

Объединять классы и внешние функции в одной программе плохой тон программирования? - C++
Доброго времени суток! Преподаватель в институте задал определённую задачу, однако не определил разрешённые возможности. Сказал только -...

Хороший тон программирования - C++
Можно ли считать хорошим тоном в программировании? Например вот такой вот код? #define FOR for(int a=0;a<10;a++) ........ FOR ...

Хороший тон для #include - C++
Простите за глупый вопрос, но всё же интересно знать ответ :) Есть 2 заголовочных файла. 1.h #include <vector> ... // и т.д. ...

49
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.03.2010, 12:59 #16
Цитата Сообщение от Evg Посмотреть сообщение
Запросто. Многие компиляторы с языков, отличного от Си, работают через конвертацию из языка в Си (либо на уровне текстового фала, либо на уровне промежуточного представления). Си++, Паскаль, Фортран - всё это легко конвертируется в Си. В результате и получается такой код, истыканный конструкциями goto. Если посмотреть результат работы утилит типа lex, yacc, bison - на выходе они тоже генерят код Си, в котором тьма-тьмущая операторов goto
На бейсике я так вручную пишу.

Добавлено через 38 секунд
Цитата Сообщение от МедведЪ Посмотреть сообщение
тема создана в разделе С++,не в разделах бейсик и паскаль
Извините, тему прочитал, а раздел - нет.
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,338
Завершенные тесты: 1
29.03.2010, 16:27  [ТС] #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Извините, тему прочитал, а раздел - нет.
=)
___
0
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
01.04.2010, 22:22 #18
Что касается выхода из сильно вложенных циклов, не проще ли использовать return вместо goto?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo()
{
    for (i=0; i<n;++i)
    {
        for (j=0; j<m;++j)
        {
            for (k=0; k<z;++k)
            { 
                //и ни каких goto
                if (array1[i,j,k]==10) return;
            }
        }
    }
}
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,338
Завершенные тесты: 1
01.04.2010, 22:28  [ТС] #19
Atrus, в этом случае выходит вообще из функции,а если работа функции не завершена

Добавлено через 1 минуту
Atrus, да и еще,если у вас функция возвращает void,то есть ничего не возращает,то писать ретурн это ошибка
0
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
01.04.2010, 23:05 #20
Нет. Это не ошибка. попробуйте скомпильте этот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
void foo()
{
    int a=1;
    if (a==1) return;
    cout<<"hello"; // в эту строчку мы никогда не попадем
}
 
int main()
{
    foo();
    return 0;
}

Цитата Сообщение от МедведЪ Посмотреть сообщение
а если работа функции не завершена
Тогда это,скорее всего, очень плохая функция. Или очень плохой алгоритм. Или и то и другое.
Вообще, если функция больше 20 строчек, то это уже повод задуматься о декомпозиции. А если делать по 100-150 строчек функцию, то такой способ программирования от "лапши" ничем отличаться не будет. Можно тогда в принципе функции не использовать.
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,338
Завершенные тесты: 1
01.04.2010, 23:22  [ТС] #21
Atrus, а причем тут это все Оо
0
M128K145
Эксперт С++
8293 / 3513 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
02.04.2010, 00:30 #22
Atrus, будет интересно посмотреть как вы напишите более менее серьезный проект. Просто прежде чем повторять чью-то фразу - надо понимать, что это всего лишь рекомендация и не более. Приведу простой пример, один
метод
Java
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
    private void initComponents() {
 
        mainFrame = new javax.swing.JFrame("Calculator");
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        jButton7 = new javax.swing.JButton();
        jButton8 = new javax.swing.JButton();
        jButton9 = new javax.swing.JButton();
        jButton10 = new javax.swing.JButton();
        jButton11 = new javax.swing.JButton();
        jButton12 = new javax.swing.JButton();
        jButton13 = new javax.swing.JButton();
        jButton14 = new javax.swing.JButton();
        jButton15 = new javax.swing.JButton();
        jButton16 = new javax.swing.JButton();
        jButton17 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField(10);
        empty = new javax.swing.JLabel();
 
        mainFrame.setSize(428, 200);
        mainFrame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
      
        jButton1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton1.setSize(40, 23);
        jButton1.setLocation(272, 45);
        jButton1.setText("1");
 
        jButton2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton2.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton2.setSize(40, 23);
        jButton2.setLocation(318, 45);
        jButton2.setText("2");
        
        jButton3.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton3.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton3.setSize(40, 23);
        jButton3.setLocation(364, 45);
        jButton3.setText("3");
        
        jButton4.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton4.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton4.setSize(40, 23);
        jButton4.setLocation(272, 74);
        jButton4.setText("4");
 
        jButton5.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton5.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton5.setSize(40, 23);
        jButton5.setLocation(318, 74);
        jButton5.setText("5");
 
        jButton6.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton6.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton6.setSize(40, 23);
        jButton6.setLocation(364, 74);
        jButton6.setText("6");
 
        jButton7.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton7.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton7.setSize(40, 23);
        jButton7.setLocation(272, 103);
        jButton7.setText("7");
 
        jButton8.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton8.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton8.setSize(40, 23);
        jButton8.setLocation(318, 103);
        jButton8.setText("8");
 
        jButton9.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton9.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton9.setSize(40, 23);
        jButton9.setLocation(364, 103);
        jButton9.setText("9");
 
        jButton10.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton10.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton10.setSize(86, 23);
        jButton10.setLocation(272, 132);
        jButton10.setText("0");
 
        jButton11.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton11.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton11.setSize(40, 23);
        jButton11.setLocation(364, 132);
        jButton11.setText(".");
 
        jButton12.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton12.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton12.setSize(40, 23);
        jButton12.setLocation(226, 45);
        jButton12.setText("/");
 
        jButton13.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton13.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton13.setSize(40, 23);
        jButton13.setLocation(226, 74);
        jButton13.setText("*");
        
        jButton14.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton14.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton14.setSize(40, 23);
        jButton14.setLocation(226, 103);
        jButton14.setText("-");
 
        jButton15.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton15.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton15.setSize(40, 23);
        jButton15.setLocation(226, 132);
        jButton15.setText("+");
 
        jButton16.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton16.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton16.setSize(40, 23);
        jButton16.setLocation(180, 45);
        jButton16.setText("(");
 
        jButton17.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton17.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jButton17.setSize(40, 23);
        jButton17.setLocation(180, 74);
        jButton17.setText(")");
 
        jTextField1.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        jTextField1.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        jTextField1.setFont(new java.awt.Font("Tahoma", 0, 18));
        jTextField1.setSize(393, 27);
        jTextField1.setLocation(12, 12);
        
        mainFrame.getContentPane().add(jButton1);
        mainFrame.getContentPane().add(jButton2);
        mainFrame.getContentPane().add(jButton3);
        mainFrame.getContentPane().add(jButton4);
        mainFrame.getContentPane().add(jButton5);
        mainFrame.getContentPane().add(jButton6);
        mainFrame.getContentPane().add(jButton7);
        mainFrame.getContentPane().add(jButton8);
        mainFrame.getContentPane().add(jButton9);
        mainFrame.getContentPane().add(jButton10);
        mainFrame.getContentPane().add(jButton11);
        mainFrame.getContentPane().add(jButton12);
        mainFrame.getContentPane().add(jButton13);
        mainFrame.getContentPane().add(jButton14);
        mainFrame.getContentPane().add(jButton15);
        mainFrame.getContentPane().add(jButton16);
        mainFrame.getContentPane().add(jButton17);
        mainFrame.getContentPane().add(jTextField1);
        mainFrame.getContentPane().add(empty);
        
        mainFrame.setVisible(true);
    }
на java. Думаете стоит задуматься о его декомпозиции? Забудьте те заученные фразы и поступайте исходя из личного опыта. Если повторять все время старые советы, то ничего нового изобрести нельзя будет. Как в той истории "Он просто не знал, что задача была нерешаемой"
0
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
02.04.2010, 02:29 #23
M128K145

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

***
Как насчет массива элементов jButton?
А параметры каждой кнопки можно из конф. файла считывать.
А метод станет размером в 12 строк(Что конечно как вы правильно заметили не главное, но все-равно очень приятно).
0
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
02.04.2010, 13:47 #24
goto запутывает код: делает переходы неочевидными и неудобочитаемыми. Если метка на другой странице, то как это прочитать ? Если требуется goto, значит проект составлен очень плохо или его нет вовсе. Надо делать упор не на оправданности goto, а на хорошем проекте.
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,184
Записей в блоге: 27
02.04.2010, 14:46 #25
Цитата Сообщение от Airhand Посмотреть сообщение
goto запутывает код: делает переходы неочевидными и неудобочитаемыми.
Не надо обощать. Аккуратно написанный goto сэкономит время людям, которые будут читать этот код. А искусствено воткнутые процедуры читабельность ухудшают.

И не надо говорить, что goto запутывают код. Есть гении, которые способны запутать код на ровном месте одними лишь арифметическими операциями. А потому читабельность кода зависит от наличия мозга, а не от наличия goto
1
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
02.04.2010, 14:57 #26
В общем случае, goto добавляет мест, которые нужно держать в памяти, а она не безгранична.

Как один из пунктов УМЕНЬШЕНИЯ удобочитаемости можно сформулировать так: "применяйте везде goto". Это ещё не значит, что нельзя запутать прогу не применяя goto.
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,184
Записей в блоге: 27
02.04.2010, 15:01 #27
Цитата Сообщение от Airhand Посмотреть сообщение
В общем случае, goto добавляет мест, которые нужно держать в памяти, а она не безгранична
А зачем общий случай? Я пишу конерктную программу с конерктно втсавленным оператором goto, который делает программу более понятной, нежели искусственные попытки принципиального написания без goto.
0
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
02.04.2010, 15:06 #28
Нужно не программу принципильно менять, а переделывать проект. Значит что-то в нём плохо, раз понадобился goto. Я ни в коем случае не говорю, что надо принципиально от него отказаться. Дело не в принципе.
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,184
Записей в блоге: 27
02.04.2010, 15:08 #29
Цитата Сообщение от Airhand Посмотреть сообщение
Значит что-то в нём плохо, раз понадобился goto
Мде... Чем-то ты мне напоминаешь другого участника форума, который помешан на linux'е
0
AnonymC
02.04.2010, 20:28  [ТС]     Хороший или плохой тон программирования
  #30

Не по теме:

Evg, я его знаю

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2010, 20:28
Привет! Вот еще темы с ответами:

Хороший стиль программирования: где размещать константы? - C++
Здравствуйте, уважаемые форумчане! Давно хотел спросить. У меня есть проект, состоящий из множества файлов исходного кода. В...

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

Дурной тон программирования - Программирование
Часто слыщу такую фразу, вот и интересно, кто что по этому поводу думает. Что можно отнести к такого роду программированию? И вообще можно...

Вложенные классы - это хороший стиль программирования, или лучше по-отдельности? - Java
Hi, All! Вложенные классы - это хороший стиль программирования, или лучше, чтобы каждый класс был отдельно ? Или это зависит от...


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

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

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