Вивчіть C спочатку, перш ніж вивчити Objective-C [закрито]


107

Як прагнучий розробник Apple, я хочу отримати думку громади, якщо краще спочатку вивчити С перед тим, як перейти до Objective-C і, врешті-решт, Какао-рамки?

Моя кишка каже, вивчіть C, що дасть мені хороший фундамент.

Відповіді:


163

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

Я раз у раз бачу, як вони повністю вирішують проблему в Obj-C, іноді призводячи до дуже незграбних рішень. Зазвичай я замінюю деякий код Obj-C чистим кодом С (адже ви можете змішати їх скільки завгодно, вміст методу Obj-C може бути цілком, чистим кодом С). Без будь-якого наміру ображати будь-якого програміста Obj-C, в Obj-C є рішення, які дуже елегантні, це рішення, які просто працюють (і виглядають) набагато краще завдяки об’єктам(Програмування OOP може зробити складні програми набагато приємнішими, ніж функціональне програмування; наприклад, поліморфізм - це геніальна особливість) ... і мені дуже подобається Obj-C (набагато більше, ніж C ++! Я ненавиджу синтаксис C ++, а деякі мовні особливості - це просто надмірність і призводять до поганих моделей розвитку ІМХО); однак, коли я інколи переписую код Obj-C своїх колег (і я дійсно роблю це лише якщо я вважаю, що це абсолютно необхідно), отриманий код, як правило, на 50% менший, потрібно лише 25% пам'яті, яку він використовував до і на 400% швидше під час виконання.

Що я тут намагаюся сказати: у кожної мови є свої плюси і мінуси. C має плюси і мінуси, так само і 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, об’єкти зі структурами (адже інформація про координати графів нічого не повинна мати в об’єктах), доступ до переліку обчислювачів з простими для циклів і розпочав переміщення даних між масивами з memcopy замість того, щоб брати дані з одного масиву в інший - індекс для індексу. Результат: Прискорення на коефіцієнт 4. Графік плавно анімований, навіть у старих системах КПП.

Слабкою стороною C є те, що кожна більш складна програма з часом стає негарною. Збереження додатків C читабельним, розширюваним та керованим вимагає великої дисципліни програміста. Багато проектів провалюються, оскільки ця дисципліна відсутня. Obj-C дозволяє вам легко структурувати додаток за допомогою класів, успадкування, протоколів тощо. Однак, я б не використовував чисту функціональність С за межами методу, якщо це не потрібно. Я вважаю за краще зберігати весь код у додатку Objective-C у межах методу об'єкта; все інше перемагає мету програми OO. Однак в рамках методу я іноді використовую виключно чистий С.


і якщо я вже знаю c ++ і хочу вивчити Objective-C для розробки iPhone / iTouch, чи потрібно вивчати C що завгодно?
chester89

11
@ chester89: якщо ви вже знаєте C ++, ви достатньо знаєте C, щоб розпочати роботу з Objective-C.
Свен

Свен має рацію, C ++ настільки складний і вже використовує стільки чистого C, якщо ви справді добре знаєте C ++, ви також повинні добре знати C.
Mecki

Це моє улюблене розміщення в цій темі ще, дякую.
Моркром

1
@FrederikWitte Відмовтеся від C ++, це збентежить вас лише як початківця (і це не мова, яка вам знадобиться для розвитку мобільних пристроїв). Почніть з Java, це гарна мова викладання, і лише знання Java достатньо для розробки для Android (можливо, якщо ви не хочете писати ігри чи відеоплеєри тощо). Потім вивчіть C і, нарешті, Obj-C, якщо ви не хочете замість цього пропустити все, що навчається Swift. Твій вибір.
Мецькі

25

Ви можете легко вивчити C і Objective-C одночасно - точно не потрібно вивчати деталі C (включаючи арифметику вказівника тощо), перш ніж починати з доповнень Objective-C до мови та як початківця програміста швидка робота з Objective-C може допомогти вам швидше почати "думати в об'єктах".

Щодо наявних ресурсів, документація Apple зазвичай передбачає знайомство з C, тому, починаючи з мови програмування Objective-C 2.0 , вам не принесе великої користі. Я інвестував би в копію програми «Програмування в Objective-C» Стівена Кочана (залежно від того, наскільки швидко ви хочете розпочати роботу, ви можете зачекати другого видання):

Програмування Бібліотека розробників Objective-C Програмування Бібліотека розробників Objective-C 2.0

Це не передбачає попереднього досвіду, і навчає вас «Objective-C» і стільки, скільки вам потрібно.

