Dark

MpaKus Dominion - блог о кино, музыке и веб-программировании

несколько жизненных трендов

Previous Entry Поделиться Next Entry
Дочитывая книгу, тут подумалось об Objective C...
Dark
mpak666
Objective C В общем-то я нахожу чутка времени и почитываю, изучаю Objective C уже как бы с прицелом на разработку, потому вникаю в детали.

В целом если понимать, что внутри это все тот же C, то все эти циклы, указатели, указатели на указатели, разыменование, header файлы и препроцессоры, все как бы знакомо, прям такая ностальгия, когда вспоминаю как дико перся в свое время по Сишным извращениями с WinAPI.

Но ведь еще и Objective C, там же объекты, интерфейсы, наследование и т.п. То что вызовов метода у классов и объектов нет и синтаксис кажется странным сперва, но дело просто привычки и восприятия, каюсь сам не могу привыкнуть, вот как пример.
rec = [[NSMutableArray alloc] init];
на деле это можно было представить как
rec = NSMutableArray.alloc().init();
не такая уж глобальная проблема, конечно точеные вызовы привычнее (они кстати есть в Objective C но только для свойств объекта)

Ну а записи вида
[@"Hi man!" writeToFile:@"file.txt" atomically:true encoding:NSUTF8StringEncoding error:&error_callback];
тоже не сложно воспринимать, если абстрагироваться от сообщений, а пока думать методами, То первое всегда метод, к нему первое значение его типа, а вторым идет некий ХЭШ параметров
"Hi man!".writeToFile("file.txt", atomically:true, encoding:NSUTF8StringEncoding, error:&error_callback);

В целом мыслительно читаемо и воспринимаемо именно так.

Но хочу подвести одну мысль, не зря ведь появился RubyMotion, да и в целом я вообще удивлен, почему вокруг Objective C еще нет какого-либо синтаксического сахарка, хотя бы сахарка, не обязательно даже как RM который реальный компилятор уже сразу, без сахара. А что-нибудь например MacJavaScript когда пишешь на JS, отлаживаешь на JS, а это транслируется в Objective С, который в свою очередь уже компиляется в маш. коды.
Просто удивительное поле, когда внесение бы старого языка очень бы даже ободрило платформу, интерес и легион разработчиков.

Конечно не помешали бы некоторые сразу корректировки, пусть сахарного языка даже не затрагивая основы Foundation.
Например:
- Тот же Ruby например. Ну ARC и подсчет сылок в жестко типизированном языке это замечательно, но на мой взгляд чем больше выбор инструментария и языков, тем ведь и софта больше и эффективность его разработки. Я бы с удовольствием писал на Ruby к примеру, где бы просто хорошенько спрятали Foundation, а то уж слишком у RubyMotion он прет наружу, что до него сперва надо все равно освоить весь базис, что не совсем опять же комфортно, когда ты вроде и так весь доволен stdlib, а надо опять думать о строках в NSString и т.п.
- Namespace, ну ладно если уж все спрятать под покров стандартных классов и методов не удается, то хотя бы для красоты и понятности вынести все в NS::MutableArray хотя я не понимаю, почему бы сразу обычные ["hello", "world"] сразу не сахаризовать в изменяемые массивы.
- Мелкая нелогичность Foundation. Ну вот например выше строка
[@"Hi man!" writeToFile:@"file.txt" atomically:true encoding:NSUTF8StringEncoding error:&error_callback];
Тут получается ведь, что это строке @"Hi man!" шлют сообщение на то чтобы записать этот объект в файл, то есть у NSString инстанса есть метод writeToFile... Э, это мягко говорят не очень привычно, что в Си мы привыкли
FILE *f = fopen('file.txt');
fputs('Hello man!', fp)

и уже с его хэндлером работать, что в Ruby например
file = File.open 'file.txt', 'w'
file.puts 'Hello man!'

