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

C++

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

 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.81
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
#1

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

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

вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а почему?очень нужная вещь,иногда лучше использовать это чем циклы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2010, 13:42     Хороший или плохой тон программирования
Посмотрите здесь:
Объединять классы и внешние функции в одной программе плохой тон программирования? C++
C++ Хороший тон программирования
Хороший тон для #include C++
Хороший стиль программирования: где размещать константы? C++
Visual C++ TCHAR + float != дружба или плохой wsprintf
C++ "Ляпы" в программе. Хороший стиль программирования
Первый язык программирования на подходе к С++: Паскаль или С? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
02.04.2010, 21:30     Хороший или плохой тон программирования #31
Atrus, это был всего лишь немного подредактированный копипаст сгенерированого кода NetBeans и отправленный в Eclipse , Вопрос, почему все визуальные конструкторы не набивают массивы/вектора, а задают жестко(MS VS C#/MFC/CLR/J#, NetBeans Java)? Но это уже оффтоп

По теме. Сравните два кода
Бинарные числа! Перевод простого числа в бираное и расчет.
Что будет выведено на экран?
И сделайте для себя вывод, goto - это хорошо или плохо. Или по вашему в первом коде лучше использовать циклы?
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
03.04.2010, 03:07     Хороший или плохой тон программирования #32
M128K145
Эй, эй, обождите! Я разве хоть где-то говорил, что ненавижу goto? Я только привел пример грамотного выхода из сильновложенных циклов и все. Так что претензия не по адресу.
Что же касается вашего примера, то тут я не вижу особых причин goto использовать:

C++
1
2
3
4
5
6
7
cinp:
    std::cin>>p;
    if((p <= 0) || (p > size))
    {
        std::cout<<"Введите число от 1 до "<<size<<"!\n>";
        goto cinp;
    }
C++
1
2
3
4
5
6
do 
    {
        std::cout<<"Введите число от 1 до "<<size<<"!\n>";
        std::cin>>p;
 
    } while ((p<=0) || (p>size));
В данном случае примеры равнозначны. Да, goto действительно не нарушает границы областей видимости и не портит читабельность. Но я все-равно не понимаю зачем он здесь нужен. Разве что только в силу привычки.

***
M128K145

Не по теме:

я понял, что это кодогенератор, но что это меняет? Сапер, например, тоже на элементах типа Button реализован. Для поля 10х10 понадобится 100 кнопок. Вы его тоже без массивов делать будете?

Цитата Сообщение от M128K145 Посмотреть сообщение
почему все визуальные конструкторы не набивают массивы/вектора
Потому, что они визуальные конструкторы, а не ИИ. Откуда им знать, что вы собрались делать калькулятор. Именно поэтому к формошлепству надо всегда аккуратно подходить. Все эти кодогенераторы удобны для создания оконных интерфейсов низкой и средней сложности. А вот калькулятор в этом плане штука менее тривиальная. И тут простым drag&drop не отделаться

HIMen
4129 / 1378 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
03.04.2010, 04:14     Хороший или плохой тон программирования #33
Goto как и любой другой оператор: если применен в правильном месте облегчает и написание, и восприятие кода.
Вот пример из первого попавшегося проекта
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
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
    try
    {
    begin:
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            var fileName = saveFileDialog1.FileName;            
            if (fileName == openedFile)
            {
                MessageBox.Show("Файл используется,\r\nвыберите другое название", "Файл используется");
                goto begin;
            }
            var strFilExtn = fileName.Remove(0, fileName.Length - 3);
            switch (strFilExtn)
            {
                case "bmp":
                    Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);
                    break;
                case "jpg":
                    Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                    break;
                case "png":
                    Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
                    break;
                case "gif":
                    Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);
                    break;
                default:
                    throw null;
            }
        }
    }
    catch
    {
#if DEBUG
        Console.WriteLine("catched save");
#else
        MessageBox.Show("При сохранении файла\r\nпроизошла ошибка", "Ошибка");
#endif        
    }
}
Конечно, можно было и обойтись без goto, создав еще пару бесконечных циклов и условий, но читать код стало бы сложнее
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
03.04.2010, 11:05  [ТС]     Хороший или плохой тон программирования #34
Цитата Сообщение от HIMen Посмотреть сообщение
Конечно, можно было и обойтись без goto, создав еще пару бесконечных циклов и условий, но читать код стало бы сложнее
да да...думаю goto begin; лучше чем while(true){...break;}

