2010-10-11 27 views
15

Tôi mới vào Objective-C, nhưng hãy giúp tôi ở đây.Chữ ký phương thức-mục tiêu-C. Chúng có mâu thuẫn không?

Điều tôi thấy là chữ ký của phương thức trong Mục tiêu-C có nhiều tham số dường như không phù hợp.

Ví dụ:

- (void) sendEmail: (NSString *) toStr 
     subject:(NSString *) subjectStr 
     body:(NSString *) bodyStr; 

OK, vì vậy ở đây chúng tôi có 3 "thông số" (ít nhất đó là những gì tôi đang sử dụng để gọi họ), nhưng 2 trong số đó có những cái tên "bên ngoài" (chủ đề, cơ thể) nhưng cái đầu tiên thì không! Không phải là có điều gì sai trái với điều đó từ quan điểm nhất quán/phong cách?

Khi chúng ta gọi phương pháp này, chúng tôi làm điều đó thích:

[emailObj sendEmail:@"[email protected]" subject:@"testSub" body:@"this is a test"] 

(Hy vọng rằng tôi đã đúng mà, nhớ Tôi mới đến đây.)

Vì vậy, các chủ đề và cơ thể được đánh dấu rõ ràng trong cuộc gọi, nhưng không phải là địa chỉ "đến"? Có vẻ như nó thực sự đã làm tôi thất vọng. Tại sao tham số đầu tiên lại nhận được sự điều trị đặc biệt?

Trả lời

14

Tôi đoán bạn nghĩ rằng trong tờ khai phương pháp

-(void) A:(NSObject*)a B:(NSObject*)b C:(NSObject*)c 

A là tên phương pháp, BC là tên của tham số.

Trong mục tiêu-C, tổng thể A:B:C: là tên phương thức (kỹ thuật hơn, được gọi là bộ chọn ) và được sử dụng làm đơn vị khi bạn gọi phương thức theo tên. Ví dụ:

if([obj respondsToSelector:@selector(A:B:C:)]){ 
    ... 
} 

kiểm tra xem obj có trả lời A:B:C: hay không. Nhưng [obj respondsToSelector:@selector(A:)] sẽ là NO trong trường hợp này.

Vì vậy, bạn thực sự nên nghĩ tổng thể của A:B:C: làm tên phương thức và A là tên của tham số đầu tiên.

Cũng lưu ý rằng bạn cũng không thể gọi số A:B:C:A:C:B:.

+0

Cảm ơn, điều đó giúp ích một chút, nhưng tôi vẫn không thích nó. Tôi thích có phương pháp có tên chung chung hơn và có đối số hoặc tham số cung cấp một số chi tiết cụ thể. – Fraggle

+0

Nói cách khác, nếu bạn nghĩ về các cuộc gọi hàm/phương thức trong C, C++, Java, Perl, Javascript, C#, Python, PHP, vv thì tên phương thức thường sẽ là sendEmail và nó sẽ lấy 3 đối số/tham số. Điều này cũng hoạt động tốt khi bạn muốn quá tải phương pháp của bạn để bạn có thể có một phiên bản mà mất 2 args, khác mà mất 3. Họ sẽ tất cả có cùng một tên phương pháp nhưng chỉ khác nhau số lượng các đối số. Ngoài ra, tôi cảm thấy rằng hầu hết mọi người không nghĩ đến "A: B: C" là tên phương thức, mặc dù về mặt kỹ thuật nó có thể là. Hầu hết các cuốn sách tôi đã xem là A là tên của phương thức hoặc xử lý nó như vậy. – Fraggle

+5

Tôi không thể làm gì cho bạn nếu bạn không thích. Đó là cuộc sống trong Objective-C. Bạn cần phải nói với những người triển khai Objective-C trong Apple. Và, bạn nên đốt cháy những cuốn sách đó đề cập đến 'A' như tên phương pháp. Đó là sai về mặt kỹ thuật và chỉ gây nhầm lẫn cho người đọc. Bạn đã chọn một cuốn sách sai. – Yuji

10

Tôi sẽ nói rằng nếu bạn đang bối rối về những gì một phương pháp làm, sau đó nó có thể không được đặt tên cũng như nó có thể đã được.

Với bộ chọn ở trên, tôi sẽ mong đợi 3 tham số là một loại đối tượng email, chủ đề và nội dung. Tuy nhiên, vì thông số đầu tiên không phải là đối tượng "Email" nhưng thay vào đó là người nhận email, tôi có thể đổi tên phương thức này thành:

- (void) sendEmailToRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body; 
+0

Nếu đó là phương pháp vẽ hình chữ nhật thì sao? Sau đó, có vẻ như tôi sẽ cần sự vụng về: "- (void) drawRectangleWidth: (int) width drawRectangleHeight: (int) height", sắp xếp bó các mục tiêu chính (vẽ một hình chữ nhật) với tên của các tham số. – Fraggle

+0

Một lần nữa, đó là quy ước mà Apple đã chọn để sử dụng.Điểm của Apple không phải là để rút ngắn biểu thức và chỉ để viết mục tiêu chính; ý tưởng là API buộc bạn viết các câu tiếng Anh mô tả hành động, ngay cả khi không có nhận xét rõ ràng. – Yuji

+0

'- (void) drawRectangleWithWidth: (int) width vàHeight: (int) height' sẽ có nhiều khả năng hơn. Quan điểm của tôi là nó là sự cải tiến so với 'c', vì ngữ nghĩa của việc sử dụng đối số là vô hình trong mã viết (chúng nằm trong khai báo, không phải là sử dụng), nhưng vì chúng đã thêm các khối sử dụng định dạng C chứ không phải định dạng selector, có vẻ như không phải ai cũng đồng ý. –

12

Trong hầu hết các trường hợp, các phương pháp như vậy thường được đặt tên sao cho việc thiếu tên trên tham số đầu tiên có ý nghĩa. Trong trường hợp này, tôi sẽ mong đợi một cái gì đó như sendEmailTo.

+1

Phải, tôi hiểu, nhưng có vẻ lạ. Ý tôi là mục tiêu của tôi là gửi email, địa chỉ đến chỉ là một thành phần. – Fraggle

+0

@Paul G .: Tôi không nhất thiết phải nói rằng các quy ước của Objective C là hợp lý hơn lời gọi phương thức kiểu C truyền thống (cá nhân tôi không nghĩ chúng là vậy, nhưng đó có thể chỉ là do kiểu C là được sử dụng để), nhưng đây là những gì họ đang có. –

Các vấn đề liên quan