Тут как бы со всем этим прозрачно, есть объект Файл, у него есть все методы для работы с ними. Я понимаю, что в Foundation есть NSFileManager где тоже все методы для работы с файлами, но тогда зачем опять же методы для записи в файл и даже URL есть, но что эти методы делают в строках и массивах? Как бы не очень правильно, имхо. Тем более для хэша который сам еще потом в xml файл сериализуется, как-то зерна и плева замешаны в одну бочку.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]){
    @autoreleasepool {
        NSMutableDictionary *rec;
        NSMutableArray *db = [[NSMutableArray alloc] init];
        
        rec = [NSMutableDictionary dictionary];
        [rec setObject:@"MpaK" forKey:@"user"];
        [rec setObject:@"info@mrak7.com" forKey:@"email"];
        [db addObject:rec];

        rec = [NSMutableDictionary dictionary];
        [rec setObject:@"Satan" forKey:@"user"];
        [rec setObject:@"boss@lucifer-hell.com" forKey:@"email"];
        [db addObject:rec];
        
        NSLog(@"db %@", db);
        
        [db writeToFile:@"/Users/mpak/www/users.db" atomically:true];
    }
    return 0;
}


В общем-то видимо хочется, что-то в духе "писать на прозрачно на Ruby классах (без всяких там NS*, только в редких супер случая), но на выходе получать нормальное osx и ios приложение). Но пока как погляжу по непонятной мне причине "сахарных" проектов вокруг Objective C равно НУЛЮ, удивительно почему?

Но в целом язык не вызывает недоумения, все грамотно и если втянуться во все эти цепочки указателей, сообщений и интерфейсов то жить можно. XCode довольно приятное IDE и главное, что я нашел "темную" тему ;)
У Apple в общем-то четкий мануал, не хуже того же MSDN (RSDN кто что любит).
Но вот получать от этого языка удовольствие? Хм, пока таких ощущений нет, язык как язык, никаких "WOW! это же круто и прикольно", пока нету :( Язык как язык, без "вау эффекта".


  • 1
Пробовал, впечатления двоякие. В целом нравится, из сухого Ц сделали более-менее конфетку, навернув события и обернув в какой-никакой сахар. Если аналогичное что-то рассматривать, то получилось лучше чем gtk/gdk/.. (я про ООП-шный стиль при строго процедурной реализации, но тут пиздец конечно задумка, простить можно), но хуже чем Qt (тут вообще прекрасный пример производства конфетки из говна Ц++), имхо. Ну оно и понятно, в таких вопросах коммерческая подоплёка сильно видна. По документации особенно в том числе. ВинАпи тоже туда же, но всё же оно куда как более древнее, ему простительно. Но я по чистопроцедурному винапи конкретно тащился в своё время, огроменные гуи рисовал на чистом си, любил боль.

Ну Objective C уже не совсем сахар, это же не препроцессор, нормальный и отдельный язык, как C++ я бы так сравнил.
GTK/QT это уже же фрэймворки, у ObjC тоже есть что противопоставить как понимаю это Cocoa, но до него я еще не дошел, потом сравнить пока не могу.

Ну я понимаю, я намеренно стёр грань между язык<-->сахар<-->стандбиблиотека+фреймворк) Извне не всегда понятно где эта грань. Понятно что ObjC довольно древний отдельный язык, но по сути он ведь обратно совместим с Си, емнип? И изначально тоже вырос из него ведь, получив надмножество всяких плюшек, как вот Qt который помимо фреймворка всё же набор макросов, сигналы, и прочее и прочее, что тоже выглядит как совсем другой язык, нежели Цпп. Реализовано чуть по другому, чем objC на данный момент, да какая разница) Ну а гтк это по сути аналогично + конкретно низкоуровневый ООП какой-то жуткий)

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

Что это не язык, это видно, что его можно юзать из других языков как Python например.

Просто если его сравнивать, то не с Objective C, это не корректно, а надо с Cocoa (Cocoa Touch) и набором этих UI* классов тогда будет более в тему.

Ну а в целом Qt пока неудел, у него нечего предложить под ios и os x.

  • 1
?

Log in

No account? Create an account