it-swarm.com.ru

Сначала изучите C, прежде чем изучать Objective-C

Будучи начинающим Apple разработчиком, я хочу узнать мнение сообщества, если лучше сначала изучить C, прежде чем переходить к Objective-C и в конечном итоге к Cocoa Framework?

Моя интуиция говорит, учить C, что даст мне хорошую основу.

105
Lark

Я бы выучил C первым. Я изучил C (и многое сделал в C), прежде чем перейти к Obj-C. У меня есть много коллег, которые никогда не были настоящими программистами Си, они начинали с Obj-C и изучали только столько Си, сколько необходимо.

Время от времени я вижу, как они решают проблему полностью в Obj-C, иногда приводя к очень неуклюжим решениям. Обычно я затем заменяю некоторый код Obj-C чистым кодом C (в конце концов, вы можете смешивать их сколько угодно, содержимое метода Obj-C может быть целиком, чистым кодом C). Без какого-либо намерения оскорбить любого программиста Obj-C, в Obj-C есть решения, которые очень элегантны, это решения, которые просто работают (и выглядят) намного лучше благодаря objects (программирование ООП может делать сложные программы намного приятнее, чем функциональное программирование; например, полиморфизм - это отличная особенность) ... и мне действительно нравится Obj-C (гораздо больше, чем C++! Я ненавижу синтаксис C++, а некоторые функции языка просто излишни и приводят к плохим результатам шаблоны развития ИМХО); однако, когда я иногда переписываю код Obj-C моих коллег (и я действительно делаю это только, если я считаю, что это абсолютно необходимо), результирующий код обычно на 50% меньше, ему нужно только 25% используемой памяти до и примерно на 400% быстрее во время выполнения.

Что я пытаюсь здесь сказать: у каждого языка есть свои плюсы и минусы. С имеет свои плюсы и минусы, как и Obj-C. Тем не менее, действительно замечательная особенность Obj-C (поэтому она мне даже больше нравится, чем Java) заключается в том, что вы можете перейти к обычному C по желанию и обратно. Почему это такая замечательная особенность? Поскольку точно так же, как Obj-C исправляет многие минусы чистого C, чистый C может исправлять некоторые минусы Obj-C. Если вы смешаете их вместе, вы получите очень сильную команду.

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

Типичным примером был некоторый код, который мы использовали, который должен был кодировать данные в base64, но мы не могли использовать внешнюю библиотеку для этого (без OpenSSL lib). Мы использовали кодировщик base64, полностью написанный с использованием классов Какао. Это работало хорошо, но когда мы сделали так, чтобы оно кодировало 200 МБ двоичных данных, это заняло целую вечность, и использование памяти было неприемлемым. Я заменил его на крошечный, ультракомпактный кодер base64, написанный полностью как одна функция C (я скопировал тело функции в тело метода, метод принял NSData в качестве ввода и возвратил NSString в качестве вывода, однако внутри функции все было C). Кодер C был намного более компактным, он превосходил кодер чистого Какао в 8 раз по скорости, и объем памяти также был намного меньше. Кодирование/декодирование данных, игра с битами и аналогичные задачи низкого уровня - это только сильные стороны C.

Другим примером был некоторый код пользовательского интерфейса, который рисовал много графиков. Для хранения данных, необходимых для рисования графиков, мы использовали NSArray. На самом деле NSMutableArray, так как график был анимирован. Результат: очень медленная анимация графика. Мы заменили все NSArray на обычные C-массивы, объекты со структурами (ведь информация о координатах графа - это все, что вам не нужно иметь в объектах), доступ к перечислителю с помощью простых циклов for и начали перемещать данные между массивами с помощью memcopy вместо того, чтобы переносить данные из одного массива в другой, индекс для индекса. Результат: ускорение в 4 раза. График плавно анимируется даже в старых PPC системах.

Слабость C в том, что каждая более сложная программа в конечном итоге становится безобразной. Обеспечение читаемости, расширяемости и управляемости приложений на C требует большой дисциплины от программиста. Многие проекты терпят неудачу, потому что эта дисциплина отсутствует. Obj-C позволяет вам легко структурировать ваше приложение, используя классы, наследование, протоколы и так далее. Тем не менее, я не буду использовать чистую функциональность C за пределами метода, если в этом нет необходимости. Я предпочитаю хранить весь код в приложении Objective-C в методе объекта; все остальное противоречит цели приложения OO. Однако в рамках метода я иногда использую исключительно чистый C.

161
Mecki