Якщо ви відчуваєте себе трохи амбітним, ви можете почати з підручника Скотта Стівенсона "Learn C" , але в ньому є деякі передумови ("Ви вже повинні знати принаймні одну мову сценарію чи програмування, включаючи функції, змінні та петлі. Ви" Також потрібно ввести команди в термінал Mac OS X. ").

(Тільки для запису та для контексту: я навчився обом одночасно ще в 1991 році - це, здається, не принесло мені ніякої шкоди. Я, однак, маю досвід роботи в BASIC, Pascal, Logo та LISP. )


2
вам абсолютно не слід вважати за необхідне спочатку вивчити С. Особливо, якщо ви вже знаєте таку мову, як C # Java. C # і Java завдячують значною мірою C. Хоча C # завдячує набагато більше досвіду та помилок Гельсбергів з Delphi.
Даніель Хоніг

18

Я багато думав над цим питанням, перш ніж писати свою книгу на Objective-C. По-перше, я дійсно вважаю, що вивчення мови C перед вивченням Objective-C - це неправильний шлях. C - a процесуальниймова, що містить безліч функцій, які не потрібні для програмування в Objective-C, особливо на початківчому рівні. Насправді, вдаючись до деяких із цих особливостей, суперечить зерну дотримання хорошої об'єктно-орієнтованої методології програмування. Також не дуже добре викладати всі деталі процедурної мови (та атакувати на вирішення проблеми за допомогою функцій та структурованих прийомів програмування) перед вивченням об'єктно-орієнтованої. Це може запустити програміста в неправильному напрямку, що потенційно може призвести до розвитку неправильної орієнтації та настрою для формування хорошої об'єктно-орієнтованої дисципліни програмування. Тільки тому, що Objective-C є розширенням до мови С, не означає, що ви повинні спочатку вивчити С!

Я вважаю, що викладання Objective-C і основної мови C як єдиної інтегрованої мови є правильним підходом. Немає жодних підстав дізнаватися, що висловлювання "за" - це з мови С, а не з його суперзахисної мови Objective-C. Далі, чому детально дізнатися про такі речі, як C масиви та рядки (та маніпулювання ними) , перш ніждізнатися про масив (NSArray) та рядкові об'єкти (NSString), наприклад? Багато текстів C приділяють багато часу структурам, а покажчики структурам, і ітерація через масиви з покажчиками. Але ви можете почати писати програми Objective-C, не знаючи про жодну з цих мов мови С. А для початківця програміста - це велика справа. Це не тільки скорочує криву навчання, але й зменшує кількість матеріалу, який необхідно засвоїти (а деякі з них вибірково відфільтровано) для написання програм «Об’єктив-С».

Я погоджуюся, що ви хочете дізнатися більшість, якщо не всі, основні риси C, але багато з них можна відкласти до того, як буде чітко зрозуміти визначення класів і методів, робота з об'єктами та виразами повідомлень та розуміння понять успадкування та поліморфізм добре зрозумілий.


Це все для тих, хто хоче швидко вчитися, уникаючи боротьби та глибокого розуміння. Я викладаю повний noob програмування (в той час як я маю 11 років досвіду програмування) програмувати і раніше навчав інших (але я не вчитель, щоб це було зрозуміло). І знаєте що? Всі ці поняття, до яких ми звикли, дуже складні та неінтуїтивні для початківців! C - це чудовий спосіб зрозуміти досить низький рівень матеріалів, щоб у майбутньому це не було для них якоюсь магією. Однак, для кращого програмування крива навчання краще з C спочатку з варварськими правилами =)
MANIAK_dobrii

15

Я б занурився прямо в «Завдання C» - якщо у вас вже є кілька мов під поясом, це не синтаксис, який є кривою навчання, це какао.


1
Тепер, маючи на увазі, є більш доступний матеріал для вивчення C. Виявив, що це найважча частина щодо ObjC, відсутність добре організованого, чіткого матеріалу, має достатню глибину для порівняння з матеріалами C або C ++ і справді допомагає зрозуміти, що було відбувається всередині нього.
Шпанки

10

Я думаю, що здебільшого вивчати C - це гарна ідея, незалежно від того, на яку арену ви збираєтесь, принаймні, щоб розвісити внутрішню розробку програмного забезпечення перед використанням упакованих товарів, таким чином, якщо щось піде не так у вас є більший шанс зрозуміти внутрішню роботу. Про цю тему існує багато дискусій, і це досить суб'єктивне питання, але в цілому ви будете по суті використовувати C у своєму коді Objective-C, тож я думаю, це справді залежить від вас. Я заземлений тип людини, але іноді це може перешкоджати, і я знаю декількох розумних людей, які працювали вгору зверху вниз, я думаю, що важлива частина полягає в тому, щоб ви зрозуміли внутрішню роботу, як це буде виділіть свої можливості окрім тих, хто це не робить і не збільшує ваші можливості.


По-перше, навчання C може також спотворити ваше уявлення про програмування ОО, якщо ви його ще не обґрунтували. Змішування структурованого та процедурного кодування - це не добре. Але також правда, що OO втрачає свою цінність у багатьох місцях, де C світить, наприклад, написання коду нижчого рівня.
Даніель Хоніг

1
Моя причина запропонувати кожному розробнику вивчити C в якийсь момент, принаймні, ґрунтується на думці, що навіть мови OO складаються відповідно до тих самих точних інструкцій, що і C. Змінні для об’єктів використовують покажчики, збирачі сміття використовують malloc та безкоштовно, файли блокуються за допомогою ручок ОС; коли щось не вдається в додатку Java або C #, знання цих основ може значно покращити ваше розуміння того, що пішло не так. Розуміння розподілу ресурсів, яке буде здійснюватися, також призводить до написання більш інформованого коду, який буде більш оптимальним для конкретного контексту.
TheXenocide

7

Добре уявити C, перш ніж вивчити Objective-C, який є суворим набором C. Це означає, що Objective-C може підтримувати всі звичайні коди C, тому код, загальний для програм C, повинен з'являтися навіть у Objective- C код.

Окрім того, що дивитися на речі виключно з мовної точки зору, ви побачите, що Mac OS X - це повна операційна система Unix. Всі бібліотеки системного рівня записані в С.

Можливо, можна навчитися обом одночасно, але я думаю, що ви більше оціните та зрозумієте Objective-C, якщо спочатку будете мати добрі робочі знання C.


5

Я б навчився Objective-C і навчився стільки, скільки вам потрібно, коли ви йдете разом.

Області С, від яких ви не залежатимете багато:

  • Арифметика вказівника та масиви. Я взагалі не використовував масиви С.
  • C рядки. Струни Objective-C роблять роботу приємнішою та безпечнішою.
  • Ручне управління пам'яттю, якщо ви використовуєте GC в Obj-C 2.1. Я настійно рекомендую цей маршрут з міркувань швидкості розвитку та продуктивності.

6
Одне застереження: Збір сміття в Objective-C доступний не на всіх платформах (особливо в iPhone), про що слід пам’ятати.
Марк Бессі

5

Коли ви вивчаєте Objective-C та Cocoa, ви не можете уникнути вивчення шматочків C. Наприклад, прямокутники звичайно представлені CGRect, C-структурою.

Якщо у вас є час, то неодмінно вивчіть C. Як говорили інші тут, книга Кочана (друге та перше видання) є чудовою книгою, в яку можна зануритися.


4

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


3

Чесно кажучи, так багато мов базується на синтаксисі С, що добре познайомитися. Я б зайняв тиждень-два, щоб ознайомитись із C незалежно.

З цього приводу я просто навчив себе "Цілі С", і я повинен бути чесним: я не вважав, що мій досвід роботи є таким же корисним, як я міг би подумати. Мета C, безумовно, відкривала для мене очі.


3

Ви можете перейти безпосередньо в Objective-C із такими перевагами:

  1. Ви навчитеся "деякому" С на шляху.
  2. Ви дізнаєтесь деталі C, які є для вас важливими.

Принаймні для мене простіше вивчити нову мову, коли мене цікавить якийсь конкретний додаток чи зразок, і я не вдається, коли мені доведеться вивчити інше, що не зовсім те, що мене цікавить.

Ви завжди можете вдосконалити свої знання на C пізніше, якщо вас зацікавить програмування нижчого рівня.


3

Краще, я не знаю, тим більше, що я не знайомий з Objective-C.
Але основи на C не так важко вивчити, це не дуже складна мова (з точки зору синтаксису, не з точки зору освоєння!), Так що займіться цим, це не буде витрачено даремно.
Особисто я вважаю, що це завжди гарна ідея вивчити C, це дає хороше розуміння того, як працює комп'ютер. Зрештою, більшість мов і систем все ще написані в C. Потім рухайтеся далі! :-)

PS: Під «рухом далі» я не мав на увазі «кинути це», просто «дізнайся більше, дізнайся іншого». Коли ви знаєте C, ви його ніколи не можете скинути: Java використовує JNI для виклику процедур C для низькорівневих матеріалів, Python, Lua і т.д. часто розширюються кодом C (посилання на Lua навіть просто передбачає знання C для деяких функцій, які просто тонка обгортка до функції С позаду) тощо.