Добавлено через 14 секунд
и на 2 скобок меньше
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
03.04.2010, 12:11     Хороший или плохой тон программирования #35
Вообще мне тоже кажется, что goto лучше чем break +флаг +условие. Хуже последнего вообще ничего придумать нельзя. Но в данном примере,как мне думается, совсем необязательно смотреть на то, как файл героически пытается сохраниться.
Во время отладки(или если кто-то другой решит изучить код) это будет абсолютно бесполезной информацией. Скрыть это все в функцию и засунуть эту функцию в самый низ, чтоб не мешала! Читабелность такой программы в разы вырастает.
Короче как-то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool save_my_file()// эту функцию засунуть куда подальше
{
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        var fileName = saveFileDialog1.FileName;            
        if (fileName == openedFile)
        {
            MessageBox.Show("Файл используется,\r\nвыберите другое название", "Файл используется");
            return false;
        }
    return true;
}
 
int main()
{
//по названию функции save_my_file() программист поймет, что она делает. А большего и не нужно.
    while ( !save_my_file() );
    return 0;
}
А оператор goto? Какой еще оператор goto?
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,928
Записей в блоге: 26
03.04.2010, 13:15     Хороший или плохой тон программирования #36
Цитата Сообщение от Atrus Посмотреть сообщение
Я только привел пример грамотного выхода из сильновложенных циклов и все.
Я бы не стал утверждать, что это "грамотный" выход. Это скорее "искусственный" выход. Конкретно в твоём маленьком примере может быть и было бы проще использовать функцию. Но если алгоритм сложный, а переменных много, то искусственное вырезание части алгоритма в отдельную функцию только ухудшит читабельность. Поэтому я бы не стал называть такой выход "грамотным", ибо это не универсальное средство, а лишь для некоторых частных случаев
Airhand
502 / 458 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
03.04.2010, 13:41     Хороший или плохой тон программирования #37
Цитата Сообщение от HIMen Посмотреть сообщение
Вот пример из первого попавшегося проекта
В этом примере есть switch - тоже признак плохого проектирования. Давайте впадём в крайность и ещё применим тут goto. У нас же не стоит задача сделать программу как можно хуже.

МедведЪ
Давай ещё всунем goto. Проект уже плохой, нам уже терять нечего.
HIMen
4129 / 1378 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
03.04.2010, 15:00     Хороший или плохой тон программирования #38
Цитата Сообщение от Atrus Посмотреть сообщение
А оператор goto? Какой еще оператор goto?
Atrus, ну сделай такой же код без goto: не забудь про try-catch и что функция не может возвращать значения, т.к. это подпись на событие
Цитата Сообщение от Airhand Посмотреть сообщение
switch - тоже признак плохого проектирования
Ну не знаю насколько плохого, но IL инструкций со switch явно меньше, как и в случае с goto
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
03.04.2010, 15:41  [ТС]     Хороший или плохой тон программирования #39
Цитата Сообщение от Airhand Посмотреть сообщение
Давай ещё всунем goto. Проект уже плохой, нам уже терять нечего
в какой
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,928
Записей в блоге: 26
03.04.2010, 15:59     Хороший или плохой тон программирования #40
Цитата Сообщение от Airhand Посмотреть сообщение
В этом примере есть switch - тоже признак плохого проектирования
Жжошь не по детски
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
03.04.2010, 20:02     Хороший или плохой тон программирования #41
Цитата Сообщение от Airhand Посмотреть сообщение
В этом примере есть switch - тоже признак плохого проектирования
Отличная мысль! А как же, такой вариант куда более читабельный и соответствует отличному проектированию! Да, он отличный, но отличный от нормального здравого рассудка.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
if(strFilExtrn.Equals("bmp"))
    Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);
else
    if(strFilExtrn.Equals("jpg"))
        Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
    else
        if(strFilExtrn.Equals("png"))
            Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
        else
            if(strFilExtrn.Equals("gif"))
                Bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);
            else
                throw null;
А ведь задумайтесь, если бы switch и goto были бы настолько плохими как вы о них думаете, то они бы не переходили бы из языка в язык. И поверьте, зря в Java убрали goto, приходится выкручиваться так
Java
1
2
3
4
5
6
Label:
for(;;)
{ 
    ...
    break Label;
}
а это не очень удобно