Вы можете достаточно легко выучить C и Objective-C одновременно - разумеется, нет необходимости изучать мелочи C (включая арифметику указателей и т.д.), Прежде чем начинать с дополнений Objective-C в язык, а также как начинающий программист Быстрое освоение Objective-C может помочь вам быстрее начать "думать в объектах".

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

Библиотека разработчика Objective-C для программированияБиблиотека разработчика Objective-C 2.

Он не предполагает никакого предшествующего опыта и учит Objective-C и столько же C, сколько вам нужно.

Если вы чувствуете себя немного амбициозно, вы можете начать с Учебное пособие Скотта Стивенсона "Learn C" , но у него есть некоторые предпосылки ("Вы уже должны знать хотя бы один язык сценариев или программирования, включая функции , переменные и циклы. Вам также нужно будет вводить команды в Mac OS X Terminal. ").

(Только для справки и для контекста: я узнал оба в одно и то же время в 1991 году - это, казалось, не принесло мне никакого вреда. Однако у меня был фон в BASIC, Pascal, Logo и LISP.)

25
mmalc

Я много думал об этой проблеме, прежде чем написать свою книгу о Objective-C. Во-первых, я действительно считаю, что изучение языка C до изучения Objective-C - неправильный путь. C - это процедурный язык, содержащий множество функций, которые не нужны для программирования в Objective-C, особенно на уровне новичков. Фактически, использование некоторых из этих функций идет вразрез с приверженностью хорошей методологии объектно-ориентированного программирования. Также не стоит учить все детали процедурного языка (и атаковать решение проблемы с помощью функций и методов структурированного программирования), прежде чем изучать объектно-ориентированный язык. Это может привести программиста в неправильное русло, что может привести к неправильной ориентации и мышлению для формирования хорошей дисциплины объектно-ориентированного программирования. То, что Objective-C является расширением языка C, не означает, что вам нужно сначала изучать C!

Я думаю, что преподавание Objective-C и базового языка C как единого интегрированного языка является правильным подходом. Нет никаких оснований узнавать, что оператор for предназначен для языка C, а не для его расширенного языка Objective-C. Кроме того, зачем подробно изучать такие вещи, как массивы C и строки (и манипулировать ими) до изучение массива (NSArray) и строковых объектов (NSString), например? Многие C-тексты посвящают много времени структурам, а указатели - структурам, а также перебирают массивы с указателями. Но вы можете начать писать программы на Objective-C, не зная ни об одной из этих особенностей языка C. И для начинающего программиста это большое дело. Это не только сокращает кривую обучения, но также уменьшает количество материала, который необходимо выучить (и некоторые из него выборочно отфильтровывают) для написания программ Objective-C.

Я согласен, что вам захочется изучить большинство, если не все, базовые функции языка Си, но многие из них можно отложить до полного понимания определения классов и методов, работы с объектами и выражениями сообщений, а также понимания концепций наследования и полиморфизм хорошо понятен.

18
skochan

Я бы подробно остановился на Objective C - если у вас уже есть несколько языков, это не синтаксис, который является кривой обучения, это Какао.

15
Paul Dixon

Я думаю, что, по большей части, изучение C - хорошая идея, независимо от того, на какой арене вы находитесь, по крайней мере, чтобы познакомиться с внутренними принципами разработки программного обеспечения перед использованием расфасованных товаров, таким образом, если что-то пойдет не так у вас больше шансов понять внутреннюю работу. Об SO много спорят, и это довольно субъективный вопрос, но в целом вы будете использовать C внутри своего кода Objective-C, так что я думаю, что это действительно ваше дело. Я человек с нуля, но иногда это может помешать, и я знаю нескольких умных людей, которые прошли путь сверху вниз, я думаю, что важной частью является то, что вы понимаете внутреннюю работу, как это будет установите свои возможности отдельно от тех, кто не так хорошо, как увеличить ваши возможности.

10
TheXenocide

Хорошей идеей будет изучить C перед изучением Objective-C, который является строгим надмножеством C. Это означает, что Objective-C может поддерживать весь нормальный код C, поэтому код, общий для программ на C, обязательно появится даже в Objective-C. С кодом.

В дополнение к рассмотрению вещей чисто с языковой точки зрения, вы обнаружите, что Mac OS X является полноценной операционной системой Unix. Все библиотеки системного уровня написаны на C.

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

7
Doug

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

Если у вас есть время, во что бы то ни стало выучите C. Как уже говорили здесь, книга Кочана (второе и первое издания) превосходна как книга, в которую можно окунуться.

