четверг, 9 февраля 2012 г.

Сначала думать, потом делать

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

среда, 8 февраля 2012 г.

работа со строками в objective c

Всем известно, что objective c является надмножеством старого доброго С.

Что это может значить для разработчика? Это значит, что язык взял свойства языка-предка, добавил туда свои фичи,  постарался исправить свои недочеты и вуаля! Новый мега-понтовый язык уже готов. Стойте, я сказал недочеты? Да, недочеты. Это, блин, все равно, что взять черную ладу, покрасить в белый свет, поставить туда значок мерседеса и надеяться, что он вдруг станет белым мерином.

Вот простейший пример: есть алфавит, преимущественно латинский, но с добавлением новых букв типа буквы ı (читается как русская ы). Есть правила преобразования, к примеру, предыдущая буква должна трансформироваться в старую добрую i. Дана строка, даны правила преобразования, нужно написать функцию, возвращающую преобразованную строку.

Казалось бы, что проще:

string ret = "";
for (int i = 0; i < str.length; ++i) {
  char ch = str[i];
//тут правила преобразования
  if (ch == 'ı') {
    ch = 'i';
  }
 ret += ch;
}

return ret;

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

Код вполне себе читабелен, не нужно писать поэму, чтобы объяснить компилятору, что ты хочешь сделать.


Строки в сях всегда таили в своих глубинах подводные камни, таким же образом они перекочевали в виде новых фич в objective c.
Перед тем, как я покажу код на языке яблочников, я объясню, в чем будет различие в плане реализации.

  1. Самое главное отличие - это юникодные char-ы. Если чары в джаве уже юникодные  и никаких проблем с сравниванием у нас нет, то в сях == мы уже не можем поставить. Хотя поставить-то поставим, только никакой гарантии, что будет работать, у нас нет.
  2. В objective С к NSMutableString можно добавлять только NSString! Чуваки, на дворе 21 век, почему я должен писать много кода, чтобы попросту работать со строками? Я как ленивый человек, стараюсь делать как можно телодвижений для достижения своей цели и никак не считаю это своим недостатком. Разве сложно предоставить хотя бы аналог stl-ных строк? Слава богу, хотя бы метод appendFormat оставили.
Ну соответсвено, сам код:

    NSMutableString* str = [[NSMutableString alloc] init];
    NSUInteger len = [word length];
    NSUInteger i;

    for (i = 0;i < len; ++i) {
        unichar ch = [word characterAtIndex:i];
          if (ch == 'i') // тут правила, я устал копипастить эту букву
           ch = 'i';
           [str appendFormat:@"%c", &ch];
        }

     return str;


Хотя согласен, переборщил с негативом. Код не так уж сильно и пахнет, надо только привыкнуть писать под него. Кто знает, как бороться с unicode char-ами?

вторник, 7 февраля 2012 г.

айфон или айпад

Очень часто(ну для меня ну очень часто) становится нужно определять, под айпад или айфон пишешь: заточить размеры гуи, контролы поменять и т.д. и т.п.

Сегодня натолкнулся на очень полезный дефайн:


#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

Скучаю по дефайнам и тайпдефам в джаве

А вообще, очень вредно писать код "для всего". Чем больше пишется кода, тем больше приходится делать хаков, чтобы это работало одинаково везде. Так что, compile once, run everywhere - всего лишь слоган астронавтов.