Каковы недостатки использования Python вместо Objective-C? - PullRequest
14 голосов
/ 01 февраля 2010

Я знаю немного Python, и я действительно впечатлен простотой использования языка. Из того, что я видел в Objective-C, он выглядит гораздо менее красиво, но, похоже, это lingua franca для разработки под Mac OS X (что означает, что у него лучшая документация).

Я подумываю начать разработку для Mac - сделает ли PyObjC + Python меня гражданином второго сорта?

Ответы [ 8 ]

36 голосов
/ 01 февраля 2010

Да.

Во-первых, как вы заметили, вся документация написана для Objective-C, который является совершенно другим языком.

Одно отличие заключается в имени метода. В Objective-C, когда вы отправляете сообщение (Python сказал бы «вызов метода») объекта, имя метода (селектор) и аргументы смешиваются:

NSURL *URL = /*…*/;
NSError *error = nil;

QTMovie *movie = [QTMovie movieWithURL:URL
    error:&error];

Это невозможно в Python. Ключевые аргументы Python не считаются частью имени метода, поэтому, если вы сделали это:

movie = QTMovie.movieWithURL(URL, error = ???)

вы получите исключение, потому что класс QTMovie не имеет метода с именем movieWithURL; сообщение в примере Objective C использует селектор movieWithURL:error:. movieWithURL: и movieWithURL будут двумя другими селекторами.

Они никак не могут это изменить, потому что аргументы ключевых слов в Python не упорядочены. Предположим, у вас есть гипотетический метод с тремя аргументами:

foo = Foo.foo(fred, bar=bar, baz=baz)

Теперь это вызывает foo:bar:baz:, верно?

Не так быстро. Foo также может иметь метод с именем foo:baz:bar:. Поскольку аргументы ключевых слов Python не упорядочены, возможно, вы вызываете этот метод. Точно так же, если вы попытались позвонить foo:baz:bar:, вы можете на самом деле позвонить foo:bar:baz:. В действительности этот случай маловероятен, но если он когда-либо случится, вы не сможете надежно вызвать любой из методов.

Итак, в PyObjC вам нужно вызвать метод, подобный этому:

movie = QTMovie.movieWithURL_error_(URL, ???)

Вам может быть интересно узнать ??? C не допускает множественных возвращаемых значений, поэтому в Objective-C аргумент error: принимает указатель на переменную-указатель, и метод будет хранить объект в этой переменной (это называется возврат по ссылке). Python не имеет указателей, поэтому способ, которым мост обрабатывает подобные аргументы, заключается в том, что вы передаете None, и метод (кажется, возвращает) кортеж. Итак, правильный пример:

movie, error = QTMovie.movieWithURL_error_(URL, None)

Вы можете видеть, как даже простой пример отличается от того, что документация может показать вам в Objective-C.

Есть и другие проблемы, такие как GIL. Приложения какао станут только более параллельными, и вы захотите в этом разобраться, особенно с такими заманчивыми классами, как NSOperation. И GIL - серьезная ответственность, особенно на многоядерных машинах . Я говорю это как парень из Python (когда не пишу для Какао). Как демонстрирует Дэвид Бизли в этом видео, это холодный, жесткий факт; отрицать это невозможно.

Итак, если бы я собирался переключиться с Objective-C на мои приложения, я бы взял MacRuby . В отличие от PyObjC и RubyCocoa, сообщения объектам Какао не пересекают языковой мост; это базовая реализация Ruby в Какао с языковыми расширениями для лучшей поддержки написания кода Какао.

Но это слишком далеко впереди. Вы только начали. Начните с Objective-C. Лучше избегать всех несоответствий импеданса между языком, который вы используете, и языком, для которого написана документация, сохраняя их на одном языке.

Кроме того, вам будет сложнее диагностировать некоторые ошибки (например, сообщения умершим объектам), не зная, как работает Objective-C. Вы будете писать эти ошибки как новый программист Какао, независимо от того, на каком языке вы пишете код.

Итак, изучите C, затем изучите Objective-C. Знание того и другого не должно занять более нескольких недель, и в конце вы будете лучше подготовлены ко всему остальному.

