1. Objective C / Говнокод #11316

    −92

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 29 Июня 2012

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

    • ну всё, пошло obj-говно в массы
      Ответить
    • Кстати, а что в ObjectiveC делают квадратные скобки?
      Ответить
      • сигналы посылают как в Small Talk
        Ответить
        • А со стороны это очень похоже на необязательные аргументы:
          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; просто отсутствует)
      Ответить

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