Цитата Сообщение от Atrus Посмотреть сообщение
Эй, эй, обождите!
Atrus, моя последняя фраза адресовалась пользователю Airhand
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
03.04.2010, 23:04     Хороший или плохой тон программирования #42
HIMen, Туплю. Согласен.
Evg, это отнюдь не искусственный способ. И очень часто гораздо более удобный чем goto. А вы зря боитесь дробить алгоритм на несколько маленьких подфункций. Это не запутывает, а наоборот упрощает работу. Не всегда, конечно, но очень часто.В случае 3-х 4-х вложенных циклов почти всегда есть оправданная возможность декомпозиции.
Касательно переменных. Если пользоваться классами, то такая проблема сама собой отпадет. Ибо полностью отпадает надобность в переменных глобальных. В качестве примера мой клас решающий СЛАУ содержит 3 переменные и массив в привате и по 0-2 локальных переменных на функцию.
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,928
Записей в блоге: 26
03.04.2010, 23:52     Хороший или плохой тон программирования #43
Цитата Сообщение от Atrus Посмотреть сообщение
Не всегда, конечно, но очень часто
Вот ты и сам ответил на собственной возражение. Спор пошёл из-за того, что Airhand начал утверждать, что goto - признак плохого проектирования.

Цитата Сообщение от Atrus Посмотреть сообщение
Касательно переменных. Если пользоваться классами, то такая проблема сама собой отпадет. Ибо полностью отпадает надобность в переменных глобальных. В качестве примера мой клас решающий СЛАУ содержит 3 переменные и массив в привате и по 0-2 локальных переменных на функцию
Полная ерунда. У тебя есть некая функция, которая на вход принимает вектор значений и на выходе формирует вектор значений (типа преобразования фурье). Внутри себя функция содержит локальные переменные (куда записываются промежуточные значения). ЗАЧЕМ в этом месте создавать класс? Более того, зачем затаскивать в класс воспомогательные переменные, которые вообще свойствами класса не являются?

Добавлено через 57 секунд
P.S. Преобразование фурье привёл чисто для того, чтобы понять хараткер функции. Само преобразование делается без goto
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
04.04.2010, 02:07     Хороший или плохой тон программирования #44
Цитата Сообщение от Evg Посмотреть сообщение
Вот ты и сам ответил на собственной возражение
Какой возражение?

Цитата Сообщение от Evg Посмотреть сообщение
ЗАЧЕМ
ifstream - это класс. Он так же на вход принимает массив значений и на выходе формирует вектор значений. И все-таки это класс. И никто не жалуется, что он не реализован одной функцией.
в С++ int, float, long и.т.п это так же классы. Тоже полная ерунда?
Я уверен, что вы пользуетесь компилятором С++ и абсолютно не жалуетесь, что какой-нибудь double является классом.
Почему бы мне не оформить решение СЛАУ в виде класса, ведь это будет гораздо читабельнее за счет декомпозиции, чем 50-70 строк кода щедро усыпанных комментариями и перемежающимся разными сомнительными решениями типа goto или while - break.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2010, 02:51     Хороший или плохой тон программирования
Еще ссылки по теме:
В какой среда программирования(или компиляторе) открыть нижеуказанный код? C++
плохой gets() C++
C++ С++ или С. Какой язык программирования необходимо знать изначально, чтобы далее изучать Objective C?
Visual C++ Плохой проект

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

Или воспользуйтесь поиском по форуму:
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
04.04.2010, 02:51     Хороший или плохой тон программирования #45
Цитата Сообщение от Atrus Посмотреть сообщение
в С++ int, float, long и.т.п это так же классы.
Вы уверены в том, что вы сказали? Впервые слышу, что простые типы - это классы. Даже в полноценных объектно ориентированных языках, таких как Java есть простые типы int, boolean, byte, которые не являются классами. Есть их обертки(это явление называется boxing) Integer, Boolean, Byte - которые являются классами. В С++ далеко не все построено на классах, а уж тем более простые типы.
Yandex
Объявления
04.04.2010, 02:51     Хороший или плохой тон программирования
Ответ Создать тему
Опции темы

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