Đây không phải là một câu hỏi kiểu. Nó nhiều hơn về việc sử dụng đúng ngôn ngữ. Tôi khá mới để lập trình và tôi hoàn toàn mới với Objective-C và Cocoa nhưng sau khi đọc về ngôn ngữ và xem xét một số mẫu mã một số mẫu sử dụng tiếp tục bật lên mà không có ý nghĩa với tôi. Hay đúng hơn là chúng dường như không tối ưu trong tâm trí tôi. Tôi hy vọng tất cả các bạn có thể giúp giáo dục tôi trong việc sử dụng đúng đắn một số cấu trúc ngôn ngữ này.Cách thích hợp để sử dụng Mục tiêu C
giao diện và giao thức
Tôi hiểu khái niệm về giao diện và triển khai khi chúng liên quan đến trừu tượng. Tuy nhiên mô hình chi phối tôi thấy trong mẫu mã Objective-C là sau ...
@interface Foo : NSObject
{
some ivars decls
}
some methods decls
@end
Và sau đó mã khách hàng theo hình thức ...
Foo* f = [[Foo alloc] init];
Điều này có vẻ kỳ quặc với tôi. Foo có vẻ là một thực hiện trong tâm trí của tôi (không quan tâm đến việc đặt tên không may của từ khóa @interface). Giao diện trong tâm trí của tôi không để lộ các biến mẫu. Một khách hàng của lớp này không nên được tiếp xúc với các chi tiết của việc thực hiện của tôi.
Mục tiêu-C có từ khóa @protocol mà trong đầu tôi có nhiều giao diện hơn từ khóa @interface. Nó cho phép bạn xác định các phương thức và/hoặc thuộc tính và đó là nó. Không thực hiện. Không có biến mẫu. Chỉ cần giao diện.
@protocol Foo <NSObject>
some methods
maybe some properties
@end
@interface FooProvider : NSObject
+ (FooProvider*) sharedProvider;
- (id<Foo>) fooWithBlahBlah;
@end
Vì vậy, các mã khách hàng sẽ mang hình thức của ...
id<Foo> f = [[FooProvider sharedProvider] fooWithBlahBlah];
[f whatever];
Điều này có vẻ (ít nhất là với tôi) là một sử dụng trừu tượng hơn của ngôn ngữ và phân lập các khách hàng từ các chi tiết triển khai mà họ không phụ thuộc vào. Câu hỏi của tôi là tôi nên cố gắng làm theo. Tôi hiểu rằng có thể có những tình huống mà người ta thích hợp hơn người kia nhưng về mặt chung thì một người nên là tiêu chuẩn và một là ngoại lệ?
Một số hướng dẫn sẽ được đánh giá cao.
Cảm ơn, La Mã
Câu trả lời hay, đặc biệt là để giải quyết câu hỏi của OP về cá thể riêng các biến trong tệp tiêu đề. Chỉ cần thêm liên kết đến một câu hỏi SO khác về vấn đề cụ thể đó: http://stackoverflow.com/questions/966893/why-are-instance-variables-defined-in-the-header-file-in-objective-c –
Mục tiêu -C là một lớp thực sự mỏng trên C. Nó thực sự chỉ quản lý một vài bảng biểu tượng trong quá trình biên dịch; rất giống với bản tiền xử lý c. Tôi chắc chắn hầu hết các quyết định đều làm cho việc viết mã trở nên dễ dàng hơn (như sử dụng dấu ngoặc vuông thay vì parens, họ phải tìm một thứ gì đó mà họ có thể dễ dàng phân tích cú pháp và trích xuất từ mã xung quanh. Có lẽ lý do họ chọn tuân thủ cú pháp Lisp là Tôi nghĩ rằng các tập tin tiêu đề là đầu vào duy nhất, không chỉ là một thay thế tượng trưng, vì vậy đó có lẽ là lý do tại sao họ đặt các biến ở đó –
Họ không tuân theo cú pháp Lisp, mà là Smalltalk cố gắng xử lý càng nhiều càng tốt (bao gồm cả các câu lệnh điều kiện) thông qua việc sử dụng thông điệp đồng đều, và cú pháp phản ánh nguyên tắc thiết kế này bằng cách cơ bản bao gồm các khối lồng nhau – Felixyz