Я не буду вдаваться в то, как я выучил C; Достаточно сказать, что я не рекомендую, как я это сделал. Я слышал, что эта книга хороша, но я никогда не владел и не читал ее. У меня есть эта книга , и я могу подтвердить, что это хорошо, но это также не для Mac; пропустите главу о том, как скомпилировать код, и вместо этого используйте Xcode.

Что касается Objective-C: Книга Хиллегаса является самой популярной, но я ее не использовал. (Я просмотрел его, и он выглядит хорошо.) Я прочитал документ Apple на языке , а затем сразу же приступил к написанию небольших приложений Какао. Я прочитал некоторые из руководств со смешанными результатами. Существует учебник по конвертации валют , но он мне совсем не помог, и не совсем отражает современное приложение Cocoa. (Современные приложения по-прежнему используют розетки и действия, но также и привязки, а реалистичный конвертер валют - это почти пара привязок.)

18 голосов
/ 01 февраля 2010

Это действительно говорит само за себя:

Как сопровождающий PyObjC для почти 15 лет скажу прямо. использование Objective-C. Вам нужно будет знать Objective-C, чтобы действительно понять какао во всяком случае и PyObjC просто собирается добавить слой ошибок и проблем, которые Чужие 99% программистов Какао.

комментарий в ответе на этот вопрос . Этот вопрос тоже интересен.

3 голосов
/ 01 февраля 2010

НЕ ПЫТАЙТЕСЬ , чтобы избежать изучения цели C, если вы собираетесь писать приложения для Mac. Цель PyObjC и других языковых привязок состоит в том, чтобы позволить вам повторно использовать существующие библиотеки в своих приложениях, а не избегать изучения собственных инструментов.

2 голосов
/ 01 февраля 2010

Гражданин второго класса кажется немного сильным. API Objective-C также доступны в Python, если они вам нужны, и это в основном, если вы хотите создавать приложения Cocoa. Но тогда они ограничены OS X в любом случае. Лично меня не интересует создание приложений, которые не являются кроссплатформенными, но это я. Это также означает, что я на самом деле этого не делал, поэтому я не знаю, насколько это сложно, но недавно в журнале Python была статья, и она не выглядела так ужасно.

Основным недостатком Python является время выполнения, и в основном это происходит из-за его динамического языка. Эту проблему можно решить с помощью расширений Cython и C и т. Д., Но затем вы получите сочетание Python + ObjectiveC API + Cython, что может быть пугающим.

Так что многое зависит от того, какие приложения вы собираетесь делать. Что-то уникальное в OSX, что не имеет никакого смысла где-то еще? ObjectiveC, вероятно, билет. Кроссплатформенные серверы, ну тогда Python рулит! Что-то другое? Тогда это зависит.

0 голосов
/ 21 сентября 2010

Нет, вам не нужно знать Цель C, вам не нужно использовать PyObjC, и вы не будете гражданином второго сорта.

Если вы не хотите делать что-то чрезвычайно специфичное для платформы MAC, кодирование в Objective C или использование PyObjC - действительно плохая идея.

Причина очевидна: после того, как вы идете по маршруту objc, вы попрощаетесь с другими платформами. Это так просто.

Apple не хочет, чтобы вы кодировали для других платформ, точно так же, как Microsoft не хочет, чтобы вы кодировали для других платформ. И именно поэтому все больше и больше разработчиков обращаются к языкам с открытым исходным кодом, таким как python, java, ruby ​​и т. Д. Поскольку вам не важно, что такое Apple и Microsot, вам нужно только приложение, которое является наиболее полезным и простым в разработке. А сделать ваше приложение доступным только для MAC сделает его менее полезным, и, очевидно, разработка в Objective C намного сложнее.

В Python более чем достаточно библиотек, чтобы вместить вас, многие из них доступны для платформы Mac. Я, например, разрабатываю новое приложение в Pygame, нет, это не игра, если бы я сделал то же самое в ObjC или PyObj, мне пришлось бы переписать код для Windows и Linux. Хотя с Pygame мой код работает точно так же в Windows и Linux, хотя моя основная платформа MacOS.