2

Згідно з Вікіпедією , Objective-C є суворим набором C. У цьому випадку я б запропонував спочатку вивчити С. Тоді, коли ви засвоїте Objective-C, буде зрозуміло, які частини додаються як частина Objective-C.


2

C дає дуже мало абстракції від складання. Деякі компілятори C навіть дозволять вам скласти вбудовану лінію. Це може бути дуже корисно для роздумів про те, як працює комп’ютер, що важливо знати.

Якщо говорити, якщо ви дійсно зацікавлені в Object-C, не дозволяйте собі зациклюватися на тому, щоб щось писати на C просто тому, що це "добре для вас". Вам не потрібно засмучувати себе, намагаючись навчитися новому набору навичок. Важливо, щоб ви мали задоволення від того, чим займаєтесь.



2

Завдання C достатньо відрізняється від C, щоб спочатку не вивчити C.

З точки зору синтаксису / мови-сім'ї, майже краще вивчити SmallTalk (на якій базується мета C)

З практичної точки зору, зосередьте свої зусилля на вивченні однієї мови за один раз.

Пізніше, якщо ви хочете вивчити іншу мову, C ++, Java та Python 1) легко вивчити як купу 2) популярних і, таким чином, товарних 3) потужних.


1
Ні, Objective-C - це дуже маленький надмножина C. Без C ви нічого не можете зробити в Objective-C. Звичайно, об'єктна модель взята з малої розмови, але синтаксис здебільшого навіть не близький.
Свен

2

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

Я опублікував свої замітки після прочитання "Програмування в Objective-C", якщо це допомагає комусь іншому.

вивчити ціль c з програмуванням-


1

Залежно від багатьох мов, які ви вже знаєте, може бути кращою ідеєю просто почати вивчати Objective-C. Основа у більшості мов в основному однакова, синтаксис є іншим. Навчання C спершу насправді не має великого значення, коли справа доходить до вивчення цілі C.


Але лише якщо ви знаєте хоча б ще одну мову програмування.
Свен

На додаток до коментаря @ Свена: "... який має деяку концепцію покажчиків"
MANIAK_dobrii

1

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


1

ІМХО слід спочатку дізнатись хоча б деякі C та особливо про покажчики. Це ще важливіше, якщо мова йде про мову, на якій немає вказівників. Дуже багато людей запитують про подібний код

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

оскільки вони не знають про відмінність вказівника від об'єкта, на який він вказує.

Звичайно, не потрібно вивчати весь C, перш ніж можна починати з Objective-C, але деякі основні речі абсолютно необхідні.


Я хотів би проголосувати +10. Одного разу в інтерв'ю obj-c dev мене запитали, чи можна створити покажчик на NSInteger ... Я був шокований, тому що це було для мене так важливо, але, здається, не для всіх. Тож це важливо і легко забути, що це потрібно розуміти.
MANIAK_dobrii

0

Чорт, ні, переходьте прямо до об'єкта C!

Я перейшов з ActionScript 3 в Objective C, і вже маю стажування в компанії!

Роби що хочеш.


Чому б ви повністю пропустити об'єктно-орієнтований стан душі і почати спочатку навчатись С? Це як навчитися літати повітряного змія і сподіватися бути пілотом. Ви повинні інтегрувати OOP з початку роботи.
SwiftArchitect

0

Якщо ви вивчите якусь іншу мову заздалегідь, то у вас завжди буде плутанина в написанні правильного синтаксису. Я не знаю мети, але Object C використовує дивний (не поширений) синтаксис для виклику об'єктних методів. Він називає це як відправлення повідомлень, так, це правда відповідно чиста об'єктно-орієнтована концепція, проте більшість об'єктно-орієнтованих мов називають це як метод виклику і використовують більш традиційний синтаксис методів виклику. Збір сміття також є чимось дивним, об'єкт C заснований на підрахунку старої школи. Тож у вас виникнуть труднощі прийняти це, якщо ви перейдете з іншої мови. Я пишу книгу "Посібник з швидкої міграції" для об'єктів C для програмістів на C / C ++, сподіваючись допомогти людям швидше перебрати всі відмінності.


Тому що в Objective-C "відправка повідомлення" не є "викликом методу", але, в той же час, відправлення повідомлення викликає виклик методу (функції) =) Коли ви надсилаєте повідомлення об'єкту, воно проходить через відправлення повідомлення механізм (ви можете прочитати про це тут: developer.apple.com/library/ios/documentation/Cocoa/Conceptual / ... або тут: stackoverflow.com/questions/982116 / ... )
MANIAK_dobrii
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.