5
mattwestbright

Я бы выучил Objective-C и выучил бы столько C, сколько вам нужно.

Области C, от которых вы не будете сильно зависеть:

  • Указатель арифметики и массивов. Я не использовал массивы C вообще.
  • C строк. Строки Objective-C делают работу приятнее и безопаснее.
  • Ручное управление памятью, если вы используете GC в Obj-C 2.1. Я настоятельно рекомендую этот маршрут из соображений скорости разработки и производительности.
5
Giao

Есть много вещей, которые вы не можете сделать чисто в Objective-C, поэтому изучение некоторых базовых навыков в C будет довольно важным. По крайней мере, вам нужно будет понять объявления переменных и основные функции библиотеки C, иначе вы будете разочарованы.

4
Mark Bessey

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

3
Coding future

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

PS: под "двигаться дальше" я не имел в виду "брось это", просто "учись больше, учись другому". Когда вы знаете C, вы можете никогда его не отбрасывать: Java использует JNI для вызова подпрограмм C для низкоуровневых вещей, Python, Lua и т.д. Часто расширяются с помощью кода C (ссылка на Lua даже предполагает наличие некоторых знаний C для некоторых функций, которые являются лишь тонкой оболочкой для функции C и т. д.

3
PhiLho

Честно говоря, так много языков основаны на синтаксисе языка Си, что это хорошо для знакомства. Я бы взял неделю или две, чтобы ознакомиться с Си независимо.

Тем не менее, я только что научил себя цели C, и я должен быть честным: я не нашел свой опыт в C таким полезным, как я мог подумать. Цель C определенно открыла мне глаза.

3
user25967

Вы можете перейти непосредственно в Objective-C со следующими преимуществами:

  1. Вы узнаете "немного" C на этом пути.
  2. Вы узнаете, какие части C актуальны для вас.

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

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

3
OscarRyz

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

2
Trent

С дает вам очень мало абстракции от сборки. Некоторые компиляторы C даже позволяют встроенную сборку. Это может быть очень полезно для размышлений о том, как работает компьютер, что важно знать.

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

2
Steve g

Вы должны иметь базовые знания C, прежде чем запускать Objective_C, но нет необходимости осваивать каждую деталь C.

Я опубликовал свои заметки после прочтения "Программирование в Objective-C" на случай, если это поможет кому-то еще.

изучите Objective C с помощью программирования -

2
cfischer

Вы хотите быть заядлым разработчиком? Тогда учись c первым.

Книги, которые вам нужно полностью освоить, являются одними из лучших в технике. Вот что вам нужно:

язык программирования C

Стандартная библиотека C

2
Freddie

Цель C достаточно отличается от C, так как не заслуживает изучения C в первую очередь.

С точки зрения синтаксиса/языковой семьи лучше изучать Smalltalk (на котором основана Цель C)

С практической точки зрения, сосредоточьтесь на изучении одного языка за раз.

Позже, если вы хотите выучить другой язык, C++, Java и ​​Python 1) просты в освоении как группа 2) популярны и, следовательно, доступны для продажи 3) эффективны.

2
Brooks

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

1
Dave

ИМХО надо сначала узнать хоть немного C и особенно про указатели. Это тем более важно, если кто-то говорит на языке, на котором нет указателей. Многие люди спрашивают о коде, как

NSString *string = [[NSString alloc] init];
string = @"something";

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

Конечно, не нужно изучать все C, чтобы начать с Objective-C, но некоторые фундаментальные вещи абсолютно необходимы.

1
Sven

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

1
Alexandre Cassagne

Если вы изучите какой-то другой язык ранее, то у вас всегда будет путаница в написании правильного синтаксиса. Я не знаю цели, но Object C использует странный (не распространенный) синтаксис для вызова методов объекта. Он называет это отправляющими сообщениями, да, это верно в соответствии с чисто объектно-ориентированной концепцией, однако большинство объектно-ориентированных языков называют это как вызывающий метод и используют более традиционный синтаксис вызывающих методов. Сборка мусора также является чем-то очень странным, объект C основан на подсчете ссылок старой школы. Поэтому вам будет сложно принять его, если вы переключитесь с другого языка. Я пишу книгу по быстрому переходу Object C для программистов на C/C++, надеющихся помочь людям быстрее разобраться во всех различиях.

0
Dmitriy

Черт возьми, иди прямо в цель C!

Я перешел с ActionScript 3 на Objective C, и у меня уже есть стажер в компании!

Делай что хочешь.

0
Nathan