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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	
    self.view.frame=CGRectMake(10,10, 300, 200);
    
	return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	
	static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    // Configure the cell...
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    switch (indexPath.row) {
        case 0:
            //ToDo: Add UserInfo's view into TableView
            [cell.contentView addSubview:upperView];
            break;
        case 1:{
            //Remove preous view/tableview
            for (id vw in cell.contentView.subviews) {
                if ([vw isKindOfClass:[UITableView class]]) {
                    [vw removeFromSuperview];
                }
            }
            //
            
            //Add View which contain tableview
             EditListViewController *editlistvw=[[EditListViewController alloc] initWithNibName:@"EditListViewController" bundle:nil]  ;
            
            editlistvw.view.frame=CGRectMake(10, 10, 300, 20);
            
            [cell.contentView addSubview:editlistvw.tableView];
            //
            break;
        }
        case 2:
            //Remove previous view/tableview
            for (id vw in cell.contentView.subviews) {
                if ([vw isKindOfClass:[UITableView class]]) {
                    [vw removeFromSuperview];
                }
            }
            break;
        default:
            break;
    }
    return cell;
}

Творение индийского джуниора, совместно с которым приходится делать проект

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

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

  • Кстати, а что в ObjectiveC делают квадратные скобки?
    Ответить
      • А со стороны это очень похоже на необязательные аргументы:
        FORMAT том [/FS:файловая_система] [/V:метка] [/Q] [/A:размер] [/C] [/X] [/P:проходы] [/S:состояние]
        Ответить
    • Меня, если честно, в большее недоумение ставят 7 слов после знака минус. Т.е. какое-то из них - явно название метода, а остальные 6 - его тип? пространство имен в котором он объявлен? генерики такие?

      А заодно и вопрос к знатокам Obj-C: а в языке есть какие-нибудь средства / техники для того, чтобы уменьшить количество слов на погонный метр? Просто с чисто типографской точки зрения, Obj-C больше всего на 1С похож изза длиннющих строчек и названий. Даже Ява не такой многословной кажется в сравнении. Ну, чтобы, например задефайнить типа:
      #define SOMETHING = (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
      
      - SOMETHING indexPath { ... }
      ?
      Ответить
      • тут все просто. Тип метода указывается сразу после знака - или + в круглых скобках. Каждый параметр метода идет после двоеточия, а слово перед двоеточием – это метка параметра и она входит в имя метода. Это сделано для улучшения читабельности – в большинстве случаев можно прочитать имя метода и понять что он делает. В данном случае имя метода:
        tableView:cellForRowAtIndexPath:


        Обычно, если параметров больше двух-трех, описание метода разбивается по параметрам и получается примерно так:
        - (void) tableView:(UITableView *)tableView 
           willDisplayCell:(UITableViewCell *)cell 
         forRowAtIndexPath:(NSIndexPath *)indexPath {
           ...
        }

        Аналогично, с вызовами метода:
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                     selector:@selector(keyboardWillShow:)
                                                         name:UIKeyboardDidShowNotification 
                                                       object:nil];
        Ответить
        • А можно, например, для той же читабельности, не писать метки аргументов, а оставить только имена? Просто это ж писанины сколько!.. да и вообще расписать название метода с тремя параметрами на 3 строчки - я думал, что такое ток по неопытности в С++ бывает, когда кто-то переусердствует с const.

          Т.е. в Питоне и Лиспе есть похожие вещи, но там они не обязательны, и собственно, используется для того, чтобы не приходилось забивать аргументы null'ами если нужно использовать только последний из списка.
          Ответить
          • можно, останется просто двоеточие:
            + (Rectangle*)makeRect:(float)x :(float)y :(float)width :(float)height;
            Но так не принято, правильней назвать метод так:
            + (Rectangle*)makeRectWithX:(float)x y:(float)y width:(float)width height:(float)height;

            Выглядит немного странно, да, но опять же, вызовы все же проще читаются. В первом случае будет не сразу понятно, создается ли прямоугольник из координат левой верхней точки и ширины с высотой или из координат двух противоположных точек:
            Rectangle *rect = [Rectangle makeRect:10 :20 :30 :40]

            А во втором да:
            Rectangle *rect = [Rectangle makeRectWithX:10 y:20 width:30 height:40]
            Ответить
            • И весь этот boilerplate только ради того, что кто-то может захотеть видеть переменную внутри функции не так, как ее хотелось бы называть снаружи? Так для таких случаев можно было бы использовать width:(float)w, а для всех остальных по дефолту предположить, что :(float)width имеет метку width...

              [Rectangle makeRectWithX:10 y:20 width:30 height:40]
              Если честно - смотрится как говно.

              [Rectangle makeRect x:10 y:20 width:30 height:40]
              Имхо, смотрелось бы намного приятней и наглядней...

              P.S. Все меньше желания заниматься изучением ObjectiveC...
              Ответить
              • UPD: ну или, если следовать вашему стилю
                [Rectangle makeRectWith x:10 y:20 width:30 height:40]
                Ответить
                • на самом деле "смотрится" практически одинаково 🙂
                  Повторюсь: метка входит в имя метода и это сделано для повышения читабельности – вызов можно буквально прочитать как предложение. И мы говорим о методе с именем makeRectWithX:y:width:height:
                  Ответить
                  • > и это сделано для повышения читабельности
                    Ну вот моему взгляду, не привыкшему к ObjC, легче читать с пробелом. И сигнатуру я бы прочел как makeRectWith:x:y:width:height. Имхо (и это моё имхо), первая метка слитая с именем смотрится ужасно. Мы же, в конце концов, говорим о методе, который выставляет все 4 свойства, а не только Х. Тогда почему Х как-то выделяется среди них?
                    Ответить
                    • x выделяется из-за camelCase. Просто вы просто воспринимаете "метки", как дополнительные штуки в сигнатуре, а это всего лишь части имени, которые располагаются перед соответствующими параметрами
                      Ответить
                      • Т.е. вот этот ваш пример
                        [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardDidShowNotification 
                                             object:nil];

                        читается как add observer selector name object? Что-то скрытого смысла я тут не вижу ;(
                        Видимо плохой пример?

                        > Просто вы просто воспринимаете "метки", как дополнительные штуки в сигнатуре
                        Да, вы правы. Идею я понял, но видимо надо еще привыкнуть к таким названиям.
                        Ответить
                        • Странно, я вчера точно отправлял комментарий...
                          Пример нормальный, это я, пожалуй, немного преувеличил, говоря "буквально". Предлоги все же иногда опускаются, когда они достаточно очевидны. Данный метод читается так: add observer x with selector y for name z from object o.
                          Ответить
                          • Ок. Ну в целом идея ясна. Кстати, а чем отличаются - методы от + методов?
                            Ответить
  • о боги! за что нам такое счастье?))) после индусов лопатами надо "счищать" все эти капролиты кода) сам сейчас работаю над проектом который от такого же гения достался...void методы пытающиеся постоянно что-то вернуть и в противовес им -(someObj*){...} в котороых return something; просто отсутствует)
    Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8