Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Оценка кода

28.01.2020, 22:43. Показов 6544. Ответов 123
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу вас всех оценить мой код , по возможности дать советы что так , а что не так и как это исправить либо в каком направлении смотреть , это моя первая попытка создать что-то не ради забавы , а чтобы использовать это в реальной жизни. Сразу скажу что еще не все доделал что хотел бы. Это декодер asn1.der , данные передаются в decode() в виде BLOB конвертированного в массив знаков.
header
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include "string.h"
 
#define ENDOFARRAY -1
 
#define INTEGER 0x02
#define OCTET_STRING 0x04
#define OBJECT_IDENTIFIER 0x06
#define SEQUENCE 0x30
 
#define SETBIT(number,bit) ((number) |= (pow(2,bit)))
#define CHECKBIT(number,bit) ((number) & (1 << (bit)))
 
class decoder{
    public:
        decoder();
 
        ~decoder();
 
        char * decode(const unsigned char * ,int,char * cipherT = nullptr, char * Other = nullptr);
 
        void decode64(const char * ,char * cipherT = nullptr, char * Other = nullptr);
 
    private:
        //Calculates number in power
        int pow(int,int);
 
        char* IntToHexChar(int);
 
        void AppendOctetString(int);
 
        int CalculateLongSID(int&);
 
        //Calculates all decimal values of indentifier
        void CalculateIdentifier(int);
 
        //Calculates first byte of indentifier which is decoded to two values
        void CalculateIdentifierFirstByte();
 
        //Convert byte array to decimal value
        int CalculateBytes(int);
 
        //Decoding encoded ans1.der string
        void ParseData();
 
        //Appends passed array with new array
        char * Append(char *,char *);
 
        //Decodes length of front bytes
        int ParseLength(int);
 
        //Handles Octet String
        void OctetStringHandler();
 
        //Handles Object Indentifier
        void ObjectIdentifierHandler();
 
        //Handles Integer
        void IntegerHandler();
 
        //Handles Sequance
        void SequenceHandler();
 
        //Converts char array to int array
        void ToIntArray();
 
        //Copies value of passed array and returns new created one with same values
        const unsigned char *  NewArr(const unsigned char* );
 
        //Byte array as integers
        int * IntByteArray = nullptr;
 
        //Pointer to IntByteArray which is used to move through array
        int * pArr = nullptr;
 
        //Byte array as char
        const unsigned char * CharByteArray = nullptr;
 
        //The result decoded string
        char * Result = new char[1]{};
 
        //Size of IntByteArray
        int size = 0;
};

cpp
Кликните здесь для просмотра всего текста
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#include "asn1der.h"
 
