Цветные программисты

color_programmers
Нет, тут не будет расизма, девелоперы из страны Ганди могут спать спокойно.

За годы работы iOS-девелопером мне приходилось сотрудничать с кодерами разным скилов, привычек и философий. Каждый пишет “по-своему”, используя свой личный сорт MVC, OOP и других скандально известных парадигм. Ну не видел я пока-что идеального кода. ИМХО, никогда и не увижу. Так вот когда получаешь такой код в наследство, первым делом начинаешь материть своего предшественника, каким же он был говнокодером и все делал не так и что ты сейчас сделаешь в 100 раз лучше. Я не буду вдаваться в подробности рефакторинга, так как статья не об этом.

Еще очень давно, как только первый раз нажал Run в XCode, мне пришлась по душе его дефолтная подсветка. Локальная переменная – синяя, свойство класса – зеленое, дефайн – коричневый, говнокод – черный. (Да простят меня хипстеры с черной цветовой схемой). Вот так и зародилась идея класифицировать девелоперов по цветам в зависимости от их кода.

И так. Для примера возьмем всем известный dataSource-метод UITableView. Задача – сделать кастомную UITableViewCell.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

1). Программист синий.

  • Что он сделает: не будет сабклассить, напишет метод на 3 екрана.
  • Его плюсы: код легко переносится в другие проэкты
  • Его минусы: код плохо читаемый, дубликаты.

Пример:


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier];

 cell.textLabel.font=[UIFont boldSystemFontOfSize:14];
 cell.selectionStyle=UITableViewCellSelectionStyleNone;

 // TextField
 UITextField *textField =[[UITextField alloc] initWithFrame:CGRectMake(90, 13, cell.contentView.frame.size.width-90, 20)];
 textField.autoresizingMask=UIViewAutoresizingFlexibleWidth;

 textField.font = [UIFont boldSystemFontOfSize:14.0f];
 textField.returnKeyType=UIReturnKeyDone;
 textField.delegate = self;

 textField.autocorrectionType=UITextAutocorrectionTypeNo;
// textField.inputAccessoryView=self.keyboardToolbar;

 [cell.contentView addSubview:textField];
 textField=nil;
 }

 UITextField *textField = [cell.contentView.subviews lastObject];
 textField.tag = indexPath.row;

//defaults for all
 textField.secureTextEntry=NO;
 textField.keyboardType=UIKeyboardTypeDefault;
 textField.inputView=nil;
 textField.clearButtonMode=UITextFieldViewModeWhileEditing;

 if (indexPath.row==0){
 cell.textLabel.text=@"email";
 textField.keyboardType=UIKeyboardTypeEmailAddress;
 textField.autocapitalizationType= UITextAutocapitalizationTypeNone;
 textField.text=@"krivoblotsky@me.com";

 }
 return cell;
}

2). Программист зеленый. (выбор редакции)

  • Что он сделает: сделает сабкласс UITableViewCell, всю логику вынесет туда.
  • Его плюсы: код легко читаемый и выглядит элегантно.
  • Его минусы: код проблематично переносить, так как прийдется перетаскивать свои сбаклассы.

Пример:


#import "EmailCell.h"

// Customize the appearance of table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

NSString *cellIdentifier = [EmailCell reuseIdentifier];

EmailCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil) {

cell = [[EmailCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellIdentifier];

}

cell.textField.text = @"krivoblotsky@me.com";

return cell;

}

3). Программист коричневый. (да, да, есть и такие)

  • Что он сделает: сделает сабкласс UITableViewCell, всю логику вынесет туда. Все это завернет в #define для “удобства”.
  • Его плюсы: не нашел
  • Его минусы: постоянно падают индексы в XCode, невозможно найти откуда растут ноги.

Пример:


#import "EmailCell.h"

#define kReuseID      [EmailCell reuseIdentifier]

#define kReusableCell [tableView dequeueReusableCellWithIdentifier:kReuseID]

// Customize the appearance of table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

EmailCell *cell = kReusableCell;

cell.textField.text = @"krivoblotsky@me.com";

return kReusableCell;

}

4). Программист черный. 

  • Что он сделает: наделает синтаксических ошибок и его код не будет компилироваться.
  • Его плюсы: не нашел
  • Его минусы: сплошные

Заключение. Я отношусь к зеленому типу iOS-программистов и в моем коде всегда больше зеленого чем других оттенков. “Если код всречается больше чем раз – дeлаем сабкласс”.

Скорее всего такие же оттенки применимы и к другим платформам, но с их цветовыми схемами я не знаком.

А какого цвета программист ты?

P.S.
Спасибо @maximz85 за иллюстрацию к статье.

Google+0LinkedIn0Twitter0Facebook0

3 thoughts on “Цветные программисты

  1. Наследование – это самый очевидный вид повторного использования кода и самый плохой. Для того чтобы его обойти придумали “паттерны проектирования”. И да паттерны, это не только синглтон и NSNotificationCenter. Очень рекомендую книгу “head first”. Там наглядно рпсписано почему наследование это плохо.
    Ну “у каждого свое ООП и МВЦ” – это не серьёзно, типа как “у каждого свой objective-c” ;)

    1. Ну я ведь и не говорил, что наследование – это панацея и идеальный код:)

      Ну “у каждого свое ООП и МВЦ” – это не серьёзно, типа как “у каждого свой objective-c” ;)

      Верно, но практике всегда по-другому, каждый видит парадигмы со своей стороны, я в этом не раз убеждался. Да и Objective-C в какой-то мере у всех разный, это как спорить о переносе открывающей скобки:)
      Я считаю, что программеры должны не один год работать рядом, что бы сойтись во всех мнениях и codestyle.

  2. Есть альтернативное мнение на счет наследования. Можно жить без него, почти без него.
    Попробуйте заменить все наследование на агрегирование, а в качестве базовых классов использовать только `NSObject`, `UIVIew`, `UIViewController`.
    Если рука тянется отнаследоваться от вашего же класса – значит где-то косяк.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>