Это привлекательность большинства библиотек Python, они кроссплатформенные. WxPython - еще один пример, кто-то упомянул, что «он выглядит не совсем естественно», вы хотите, чтобы это не позволило вам сделать ваше приложение доступным для Windows и Linux. Зачем ограничивать себя только на платформе MAC? Как вы думаете, обычному пользователю будет важно, как будет выглядеть ваше приложение. Даже приложения Macos не выглядят нативно, многие из них представляют собственный графический интерфейс. Не то, чтобы WxPython не выглядел на 100% нативно, то, как вы кодируете, всегда importnat.

Objc имеет смысл, когда вы собираетесь разрабатывать для Iphone OS, так как Apple посчитала отличной идеей исключить python (и не только python), даже если они были вынуждены включать javascript (иначе веб-серфинг стал бы кошмаром для iphoneos). Пижама может сделать Python доступным и для операционной системы iphone (без взлома или взломанного телефона), но с очевидными ограничениями, поскольку он переводит код python в javascript, но все еще является действительным решением, пока Apple не решит, что исключение python из ОС iphone является действительно плохая идея.

текст ссылки

Хотя изучение Цели С не принесло вреда. Вы всегда можете использовать нативные библиотеки через pyobjc.

Но чтобы быть абсолютно искренним с вами, если мое приложение зашло в тупик с библиотеками python (очень маловероятный сценарий), я бы скорее обернул существующие кроссплатформенные библиотеки C / C ++ с Cython, чем пошел бы по пути target c pyobjc и уничтожить кроссплатформенность моего приложения. Последнее, что я хотел бы использовать, это что-то платформенное, специфицированное.

Теперь, если вы вообще не заботитесь о других платформах, тогда, я думаю, Objective C может быть правильным выбором. Это, конечно, выглядит ужасно, но я слышал, что чем больше вы его используете, тем лучше, и есть много людей, которые предпочитают его C / C ++.

0 голосов
/ 02 февраля 2010

В качестве дополнительной опции учтите, что wxPython может создавать довольно неплохие приложения для Mac, а также для Linux и Windows. По большей части вы можете получить собственный внешний вид, но поддерживать мобильность, практически не обращая внимания на проблемы, связанные с платформой.

Другими словами, PyObjC + Python является , а не единственным способом разработки Mac с Python.

0 голосов
/ 01 февраля 2010

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

Итак, сначала изучите ObjC. Если в вашем втором или третьем проекте, или через год, вы начнете проект, который нуждается в модуле Python (например, Twisted или SQLAlchemy. Но СЕРЬЕЗНАЯ потребность нужна как основа для вашего приложения, где дополнительный импульс) ваше приложение делает все, что стоит), тогда вы можете написать приложение PyObjC и получить множество преимуществ в скорости этого языка, имея свой опыт в Какао.

0 голосов
/ 01 февраля 2010

Это то, что мне самому интересно, и хотя я надеюсь, что кто-то придет с большим опытом, из того, что я знаю, вы не будете серьезно ограничены самим Python. Наряду с Java и GCC, Python является отличным способом написания нативных кроссплатформенных приложений. Как только вы это освоите, вы сможете отобразить пример кода в Objective C на ваш код Python.

Поскольку у вас есть доступ ко всем библиотекам и событиям, все, что вы можете сделать в Objective C, будет в Python. Конечно, чем больше вызовов и функций только для OS X вы используете, тем менее простым будет перенос на другую платформу, но это не относится к делу. Обычно графическое программирование и работа с драйверами устройств являются своего рода ограничивающим фактором - но в обоих случаях я нахожу доказательства хорошей поддержки и библиотек сообщества (поиск Python и Quartz, Lightblue, libhid, PyUSB, для некоторых примеров). *

Решающим фактором для меня будет: какой уровень инструментов и поддержки IDE необходим. Apple предоставляет отличное программное обеспечение для создания нового программного обеспечения, но опять же с чем-то вроде Pydev у вас есть отличное место для написания кода на Python! http://pydev.org/

Так что попробуйте, я уверен, что вы не пожалеете об этом, и будет сообщество поддержки, на которое можно обратиться за помощью и вдохновением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...