decoder::decoder(){
}
 
 
decoder::~decoder(){
    if(CharByteArray)
        delete[] CharByteArray;
    if(IntByteArray)
        delete[] IntByteArray;
}
 
 
char * decoder::Append(char * dst,char * src){  
     int dstlen = strlen(dst),srclen =  strlen(src);
     char* temp = new char[dstlen+srclen+1]{};
     memcpy(temp, dst, dstlen);
     strcat(temp,src);
     delete[] dst;
     return temp;
}
 
 
const unsigned char *  decoder::NewArr(const unsigned char* arr) {
    unsigned char * temp = new unsigned char[size+1]{};
    for(int i = 0;i < size;++i){
        temp[i] = arr[i];
    }
    return temp;
}
 
 
void decoder::ToIntArray(){
    IntByteArray = new int[size+1]{};
    for(int i = 0;i<size;++i){
        IntByteArray[i] = (unsigned int)CharByteArray[i];
    }
    IntByteArray[size] = -1;
    pArr = IntByteArray;
}
 
 
void decoder::ParseData(){
    switch (*pArr)
    {
        case ENDOFARRAY:
            break;
        case INTEGER:
            IntegerHandler();
            ParseData();
            break;
        case OCTET_STRING:
            OctetStringHandler();
            ParseData();
            break;
        case OBJECT_IDENTIFIER:
            ObjectIdentifierHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("}"));
            break;
        case SEQUENCE:
            SequenceHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("\n}"));
            break;
        default:
            break;
    }
}
 
 
char * decoder::decode(const unsigned char * Text,int length,char * cipherT, char * Other){
    size = length;
      CharByteArray = NewArr(Text);
      ToIntArray();
      try{
          ParseData();
      }
      catch(const char* exception){
         std::cout << exception;
          return nullptr;
      }
      return Result;
}
 
 
int decoder::ParseLength(int num){
    num &= 63;
    return num;
}
 
 
int decoder::pow(int num, int times){
    if(times == 0)
        return 1;
    if(times == 1)
        return 2;
    if(times > 1)
        return num*pow(num,--times);
}
 
 
int decoder::CalculateBytes(int len){
    int calculated = 0,power = len*8-1;
    for(int i = 0;i < len && ++pArr;i++){
 
        if(*pArr == -1 )
            throw "CalculateBytes error";
 
        for(int q = 7;q >= 0;--q){
            if(CHECKBIT(*pArr,q)){
                calculated += pow(2,power);
            }
            --power;
        }
    }
    return calculated;
}
 
 
void decoder::CalculateIdentifierFirstByte(){ //there are only three types of first node 1,2,3 , first byte is calculated with (firstnode*40 + secondnode)
    if(*++pArr < 80){ //if first byte is less than 80 it means that first node is 1
 
        if(*pArr == -1 )
            throw "CalculateIndentifierFirstByte error";
 
        Result = Append(Result,const_cast<char *>((std::to_string(1) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-40)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else if (*pArr < 120) //means that first node is 2
    {
        Result = Append(Result,const_cast<char *>((std::to_string(2) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-80)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else // first node is 3
    {
        Result = Append(Result,const_cast<char *>((std::to_string(3) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-120)+ ".").c_str()));
        return;
    }
}
 
 
int decoder::CalculateLongSID(int& size) {
  int length = 1, value = 0, SID = 0;
  for (;; ++pArr) {
    if (!CHECKBIT(*pArr, 7)) {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      break;
    }
    else
    {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      value = value << 8;
    }
  }
  for (int i = 0; i < length*8-1; ++i) {
    if(CHECKBIT(value,i)){
        SETBIT(SID,i-i/8);
    }
  }
  size += length-2;
  return SID;
 
}
 
 
void decoder::CalculateIdentifier(int len){
    CalculateIdentifierFirstByte();
    for(int i = 0; i<len && ++pArr ; ++i){
        if(*pArr == -1 || *(pArr+1) == -1)
            throw "CalculateIndentifier error";
        if(!CHECKBIT(*pArr,7)){ //if decimal number consists of only one byte
            Result = Append(Result,const_cast<char *>((std::to_string(*pArr) + ".").c_str()));
        }else //if bit 7 is set it means that length of decimal number in bytes is bigger than one byte
        {
            Result = Append(Result,const_cast<char *>((std::to_string(CalculateLongSID(i)) + ".").c_str()));
        }
    }
}
 
 
char * decoder::IntToHexChar(int number){
    char * hex = new char[3]{};
    int num = number/16;
    for(int i = 0;i < 2;++i)
    switch (num)
    {
    case 15:
        hex[i] = 'F';
        num = number%16;
        break;
    case 14:
        hex[i] = 'E';
        num = number%16;
        break;
    case 13:
        hex[i] = 'D';
        num = number%16;
        break;
    case 12:
        hex[i] = 'C';
        num = number%16;
        break;
    case 11:
        hex[i] = 'B';
        num = number%16;
        break;
    case 10:
        hex[i] = 'A';
        num = number%16;
        break;
    case 9:
        hex[i] = '9';
        num = number%16;
        break;
    case 8:
        hex[i] = '8';
        num = number%16;
        break;
    case 7:
        hex[i] = '7';
        num = number%16;
        break;
    case 6:
        hex[i] = '6';
        num = number%16;
        break;
    case 5:
        hex[i] = '5';
        num = number%16;
        break;
    case 4:
        hex[i] = '4';
        num = number%16;
        break;
    case 3:
        hex[i] = '3';
        num = number%16;
        break;
    case 2:
        hex[i] = '2';
        num = number%16;
        break;
    case 1:
        hex[i] = '1';
        num = number%16;
        break;
    case 0:
        hex[i] = '0';
        num = number%16;
        break;
    default:
        break;
    }
    return hex;
}
 
 
void decoder::AppendOctetString(int length){
     for(int i = 0; i < length && ++pArr;++i){
         char * p = IntToHexChar(*pArr);
         Result = Append(Result,p);
         delete[] p;
     }
}
 
 
void decoder::OctetStringHandler(){
    if(!CHECKBIT(*++pArr,7)){
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" Octet String : { "));
        AppendOctetString(ParseLength(*pArr));
        Result = Append(Result,const_cast<char *>("}"));
    }
    ++pArr;
}
 
 
void decoder::ObjectIdentifierHandler(){
    Result = Append(Result,const_cast<char *>(" OBJECT INDENTIFIED WITH VALUE: { "));
    if(!CHECKBIT(*++pArr,7)){ //if length in one byte
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        CalculateIdentifier(*pArr-1);
    }
    else //behaviour not described
    {
        CalculateIdentifierFirstByte();
        CalculateIdentifier(ParseLength(*pArr));
    }
    ++pArr;
}
 
 
void decoder::IntegerHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ " }").c_str()));
    }
    else
    {
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(CalculateBytes(ParseLength(*pArr))))+ " }").c_str()));
    }
    ++pArr;
}
 
 
void decoder::SequenceHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
            if(*pArr == -1 )
                throw "SequenceHandler error";
 
            Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
            Result = Append(Result, const_cast<char *>((std::to_string(*pArr) + "{ \n\t").c_str()));
      }
    else
    {
        Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ "\n\t").c_str()));
    }
    ++pArr;
}
 
 
void decoder::decode64(const char * Text,char * cipherT, char * Other){
    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2020, 22:43
Ответы с готовыми решениями:

Советы по ускорению работы кода + оценка самого кода
Вчера вечером сел написать 3 консольные программки для работы с шаблонами размножения текста: 1.Выборка групп синонимов(создание словаря)...

Оценка кода
Добрый день! Есть задание в ВУЗе: Я сделал следующий код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int...

Оценка кода
Суть задачи описал вначале кода, хотелось бы услышать, что можно было сделать лучше, где можно было бы написать/описать...

123
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
08.02.2020, 19:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ReYalp Посмотреть сообщение
никто не написал к примеру о exception
ладно я тоже напишу

Привет от гугол:

https://google.github.io/styleguide/cppguide
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
08.02.2020, 19:19
Цитата Сообщение от ReYalp Посмотреть сообщение
в каком виде строку ?
чуть меньше писанины,
но полностью аналогично по работе:
C++
1
2
3
4
5
6
char* IntToHexChar(unsigned char* number)
{   const char  s[] = {"0123456789ABCDEF"};
    number[1] = s[number[0]>>4];
    number[0] = s[number[0]&15];
    return (char*)number;
}
кстати можно и через юнион

Добавлено через 4 минуты
типа так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void IntToHexChar(unsigned char* number)
{   const char  s[] = {"0123456789ABCDEF"};
    number[1] = s[number[0]>>4];
    number[0] = s[number[0]&15];
}
 
void AppendOctetString(int length)
{   for(int i = 0; i < length && ++pArr; ++i)
    {   union
        {   unsigned char c[4];
            int           i   ;
        }a; a.i = *pArr;
    
        IntToHexChar(a.c);
        Result = Append(Result, (char*)a.c);
    }
}
обратите внимание ваша временная строка находится на стеке,
и это здорово!


(ноутест)
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
08.02.2020, 19:41  [ТС]
XLAT, ещё никто не написал о асертах, о том что я не использую смартпоиньеры и тд
0
08.02.2020, 20:07

Не по теме:

Цитата Сообщение от ReYalp Посмотреть сообщение
XLAT, ещё никто не написал о асертах, о том что я не использую смартпоиньеры и тд
Я начал читать код и увидел редкий гавностал (имя класса с маленькой, а методы - паскалькейсом) и решил не комментировать даже.

0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
08.02.2020, 20:09
Цитата Сообщение от ReYalp Посмотреть сообщение
ещё никто не написал о асертах
вряд ли это что-то из ряда вон выходящее:
все студенты поголовно не интересуются тестированием написанного ими же кода.

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

Цитата Сообщение от ReYalp Посмотреть сообщение
смартпоиньеры
всегда придерживайтесь идиомы RAII и чистого OOП
и смарты могут вам ваще и не понадобятся никогда.

ах, да: выучите принципы SOLID, что в 100500 раз важнее любых смартов
при написание кода в 3kk строчек.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.02.2020, 23:20
Цитата Сообщение от XLAT Посмотреть сообщение
всегда придерживайтесь идиомы RAII и чистого OOП
и смарты могут вам ваще и не понадобятся никогда.
...

- всегда придерживайтесь идиомы RAII и чистого OOП
и огурцы могут вам ваще и не понадобятся никогда!

- эээ.... огурцы?

- огурцы.

- как... огурцы вообще коррелируют с RAII и ООП ?

- а никак, зато как звучит! как звучит! что самое главное - чистая правда.

- правда?

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

- нуу.. гипотетически может...

- вот то-то же!
3
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 00:04
Цитата Сообщение от hoggy Посмотреть сообщение
огурцы вообще коррелируют с RAII
- вы скоррелировались с самым толстым огурцом.
- или огурец с вами?
- а может огурец и вы это одно и то же???

1. 10%
2. 10%
3. 80%

hoggy,
если вы не можете вовремя правильно написать деструктор, то книжки вам никак не помогут.
но есть всегда одна надежда: надежда на умные понты.

самое сложное в использовании смартов это подключить нужный инклуд.
но это сделает вас каким то экзотическим овощем и вы не станете от этого умнее,
как были огурцом, так и останетесь.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 00:42  [ТС]
XLAT, мне вот интересно , что делать в случае если я создал какой-то объект в куче но до того как код дошел до момента его уничтожения сработал exception , что делать без смарт поинтеров?
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 01:10
ReYalp,
любитель огурцов вас же просветил в ЛС.
зачем спрашиваете?


ReYalp, вы хотите сказать что при exception у вас не вызовится деструктор?

Цитата Сообщение от ReYalp Посмотреть сообщение
код дошел до момента его уничтожения сработал exception
если вы кидаете исключение в деструктор, то явно тут кто-то должен быть виноват

здорово конеш, когда в нашем лютом гуанокоде есть кому-то о нас позаботиться.
с этим я согласен.

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
если вы не можете вовремя правильно написать деструктор, то книжки вам никак не помогут.
но есть всегда одна надежда: надежда на умные понты.
...
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 01:18  [ТС]
XLAT, причем здесь деструктор? если я создам к примеру int * a = new int(12312312) , потом вызву метод в котороый передам его и в этом методе исключение сработает и в итоге код не дойдет до момента удаления
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 01:28
ReYalp, если вы вызываетете исключение то вы должны его где-то обрабатывать.
Не так ли?
Вы обрабатываете свои исключения?
сорян, вопрос риторический, зачем же вызывать, если не обрабатывать.
тогда напишите такой код, который обработает их правильно.

зы:
выше я вам передавал привет от гугла. вы перевели?
вы понимате, что у них 100500 миллионоc стрококдов?
...
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 01:30  [ТС]
XLAT, тогда выходит что смартпоинтеры не использовать, ексепшенов тоже, что тогда использовать? Ассерты можно?
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 01:37
ReYalp,
да используйте на здоровье.
кто ж вам запрещает?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
09.02.2020, 01:42
XLAT, только что код
C++
1
2
3
4
5
6
    try {
        ClientAgent * newClient = new ClientAgent(GetSocket().Accept());
        Station->AddClient(newClient);//код, который может кинуть исключение
    } //несколько catch'ей. 
    //newClient в них не видно, да и плодить везде его удаление - хреновая идея.
    //то есть ловля исключения не очень-то и помогает
переписал на Scope Guard
C++
1
2
3
4
5
    try {
        auto newClient = std::make_unique<ClientAgent>(GetSocket().Accept());
        Station->AddClient(newClient.get());//код, который может кинуть исключение
        newClient.release();//Всё нормально, отказываемся от владения.
    } //Б - безопасность
2
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 01:50
лично я придерживаюсь такого простого правила.
new и делит использовать за пределами конструктора/деструктора только на грязном то бишь низшем уровне.
типа написания либы для моей приложухи.

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

если у нас есть огурцы и помидоры, у которых только один параметр количество,
то я предпочту написать так:

C++
1
2
3
4
5
6
7
struct Помидор
{   int amount;
};
 
struct Огурец
{   int amount;
};
и тп и тд..
блин тут мысль моя не фига не раскрыта, слишком много текста надо ...
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 01:51  [ТС]
Хотелось бы ещё узнать мнение hoggy и DrOffset по этому поводу)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.02.2020, 01:54
ReYalp, читая такие документы, как google code style, нужно всегда обращать внимание, что они не позиционируют их как догму, они не позиционируют их как наставление для других. Везде употребляется местоимение мы, наша кодовая база, наши условия. Это code style для тех условий, которые сложились в их компании. У каждой компании есть такие, свои, условия. В частности про исключения, которые они в основном не используют, у них написано следующее:
Given that Google's existing code is not exception-tolerant, the costs of using exceptions are somewhat greater than the costs in a new project. The conversion process would be slow and error-prone. We don't believe that the available alternatives to exceptions, such as error codes and assertions, introduce a significant burden.

Our advice against using exceptions is not predicated on philosophical or moral grounds, but practical ones. Because we'd like to use our open-source projects at Google and it's difficult to do so if those projects use exceptions, we need to advise against exceptions in Google open-source projects as well. Things would probably be different if we had to do it all over again from scratch.
Если все еще не понятно, что значит выделенное: я поясню по-русски. Так исторически сложилось, что компания Google не использовала в своей работе исключения. Это можно понять, т.к. исключения не во всех компиляторах поддерживались одинаково хорошо довольно длительное время. Т.к. компания большая и в их продуктах колоссальное количество строк кода, изменить эту ситуацию сейчас не представляется возможным. Цена по внедрению исключений в проект гораздо выше, чем цена отказа от них. А устоявшиеся в компании практики альтернативной обработки исключительных ситуаций не показывают существенного ухудшения по сравнению с исключениями.

Поэтому не надо подменять понятия и считать, будто бы компания отказалась от их использования по причине безусловной "ущербности" исключений как технологии. И уж тем более не следует руководствоваться запретом на исключения в компании Google, как причиной отказа от них в своем проекте. Для вашего проекты вы должны оценивать свои условия, свои исторические и философские причины, а не причины компании Google.
4
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:01  [ТС]
DrOffset, а умные указатели?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.02.2020, 02:07
Цитата Сообщение от ReYalp Посмотреть сообщение
а умные указатели?
Дам немного синтетический, но вполне встречающийся в реальности кейс (в смысле два или более new в конструкторе):
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
class Seq2d
{
public:
    Seq2d(size_t x, size_t y)
        : m_xseq(new int *[x]), m_yseq(new int[x * y]{}), m_xs(x), m_ys(y)
    { 
        for(size_t i = 0; i < x; ++i) 
        {
            m_xseq[i] = &m_yseq[i * y];
        }
    }
    ~Seq2d()
    {
         delete[] m_xseq;
         delete[] m_yseq;
    }
    //..... other methods
 
    int operator()(size_t i, size_t j) const
    {
        return m_xseq[i][j];
    }
    int & operator()(size_t i, size_t j)
    {
        return m_xseq[i][j];
    }
    
    size_t xsize() const
    {
        return m_xs;
    }
    size_t ysize() const
    {
        return m_ys;
    }
    
private:
    int ** m_xseq; 
    int  * m_yseq;
    
    size_t m_xs;
    size_t m_ys;
};
Что будет с памятью по m_xseq, если во время второго в списке выделения памяти (инициализация m_yseq) будет брошено исключение?
Как бы вы это пофиксили?
0
Just Do It!
 Аватар для XLAT
4206 / 2663 / 655
Регистрация: 23.09.2014
Сообщений: 9,060
Записей в блоге: 3
09.02.2020, 02:08
Croessmah,
ок.
я вот что подумал,
надо придумать в своих задачах такой случай, что без эксепшенов никак.
но вряд ли получится: тогда надо придумать такие задачи.
скорее нужно просто так нагуанокодить, чтобы всё же появилась такая необходимость в исключениях.

чертов кисс: если оно не надо, то я и не использую.

а вот с эксепшенами у мя дожны появиться проблемы, которые я уже залатаю умными понтами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2020, 02:08
Помогаю со студенческими работами здесь

оценка кода
Дайте оценку моему коду (https://onlinegdb.com/r1i-i8Cqm), укажите на ошибки

Оценка стиля кода
Народ, есть предложение. Оцените мой код. Не в смысле функционала - в смысле стиля написания. Значится, вот тут есть некий код: bool...

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

Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл
Задание такое Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл. При...

Оценка стиля написания кода
Здравствуйте! Я к вам пожаловал не с очередной проблемой. Код у меня рабочий. Меня интересует то, насколько стандартен мой стиль...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru