Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Результаты опроса: Нравится ли Гото, используете ли вы его
Да 21 37.50%
Нет 35 62.50%
Голосовавшие: 56. Вы ещё не голосовали в этом опросе

 
 
Рейтинг 5.00/43: Рейтинг темы: голосов - 43, средняя оценка - 5.00
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390

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

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

вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а почему?очень нужная вещь,иногда лучше использовать это чем циклы
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2010, 13:42
Ответы с готовыми решениями:

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

TCHAR + float != дружба или плохой wsprintf
вот столкнулся с проблемой перевода float числа в строчку и наоборот: TCHAR milage; ...

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

49
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
01.04.2010, 23:22  [ТС]
Atrus, а причем тут это все Оо
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
02.04.2010, 00:30
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
12 / 12 / 2
Регистрация: 08.07.2009
Сообщений: 45
02.04.2010, 02:29
M128K145

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

***
Как насчет массива элементов jButton?
А параметры каждой кнопки можно из конф. файла считывать.
А метод станет размером в 12 строк(Что конечно как вы правильно заметили не главное, но все-равно очень приятно).
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
02.04.2010, 13:47
goto запутывает код: делает переходы неочевидными и неудобочитаемыми. Если метка на другой странице, то как это прочитать ? Если требуется goto, значит проект составлен очень плохо или его нет вовсе. Надо делать упор не на оправданности goto, а на хорошем проекте.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.04.2010, 14:46
Цитата Сообщение от Airhand Посмотреть сообщение
goto запутывает код: делает переходы неочевидными и неудобочитаемыми.
Не надо обощать. Аккуратно написанный goto сэкономит время людям, которые будут читать этот код. А искусствено воткнутые процедуры читабельность ухудшают.

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

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

Не по теме:

Evg, :Dя его знаю:D

0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3618 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
02.04.2010, 21:30
Atrus, это был всего лишь немного подредактированный копипаст сгенерированого кода NetBeans и отправленный в Eclipse , Вопрос, почему все визуальные конструкторы не набивают массивы/вектора, а задают жестко(MS VS C#/MFC/CLR/J#, NetBeans Java)? Но это уже оффтоп

По теме. Сравните два кода
Бинарные числа! Перевод простого числа в бираное и расчет.
Что будет выведено на экран?
И сделайте для себя вывод, goto - это хорошо или плохо. Или по вашему в первом коде лучше использовать циклы?
0
12 / 12 / 2
Регистрация: 08.07.2009
Сообщений: 45
03.04.2010, 03:07
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 не отделаться

0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
03.04.2010, 04:14
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, создав еще пару бесконечных циклов и условий, но читать код стало бы сложнее
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
03.04.2010, 11:05  [ТС]
Цитата Сообщение от HIMen Посмотреть сообщение
Конечно, можно было и обойтись без goto, создав еще пару бесконечных циклов и условий, но читать код стало бы сложнее
да да...думаю goto begin; лучше чем while(true){...break;}

Добавлено через 14 секунд
и на 2 скобок меньше
0
12 / 12 / 2
Регистрация: 08.07.2009
Сообщений: 45
03.04.2010, 12:11
Вообще мне тоже кажется, что 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?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.04.2010, 13:15
Цитата Сообщение от Atrus Посмотреть сообщение
Я только привел пример грамотного выхода из сильновложенных циклов и все.
Я бы не стал утверждать, что это "грамотный" выход. Это скорее "искусственный" выход. Конкретно в твоём маленьком примере может быть и было бы проще использовать функцию. Но если алгоритм сложный, а переменных много, то искусственное вырезание части алгоритма в отдельную функцию только ухудшит читабельность. Поэтому я бы не стал называть такой выход "грамотным", ибо это не универсальное средство, а лишь для некоторых частных случаев
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
03.04.2010, 13:41
Цитата Сообщение от HIMen Посмотреть сообщение
Вот пример из первого попавшегося проекта
В этом примере есть switch - тоже признак плохого проектирования. Давайте впадём в крайность и ещё применим тут goto. У нас же не стоит задача сделать программу как можно хуже.

МедведЪ
Давай ещё всунем goto. Проект уже плохой, нам уже терять нечего.
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
03.04.2010, 15:00
Цитата Сообщение от Atrus Посмотреть сообщение
А оператор goto? Какой еще оператор goto?
Atrus, ну сделай такой же код без goto: не забудь про try-catch и что функция не может возвращать значения, т.к. это подпись на событие
Цитата Сообщение от Airhand Посмотреть сообщение
switch - тоже признак плохого проектирования
Ну не знаю насколько плохого, но IL инструкций со switch явно меньше, как и в случае с goto
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
03.04.2010, 15:41  [ТС]
Цитата Сообщение от Airhand Посмотреть сообщение
Давай ещё всунем goto. Проект уже плохой, нам уже терять нечего
в какой
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.04.2010, 15:59
Цитата Сообщение от Airhand Посмотреть сообщение
В этом примере есть switch - тоже признак плохого проектирования
Жжошь не по детски
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2010, 15:59

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

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

Хороший стиль программирования
Здравствуйте, меня интересует как правильно создаются архитектуры игр. К примеру: у меня есть класс ObjectsCore и Objects В классе...

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru