Субъективный Си / Говнокод #13893 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
recognizer = [SMRecognizerConvNet alloc];
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                                 (unsigned long)NULL), ^(void) {
            recognizer = [recognizer init];
            loaded = true;
            
            DLog(@"recognizer loaded");
        });

Спонадобилось воскресить один старый проект, а там нашлось такое...

Запостил: tirinox tirinox, (Updated )

Комментарии (6) RSS

  • Отлично вообще, поди по всему классу расставлены проверки
    if (!loaded)
    {
    // Okay 🙁
    }
    Ответить
    • Хуже то, что объект аллочится сразу, а инициализируется где-то когда-то асинхронно, при этом он продолжает быть доступен все это время неинициализированным.

      И да, проверки есть 🙂
      Ответить
      • А можно код этого init'а выложить, чую что не просто так его асинхронно запускать решили, может там не менее эпичный говнокод?
        Ответить
        • Говно, конечно, но не такое. По сути тупо загрузка большого файла. И зачем пришло в голову мешать C++ и Obj-C?...
          SMNeuralNetwork *LoadNetwork(NSString *fileName)
          {
              NSBundle *b = [NSBundle mainBundle];
              NSString *dir = [b resourcePath];
              NSArray *parts = [NSArray arrayWithObjects:
                                dir, fileName, (void *)nil];
              NSString *path = [NSString pathWithComponents:parts];
              const char *cpath = [path fileSystemRepresentation];
              
              SMNeuralNetwork *net = [SMNeuralNetwork neuralNetwork];
              
              std::ifstream stream(cpath, std::ios::binary | std::ios::in);
              [net loadFromBinaryStream:stream];
              stream.close();
          
              
              return net;
          }
          
          @implementation SMRecognizerConvNet
          
          - (id) init
          {
              if((self = [super init]))
              {
                  result = -1;
                  
                  dataSize = 4 * SM_TEXTURE_H * SM_TEXTURE_W * sizeof(ccColor4B) * CC_CONTENT_SCALE_FACTOR() * CC_CONTENT_SCALE_FACTOR();
                  inputBuffer = (ccColor4B *) malloc(dataSize);
                  memset(inputBuffer, 0, dataSize);
          
                  [self randomizeNet];
                  netw = [LoadNetwork(@"neural-net.bin") retain];
              }
              return self;
          }
          Ответить
          • Да тут целая кунсткамера! Есть и char * строки, и кастование nil в void * (зачем?) и передача этого добра в NSArray, и C++ iostream.
            А что касается метода init, то более извращенного способа загрузить картинку в cocos2d даже представить трудно! Причем автор учел и ретина разрешение, и позаботился о количестве бит на пиксель (хотя эта проверка сделана неправильно и выглядит глупо, я про sizeof(ccColor4B)).
            Хоть метод init и содержит только выделение памяти под эту картинку, могу предположить, что непосредственно загрузка происходит считыванием картинки с диска побайтно.
            Метод LoadNetwork реализован вне класса как C функция, что тоже мягко говоря не хорошо, на крайний случай можно было и статическим методом сделать, но внутри класса.
            И на последок, retain результата C функции, хоть формально и верно, но от этого не легче.
            Мда...
            Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8