Là một nhà phát triển đầy tham vọng của Apple, tôi muốn lấy ý kiến của cộng đồng nếu tốt hơn là học C trước trước khi chuyển sang Objective-C và cuối cùng là Cocoa Framework?
Ruột của tôi nói rằng hãy học C, điều này sẽ cho tôi một nền tảng tốt.
Là một nhà phát triển đầy tham vọng của Apple, tôi muốn lấy ý kiến của cộng đồng nếu tốt hơn là học C trước trước khi chuyển sang Objective-C và cuối cùng là Cocoa Framework?
Ruột của tôi nói rằng hãy học C, điều này sẽ cho tôi một nền tảng tốt.
Câu trả lời:
Tôi sẽ học C trước. Tôi đã học C (và đã học rất nhiều trong C) trước khi chuyển sang Obj-C. Tôi có nhiều đồng nghiệp chưa bao giờ là lập trình viên C thực sự, họ bắt đầu với Obj-C và chỉ học càng nhiều C khi cần thiết.
Thỉnh thoảng, tôi thấy cách họ giải quyết một vấn đề hoàn toàn trong obj-C, đôi khi dẫn đến một giải pháp rất vụng về. Thông thường, sau đó tôi thay thế một số mã Obj-C bằng mã C thuần túy (sau cùng thì bạn có thể trộn chúng tùy thích, nội dung của phương thức obj-C có thể hoàn toàn là mã C thuần túy). Không có bất kỳ ý định xúc phạm bất kỳ lập trình viên Obj-C nào, có những giải pháp rất thanh lịch trong Obj-C, đây là những giải pháp hoạt động (và trông) tốt hơn rất nhiều nhờ các đối tượng(Lập trình OOP có thể làm cho các chương trình phức tạp trở nên đáng yêu hơn nhiều so với lập trình hàm; ví dụ như đa hình là một tính năng tuyệt vời) ... và tôi thực sự thích obj-C (nhiều hơn C ++! Tôi ghét cú pháp C ++ và một số tính năng ngôn ngữ là quá mức cần thiết và dẫn đến các mô hình phát triển xấu IMHO); tuy nhiên, khi tôi thỉnh thoảng viết lại mã Obj-C của các đồng nghiệp của mình (và tôi thực sự chỉ làm như vậy, nếu tôi nghĩ điều này là thực sự cần thiết), mã kết quả thường nhỏ hơn 50%, chỉ cần 25% bộ nhớ mà nó đã sử dụng. trước đó và nhanh hơn khoảng 400% trong thời gian chạy.
Điều tôi muốn nói ở đây: Mọi ngôn ngữ đều có ưu và nhược điểm. C có ưu và nhược điểm và Obj-C cũng vậy. Tuy nhiên, tính năng thực sự tuyệt vời của obj-C (đó là lý do tại sao tôi thậm chí còn thích nó hơn Java) là bạn có thể chuyển sang C đơn giản theo ý muốn và quay lại nhiều lần nữa. Tại sao đây là một tính năng tuyệt vời như vậy? Vì cũng giống như obj-C sửa được nhiều nhược điểm của pure C, pure C có thể sửa một số nhược điểm của obj-C. Nếu bạn kết hợp chúng với nhau, bạn sẽ nhận được một đội rất mạnh.
Nếu bạn chỉ học Obj-C và không biết gì về C hoặc chỉ biết những điều cơ bản về nó và chưa bao giờ thử nó có thể giải quyết một số vấn đề thông thường như thế nào, thì bạn thực sự chỉ học được một nửa của Obj-C. C là một phần cơ bản của Obj-C. Khả năng sử dụng C bất cứ lúc nào và ở mọi nơi là một đặc điểm cơ bản của nó.
Ví dụ điển hình là một số mã chúng tôi đã sử dụng phải mã hóa dữ liệu trong base64, nhưng chúng tôi không thể sử dụng thư viện bên ngoài cho điều đó (không có OpenSSL lib). Chúng tôi đã sử dụng bộ mã hóa base64, được viết hoàn toàn bằng các lớp Cocoa. Nó hoạt động ổn, nhưng khi chúng tôi làm cho nó mã hóa 200 MB dữ liệu nhị phân, nó sẽ mất một thời gian dài và chi phí bộ nhớ là không thể chấp nhận được. Tôi đã thay thế nó bằng một bộ mã hóa base64 cực nhỏ, siêu nhỏ gọn được viết hoàn toàn dưới dạng một hàm C (tôi đã sao chép phần thân hàm vào phần thân phương thức, phương thức lấy NSData làm đầu vào và trả về NSString làm đầu ra, tuy nhiên bên trong hàm mọi thứ đều là C). Bộ mã hóa C nhỏ gọn hơn rất nhiều, nó đánh bại bộ mã hóa Cocoa thuần túy nhờ yếu tố 8 về tốc độ và chi phí bộ nhớ cũng ít hơn nhiều. Mã hóa / Giải mã dữ liệu, chơi xung quanh với các bit và các tác vụ cấp thấp tương tự chỉ là điểm mạnh của C.
Một ví dụ khác là một số mã giao diện người dùng đã vẽ rất nhiều biểu đồ. Để lưu trữ dữ liệu cần thiết để vẽ các biểu đồ, chúng tôi đã sử dụng NSArray. Thực tế là của NSMutableArray, vì biểu đồ đã được làm động. Kết quả: Hoạt ảnh đồ thị rất chậm. Chúng tôi đã thay thế tất cả các NSArray bằng các mảng C thông thường, các đối tượng có cấu trúc (sau khi tất cả thông tin tọa độ đồ thị là không có gì bạn phải có trong các đối tượng), quyền truy cập điều tra viên với các vòng lặp for đơn giản và bắt đầu di chuyển dữ liệu giữa các mảng bằng bản ghi nhớ thay vì lấy dữ liệu từ một mảng sang cái còn lại, chỉ mục cho chỉ mục. Kết quả: Tăng tốc theo hệ số 4. Biểu đồ hoạt hình mượt mà, ngay cả trên các hệ thống PPC cũ hơn.
Điểm yếu của C là mọi chương trình phức tạp hơn về lâu dài sẽ trở nên xấu xí. Giữ cho các ứng dụng C có thể đọc được, có thể mở rộng và quản lý được đòi hỏi rất nhiều kỷ luật của một lập trình viên. Nhiều dự án thất bại vì thiếu kỷ luật này. Obj-C giúp bạn dễ dàng cấu trúc ứng dụng của mình bằng cách sử dụng các lớp, kế thừa, giao thức, v.v. Điều đó nói rằng, tôi sẽ không sử dụng chức năng C thuần túy qua biên giới của một phương pháp trừ khi cần thiết. Tôi muốn giữ tất cả mã trong ứng dụng Objective-C trong phương thức của một đối tượng; mọi thứ khác đánh bại mục đích của ứng dụng OO. Tuy nhiên trong phương pháp này, đôi khi tôi chỉ sử dụng C nguyên chất.
Bạn có thể dễ dàng học C và Objective-C cùng một lúc - chắc chắn không cần phải học những chi tiết vụn vặt của C (bao gồm cả số học con trỏ, v.v.) trước khi bắt đầu với các bổ sung của Objective-C cho ngôn ngữ và là một lập trình viên mới bắt đầu bắt đầu với Objective-C một cách nhanh chóng có thể giúp bạn bắt đầu "suy nghĩ trong các đối tượng" nhanh hơn.
Về nguồn lực sẵn có, tài liệu của Apple thường cho rằng bạn đã quen với C, vì vậy việc bắt đầu với Ngôn ngữ lập trình Objective-C 2.0 sẽ không mang lại nhiều lợi ích cho bạn. Tôi sẽ đầu tư vào một bản sao Lập trình trong Objective-C của Stephen Kochan (tùy thuộc vào tốc độ bạn muốn tiến hành, bạn có thể cân nhắc chờ xuất bản thứ hai):
Lập trình Objective-C Developers Library Lập trình Objective-C 2.0 Developers Library
Nó không có kinh nghiệm trước đó và dạy bạn Objective-C và nhiều C nếu bạn cần.
Nếu bạn cảm thấy mình hơi tham vọng, bạn có thể bắt đầu với Hướng dẫn "Học C" của Scott Stevenson , nhưng nó có một số điều kiện tiên quyết ("Bạn nên biết ít nhất một ngôn ngữ lập trình hoặc kịch bản, bao gồm các hàm, biến và vòng lặp. Bạn ' Cũng cần nhập lệnh vào Mac OS X. Terminal. ").
(Chỉ đối với bản ghi và ngữ cảnh: Tôi đã học cả hai cùng một lúc vào năm 1991 - điều đó dường như không gây hại cho tôi. Tuy nhiên, tôi đã có kiến thức nền tảng về BASIC, Pascal, Logo và LISP. )
Tôi đã suy nghĩ rất nhiều về vấn đề này trước khi viết cuốn sách của mình về Objective-C. Đầu tiên, tôi thực sự tin rằng học ngôn ngữ C trước khi học Objective-C là một con đường sai lầm. C là một thủ tụcngôn ngữ chứa nhiều tính năng không cần thiết để lập trình trong Objective-C, đặc biệt là ở cấp độ người mới. Trên thực tế, sử dụng một số tính năng này đi ngược lại với việc tuân thủ một phương pháp lập trình hướng đối tượng tốt. Việc dạy tất cả các chi tiết của một ngôn ngữ thủ tục (và tấn công giải pháp của một vấn đề bằng các hàm và kỹ thuật lập trình có cấu trúc) cũng không phải là một ý kiến hay trước khi học hướng đối tượng. Điều này có thể khiến lập trình viên bắt đầu đi sai hướng, có khả năng dẫn đến việc phát triển sai định hướng và tư duy để bồi dưỡng một ngành lập trình hướng đối tượng tốt. Chỉ vì Objective-C là một phần mở rộng của ngôn ngữ C không có nghĩa là bạn phải học C trước!
Tôi nghĩ rằng việc dạy Objective-C và ngôn ngữ C nền tảng như một ngôn ngữ tích hợp duy nhất là cách tiếp cận đúng đắn. Không có lý do gì để biết rằng câu lệnh "for" là từ ngôn ngữ C chứ không phải từ ngôn ngữ Objective-C siêu tập của nó. Hơn nữa, tại sao phải tìm hiểu chi tiết về những thứ như mảng và chuỗi C (và thao tác với chúng) trướctìm hiểu về mảng (NSArray) và đối tượng chuỗi (NSString), chẳng hạn? Nhiều văn bản C dành rất nhiều thời gian cho các cấu trúc và con trỏ đến cấu trúc, và lặp qua các mảng với con trỏ. Nhưng bạn có thể bắt đầu viết các chương trình Objective-C mà không cần biết về bất kỳ tính năng nào của ngôn ngữ C này. Và đối với một lập trình viên mới vào nghề, đó là một vấn đề lớn. Điều đó không chỉ giúp rút ngắn lộ trình học tập mà còn giảm lượng tài liệu phải học (và một số tài liệu được lọc ra một cách có chọn lọc) để viết chương trình Objective-C.
Tôi đồng ý rằng bạn sẽ muốn tìm hiểu hầu hết, nếu không phải tất cả, các tính năng cơ bản của C, nhưng nhiều tính năng có thể được hoãn lại cho đến khi nắm chắc về định nghĩa các lớp và phương thức, làm việc với các đối tượng và biểu thức thông báo, đồng thời hiểu các khái niệm về kế thừa và đa hình được hiểu rõ.
Tôi sẽ đi sâu vào Mục tiêu C - nếu bạn đã có một vài ngôn ngữ trong tầm tay của mình, thì đó không phải là cú pháp mà là đường cong học tập, đó là Ca cao.
Tôi nghĩ rằng, phần lớn, học C là một ý tưởng hay bất kể bạn đang tham gia vào lĩnh vực nào, ít nhất là để nắm bắt các hoạt động bên trong của phát triển phần mềm trước khi sử dụng hàng đóng gói sẵn, theo cách đó nếu có sự cố bạn có cơ hội hiểu rõ hơn về hoạt động bên trong. Có rất nhiều cuộc thảo luận về điều này trên SO, và đó là một câu hỏi khá chủ quan, nhưng nói chung, bạn vốn dĩ sẽ sử dụng C trong mã Objective-C của mình, vì vậy tôi đoán nó thực sự tùy thuộc vào bạn. Tôi là một người có nền tảng, nhưng đôi khi điều đó có thể cản trở và tôi biết một số người thông minh đã làm việc theo cách của họ từ trên xuống, tôi nghĩ phần quan trọng là bạn phải hiểu được hoạt động bên trong như nó sẽ thiết lập khả năng của bạn khác biệt với những người không cũng như tăng khả năng của bạn.
Tốt hơn hết là bạn nên học C trước khi học Objective-C, đây là một tập thay thế nghiêm ngặt của C. Điều này có nghĩa là Objective-C có thể hỗ trợ tất cả mã C thông thường, vì vậy mã chung cho các chương trình C nhất định phải hiển thị ngay cả trong Objective- Mã C.
Ngoài việc xem xét mọi thứ thuần túy từ quan điểm ngôn ngữ, bạn sẽ thấy rằng Mac OS X là một hệ điều hành Unix hoàn chỉnh. Tất cả các thư viện cấp hệ thống đều được viết bằng C.
Có thể học cả hai cùng một lúc, nhưng tôi nghĩ bạn sẽ đánh giá cao và hiểu Objective-C hơn nếu bạn có kiến thức làm việc vững chắc về C trước.
Tôi sẽ học Objective-C và học càng nhiều C nếu bạn cần khi bạn tiếp tục.
Các lĩnh vực của C mà bạn sẽ không phụ thuộc nhiều:
Khi bạn học Objective-C và Cocoa, bạn không thể tránh khỏi việc học các bit của C. Ví dụ, hình chữ nhật thường được đại diện bởi CGRect, một cấu trúc C.
Nếu bạn có thời gian, hãy học C. Như những người khác đã nói ở đây, cuốn sách của Kochan (ấn bản thứ hai và thứ nhất) là một cuốn sách tuyệt vời để bạn nhúng tay vào.
Có rất nhiều thứ bạn không thể làm hoàn toàn trong Objective-C, vì vậy việc học một số kỹ năng C cơ bản sẽ khá quan trọng. Ít nhất bạn sẽ cần hiểu khai báo biến và các hàm thư viện C cơ bản, nếu không bạn sẽ thất vọng.
Thành thật mà nói, rất nhiều ngôn ngữ dựa trên cú pháp C mà đó là một điều tốt để làm quen. Tôi sẽ mất một hoặc hai tuần để làm quen với C bất kể.
Điều đó nói rằng, tôi đã chỉ dạy bản thân mình Mục tiêu C, và tôi phải thành thật rằng: Tôi không thấy trải nghiệm C của mình hữu ích như tôi nghĩ. Mục tiêu C chắc chắn đã mở mang tầm mắt cho tôi.
Bạn có thể chuyển thẳng vào Objective-C, với những lợi ích sau:
Ít nhất đối với tôi, học một ngôn ngữ mới dễ dàng hơn khi tôi quan tâm đến một số ứng dụng hoặc mẫu cụ thể, và tôi thất bại khi phải học một thứ khác không đúng với những gì tôi quan tâm.
Bạn luôn có thể trau dồi kiến thức C của mình sau này nếu bạn quan tâm đến lập trình cấp thấp hơn.
Tốt hơn, tôi không biết, thậm chí ít hơn vì tôi không quen thuộc với Objective-C.
Nhưng các cơ sở của C không quá khó để học, nó không phải là một ngôn ngữ quá phức tạp (về mặt cú pháp, không phải về trình độ thông thạo!), Vì vậy hãy tiếp tục, nó sẽ không lãng phí thời gian.
Cá nhân tôi nghĩ rằng việc học C luôn là một ý kiến hay, nó cho ta một cái nhìn sâu sắc về cách máy tính hoạt động. Rốt cuộc, hầu hết các ngôn ngữ và hệ thống vẫn được viết bằng C. Sau đó, hãy tiếp tục! :-)
Tái bút: "Tiến lên", ý tôi không phải là "bỏ nó đi", chỉ là "học thêm, học khác". Một khi bạn biết C, bạn có thể không bao giờ bỏ nó: Java sử dụng JNI để gọi các quy trình C cho những thứ cấp thấp, Python, Lua, v.v. thường được mở rộng bằng mã C (Tham chiếu Lua thậm chí chỉ giả định một số kiến thức C cho một số hàm chỉ một trình bao bọc mỏng cho hàm C phía sau), v.v.
Có, học ngôn ngữ C trước bất kỳ ngôn ngữ nâng cao nào khác sẽ giúp bạn học nhanh hơn các ngôn ngữ khác.
C cung cấp cho bạn rất ít trừu tượng từ lắp ráp. Một số trình biên dịch C thậm chí sẽ cho phép bạn lắp ráp nội tuyến. Điều này có thể rất hữu ích cho việc suy nghĩ về cách máy tính hoạt động, điều quan trọng cần biết.
Điều đó đang được nói, nếu bạn thực sự quan tâm đến Object-C, đừng để bản thân gặp khó khăn khi viết một cái gì đó bằng C chỉ vì nó "tốt cho bạn". Bạn không cần phải làm bản thân thất vọng khi đang cố gắng học một bộ kỹ năng mới. Điều quan trọng là bạn phải vui vẻ với những gì bạn đang làm.
Bạn có muốn trở thành một nhà phát triển cốt lõi? Sau đó tìm hiểu c trước.
Những cuốn sách bạn cần để hoàn toàn thành thạo c là một số tác phẩm hay nhất về công nghệ. Đây là những gì bạn cần:
Mục tiêu C đủ khác với C để không phải học C trước.
Từ góc độ cú pháp / ngôn ngữ-họ, gần như tốt hơn là nghiên cứu SmallTalk (dựa trên mục tiêu C)
Từ góc độ thực tế, hãy tập trung nỗ lực của bạn vào việc học một ngôn ngữ tại một thời điểm.
Sau này, nếu bạn muốn học một ngôn ngữ khác, C ++, Java và Python 1) dễ học như một nhóm 2) phổ biến và do đó có thể bán được trên thị trường 3) mạnh mẽ.
Bạn nên có kiến thức cơ bản về C trước khi bắt đầu Objective_C, nhưng không cần phải nắm vững mọi chi tiết của C.
Tôi đã xuất bản ghi chú của mình sau khi đọc "Lập trình trong Objective-C" trong trường hợp nó giúp ích cho người khác.
Tùy thuộc vào nhiều ngôn ngữ mà bạn đã biết, có thể tốt hơn nếu chỉ bắt đầu học Objective-C. Nền tảng trong hầu hết các ngôn ngữ về cơ bản là giống nhau, đó là cú pháp khác nhau. Học C trước không thực sự tạo ra nhiều khác biệt khi học Objective-C.
Tôi đã học Objective-C ngay lập tức và nó hoạt động tốt trong khoảng một năm nay, tôi chỉ gặp một số khó khăn khi đọc mã C khi tôi tải xuống dự án để xem chúng hoạt động như thế nào, nhưng bây giờ tôi thực sự cảm thấy cần phải học C. Bạn có thể thử học. ObjectC không có C, nhưng sớm hay muộn, bạn sẽ cần C.
IMHO trước tiên nên học ít nhất một số C và đặc biệt là về con trỏ. Điều đó thậm chí còn quan trọng hơn nếu một từ đến từ một ngôn ngữ không có con trỏ. Rất nhiều người hỏi về mã như
NSString *string = [[NSString alloc] init];
string = @"something";
vì họ không biết về sự phân biệt giữa một con trỏ và đối tượng mà nó trỏ tới.
Tất nhiên người ta không cần phải học tất cả C trước khi có thể bắt đầu với Objective-C, nhưng một số điều cơ bản là hoàn toàn cần thiết.
Rất tiếc, hãy đến thẳng mục tiêu C!
Tôi đã chuyển từ ActionScript 3 sang Objective C và tôi đã có một nhân viên thực tập tại một công ty!
Làm những gì bạn muốn.
Nếu bạn học một số ngôn ngữ khác trước đó, thì bạn sẽ luôn nhầm lẫn trong việc viết đúng cú pháp. Tôi không biết mục đích, nhưng Đối tượng C sử dụng cú pháp kỳ lạ (không phổ biến) để gọi các phương thức đối tượng. Nó đặt tên cho nó là gửi tin nhắn, vâng, nó đúng theo khái niệm Hướng đối tượng thuần túy, tuy nhiên hầu hết các ngôn ngữ hướng đối tượng đặt tên như phương thức gọi và sử dụng cú pháp truyền thống hơn của phương thức gọi. Việc thu gom rác cũng là một thứ gì đó rất kỳ quặc, Đối tượng C dựa trên số lượng tham chiếu của trường cũ. Vì vậy bạn sẽ khó chấp nhận nếu chuyển từ ngôn ngữ khác. Tôi đang viết một cuốn sách Hướng dẫn di chuyển nhanh đối tượng C cho các lập trình viên C / C ++ với hy vọng sẽ giúp mọi người nhận ra tất cả các khác biệt nhanh hơn.