Як прагнучий розробник Apple, я хочу отримати думку громади, якщо краще спочатку вивчити С перед тим, як перейти до Objective-C і, врешті-решт, Какао-рамки?
Моя кишка каже, вивчіть C, що дасть мені хороший фундамент.
Як прагнучий розробник Apple, я хочу отримати думку громади, якщо краще спочатку вивчити С перед тим, як перейти до Objective-C і, врешті-решт, Какао-рамки?
Моя кишка каже, вивчіть C, що дасть мені хороший фундамент.
Відповіді:
Я б навчився С спершу. Я навчився 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 одночасно - точно не потрібно вивчати деталі 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. )
Я багато думав над цим питанням, перш ніж писати свою книгу на Objective-C. По-перше, я дійсно вважаю, що вивчення мови C перед вивченням Objective-C - це неправильний шлях. C - a процесуальниймова, що містить безліч функцій, які не потрібні для програмування в Objective-C, особливо на початківчому рівні. Насправді, вдаючись до деяких із цих особливостей, суперечить зерну дотримання хорошої об'єктно-орієнтованої методології програмування. Також не дуже добре викладати всі деталі процедурної мови (та атакувати на вирішення проблеми за допомогою функцій та структурованих прийомів програмування) перед вивченням об'єктно-орієнтованої. Це може запустити програміста в неправильному напрямку, що потенційно може призвести до розвитку неправильної орієнтації та настрою для формування хорошої об'єктно-орієнтованої дисципліни програмування. Тільки тому, що Objective-C є розширенням до мови С, не означає, що ви повинні спочатку вивчити С!
Я вважаю, що викладання Objective-C і основної мови C як єдиної інтегрованої мови є правильним підходом. Немає жодних підстав дізнаватися, що висловлювання "за" - це з мови С, а не з його суперзахисної мови Objective-C. Далі, чому детально дізнатися про такі речі, як C масиви та рядки (та маніпулювання ними) , перш ніждізнатися про масив (NSArray) та рядкові об'єкти (NSString), наприклад? Багато текстів C приділяють багато часу структурам, а покажчики структурам, і ітерація через масиви з покажчиками. Але ви можете почати писати програми Objective-C, не знаючи про жодну з цих мов мови С. А для початківця програміста - це велика справа. Це не тільки скорочує криву навчання, але й зменшує кількість матеріалу, який необхідно засвоїти (а деякі з них вибірково відфільтровано) для написання програм «Об’єктив-С».
Я погоджуюся, що ви хочете дізнатися більшість, якщо не всі, основні риси C, але багато з них можна відкласти до того, як буде чітко зрозуміти визначення класів і методів, робота з об'єктами та виразами повідомлень та розуміння понять успадкування та поліморфізм добре зрозумілий.
Я б занурився прямо в «Завдання C» - якщо у вас вже є кілька мов під поясом, це не синтаксис, який є кривою навчання, це какао.
Я думаю, що здебільшого вивчати C - це гарна ідея, незалежно від того, на яку арену ви збираєтесь, принаймні, щоб розвісити внутрішню розробку програмного забезпечення перед використанням упакованих товарів, таким чином, якщо щось піде не так у вас є більший шанс зрозуміти внутрішню роботу. Про цю тему існує багато дискусій, і це досить суб'єктивне питання, але в цілому ви будете по суті використовувати C у своєму коді Objective-C, тож я думаю, це справді залежить від вас. Я заземлений тип людини, але іноді це може перешкоджати, і я знаю декількох розумних людей, які працювали вгору зверху вниз, я думаю, що важлива частина полягає в тому, щоб ви зрозуміли внутрішню роботу, як це буде виділіть свої можливості окрім тих, хто це не робить і не збільшує ваші можливості.
Добре уявити C, перш ніж вивчити Objective-C, який є суворим набором C. Це означає, що Objective-C може підтримувати всі звичайні коди C, тому код, загальний для програм C, повинен з'являтися навіть у Objective- C код.
Окрім того, що дивитися на речі виключно з мовної точки зору, ви побачите, що Mac OS X - це повна операційна система Unix. Всі бібліотеки системного рівня записані в С.
Можливо, можна навчитися обом одночасно, але я думаю, що ви більше оціните та зрозумієте Objective-C, якщо спочатку будете мати добрі робочі знання C.
Я б навчився Objective-C і навчився стільки, скільки вам потрібно, коли ви йдете разом.
Області С, від яких ви не залежатимете багато:
Коли ви вивчаєте Objective-C та Cocoa, ви не можете уникнути вивчення шматочків C. Наприклад, прямокутники звичайно представлені CGRect, C-структурою.
Якщо у вас є час, то неодмінно вивчіть C. Як говорили інші тут, книга Кочана (друге та перше видання) є чудовою книгою, в яку можна зануритися.
У Objective-C є багато речей, які ви не можете зробити виключно, тому засвоєння деяких базових навичок C буде досить критичним. Вам потрібно, принаймні, зрозуміти декларації змінних та основні функції бібліотеки С, інакше ви зірветеся.
Чесно кажучи, так багато мов базується на синтаксисі С, що добре познайомитися. Я б зайняв тиждень-два, щоб ознайомитись із C незалежно.
З цього приводу я просто навчив себе "Цілі С", і я повинен бути чесним: я не вважав, що мій досвід роботи є таким же корисним, як я міг би подумати. Мета C, безумовно, відкривала для мене очі.
Ви можете перейти безпосередньо в Objective-C із такими перевагами:
Принаймні для мене простіше вивчити нову мову, коли мене цікавить якийсь конкретний додаток чи зразок, і я не вдається, коли мені доведеться вивчити інше, що не зовсім те, що мене цікавить.
Ви завжди можете вдосконалити свої знання на C пізніше, якщо вас зацікавить програмування нижчого рівня.
Краще, я не знаю, тим більше, що я не знайомий з Objective-C.
Але основи на C не так важко вивчити, це не дуже складна мова (з точки зору синтаксису, не з точки зору освоєння!), Так що займіться цим, це не буде витрачено даремно.
Особисто я вважаю, що це завжди гарна ідея вивчити C, це дає хороше розуміння того, як працює комп'ютер. Зрештою, більшість мов і систем все ще написані в C. Потім рухайтеся далі! :-)
PS: Під «рухом далі» я не мав на увазі «кинути це», просто «дізнайся більше, дізнайся іншого». Коли ви знаєте C, ви його ніколи не можете скинути: Java використовує JNI для виклику процедур C для низькорівневих матеріалів, Python, Lua і т.д. часто розширюються кодом C (посилання на Lua навіть просто передбачає знання C для деяких функцій, які просто тонка обгортка до функції С позаду) тощо.
Так, вивчення мови C перед будь-якими іншими вдосконаленими мовами допоможе вам вивчити швидкі інші мови.
Згідно з Вікіпедією , Objective-C є суворим набором C. У цьому випадку я б запропонував спочатку вивчити С. Тоді, коли ви засвоїте Objective-C, буде зрозуміло, які частини додаються як частина Objective-C.
C дає дуже мало абстракції від складання. Деякі компілятори C навіть дозволять вам скласти вбудовану лінію. Це може бути дуже корисно для роздумів про те, як працює комп’ютер, що важливо знати.
Якщо говорити, якщо ви дійсно зацікавлені в Object-C, не дозволяйте собі зациклюватися на тому, щоб щось писати на C просто тому, що це "добре для вас". Вам не потрібно засмучувати себе, намагаючись навчитися новому набору навичок. Важливо, щоб ви мали задоволення від того, чим займаєтесь.
Ви хочете бути жорстким розробником? Тоді вивчіть c спочатку.
Книги, які потрібно повністю освоїти, є одними з найкращих технічних творів. Ось що вам потрібно:
Завдання C достатньо відрізняється від C, щоб спочатку не вивчити C.
З точки зору синтаксису / мови-сім'ї, майже краще вивчити SmallTalk (на якій базується мета C)
З практичної точки зору, зосередьте свої зусилля на вивченні однієї мови за один раз.
Пізніше, якщо ви хочете вивчити іншу мову, C ++, Java та Python 1) легко вивчити як купу 2) популярних і, таким чином, товарних 3) потужних.
Ви повинні мати базові знання C перед початком Objective_C, але не потрібно освоювати кожну деталь C.
Я опублікував свої замітки після прочитання "Програмування в Objective-C", якщо це допомагає комусь іншому.
Залежно від багатьох мов, які ви вже знаєте, може бути кращою ідеєю просто почати вивчати Objective-C. Основа у більшості мов в основному однакова, синтаксис є іншим. Навчання C спершу насправді не має великого значення, коли справа доходить до вивчення цілі C.
Я навчився Objective-C відразу, і він працював чудово близько року, я просто зіткнувся з читанням коду С, коли завантажував проект, щоб побачити, як вони працюють, але тепер я справді відчуваю необхідність вчитися C. Ви можете спробувати навчитися ObjC без C, але рано чи пізно вам знадобиться C.
ІМХО слід спочатку дізнатись хоча б деякі C та особливо про покажчики. Це ще важливіше, якщо мова йде про мову, на якій немає вказівників. Дуже багато людей запитують про подібний код
NSString *string = [[NSString alloc] init];
string = @"something";
оскільки вони не знають про відмінність вказівника від об'єкта, на який він вказує.
Звичайно, не потрібно вивчати весь C, перш ніж можна починати з Objective-C, але деякі основні речі абсолютно необхідні.
Чорт, ні, переходьте прямо до об'єкта C!
Я перейшов з ActionScript 3 в Objective C, і вже маю стажування в компанії!
Роби що хочеш.
Якщо ви вивчите якусь іншу мову заздалегідь, то у вас завжди буде плутанина в написанні правильного синтаксису. Я не знаю мети, але Object C використовує дивний (не поширений) синтаксис для виклику об'єктних методів. Він називає це як відправлення повідомлень, так, це правда відповідно чиста об'єктно-орієнтована концепція, проте більшість об'єктно-орієнтованих мов називають це як метод виклику і використовують більш традиційний синтаксис методів виклику. Збір сміття також є чимось дивним, об'єкт C заснований на підрахунку старої школи. Тож у вас виникнуть труднощі прийняти це, якщо ви перейдете з іншої мови. Я пишу книгу "Посібник з швидкої міграції" для об'єктів C для програмістів на C / C ++, сподіваючись допомогти людям швидше перебрати всі відмінності.