2012-01-07 28 views
9

Tôi đang dọn sạch mã Cocoa cũ để sử dụng các quy ước đặt tên hiện đại. Đã có rất nhiều cuộc thảo luận về thực tiễn tốt nhất, nhưng tôi không chắc chắn về một điều.Thực tiễn tốt nhất cho các quy ước đặt tên cho loại ca cao

Tôi đang suy nghĩ về việc thêm tiền tố vào tên phương thức danh mục, để đảm bảo tính duy nhất. Dường như nói chung đồng ý rằng đây là một ý tưởng hay, mặc dù hầu hết mọi người có lẽ không bận tâm.

Câu hỏi của tôi là: phương pháp loại NSDictionary như -copyDeep có bản sao sâu? Phương pháp được sử dụng để được đặt tên là -deepCopy, nhưng tôi đã đảo ngược các từ khi trình phân tích tìm kiếm tiền tố của "bản sao". Vì vậy, tôi có lẽ không thể thêm tiền tố. Và có "tiền tố" ở giữa hoặc cuối của tên phương thức có vẻ lộn xộn và không nhất quán.

Tôi cũng muốn quan tâm đến suy nghĩ về kiểu tiền tố - Tôi hiện đang sử dụng DS (đối với Hệ thống Dejal) cho tiền tố lớp. Nhưng tôi biết rằng bây giờ Apple muốn đặt trước tất cả tiền tố hai ký tự cho chính họ, vì vậy tôi đang nghĩ đến việc sử dụng Dejal, ví dụ: lớp học của tôi DSManagedObject sẽ được đổi tên thành DejalManagedObject. Và quay trở lại danh mục, phương pháp của họ sẽ được đổi tên để thêm tiền tố dejal, ví dụ: từ -substringFromString: đến -dejalSubstringFromString:. Nhưng -dejalCopyDeep sẽ gây nhầm lẫn cho máy phân tích, vì vậy có thể tôi sẽ không nhất quán với các phương pháp như vậy và sử dụng -copyDeepDejal hoặc -copyDeep_dejal?

Tôi sẽ phát hành lại các danh mục của mình và các lớp khác nhau dưới dạng nguồn mở khi tôi đã làm sạch chúng, vì vậy việc tuân theo các quy ước mới nhất sẽ mang lại lợi ích.

+2

câu hỏi hay! Tôi tò mò về cách bạn nói táo muốn dự trữ tiền tố hai char - tôi chỉ tự hỏi bạn có thông tin đó từ đâu? khi bạn tạo các dự án mới, nó đề xuất một tiền tố 3 char, nhưng đã có một tuyên bố chính thức về nó? –

+1

Tôi không thể tìm thấy tài liệu chính thức nêu rõ điều đó, nhưng tôi tin rằng nó đã được đề cập trong một phiên [WWDC10 về tương lai] [https://deimos.apple.com/WebObjects/Core.woa/BrowsePrivately/adc. apple.com.4092349126.04109539109.4144345635? i = 2082492890). – Dejal

+0

Xem lại câu hỏi cũ này, tôi đã tìm thấy tài liệu về đề xuất tiền tố 3-char, trên [Lập trình với mục tiêu-C: Quy ước] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC /Conventions/Conventions.html). – Dejal

Trả lời

2

Tôi đã gửi thư điện tử tới Nhà Truyền giáo về Khung ứng dụng của Apple về vấn đề này và nhận được thư trả lời đề xuất các tên phương thức đặt tên trước tiên là không phải là. Xung đột với lời khuyên trong phiên WWDC10 đã được khai thác trước đó, nhưng tôi cho rằng phản ánh suy nghĩ hiện tại của Apple.

Anh đề nghị chỉ xem xét API hạt giống beta khác với xung đột điểm, đó là những gì tôi đã luôn làm.

+0

Bạn hoàn toàn nên tiền tố cho các phương pháp thể loại của mình. –

1

Tôi đồng ý với Kevin Ballard, bạn nên thêm tiền tố vào tên phương thức danh mục của mình, đặc biệt nếu bạn định phân phối chúng cho người khác. Nhưng bạn có một mối quan tâm hợp lệ, máy phân tích sẽ bị nhầm lẫn bởi DScopy. Trình biên dịch ARC sẽ tương tự bị nhầm lẫn nếu định nghĩa/thực hiện của DScopy được thực hiện mà không cần ARC và được sử dụng bởi một lớp khác bằng cách sử dụng ARC (hoặc ngược lại).

giải pháp ưa thích của tôi là sử dụng "chú thích chuyển quyền sở hữu", chẳng hạn như:

NS_RETURNS_NOT_RETAINED 
NS_RETURNS_RETAINED 

Họ sẽ được sử dụng để ghi đè lên các hành vi biên dịch mặc định của việc đọc tên phương pháp và hành động trên chúng. Bạn có thể tuyên bố DScopy như vậy: (khai này phải nằm trong một tập tin tiêu đề đó được nhập khẩu bởi tất cả các lớp học sử dụng phương pháp này đề cập do liên kết)

-(DSManagedObject *)DScopy; NS_RETURNS_RETAINED; 

Nguồn NS_RETURNS... WWDC 2011 phiên 322 - Mục tiêu -C tiến bộ trong chiều sâu. Thịt của vấn đề này bắt đầu vào khoảng 9:10.

Lưu ý về "Nhưng tôi biết rằng Apple giờ đây muốn đặt trước tất cả tiền tố hai ký tự cho chính mình". Là một sở thích cá nhân tôi thích sử dụng ký tự _ để tách tiền tố khỏi tên, nó hoạt động tốt cho tôi.Bạn có thể thử một cái gì đó như:

-(DSManagedObject *)ds_copy; NS_RETURNS_RETAINED; 

Điều này sẽ cung cấp cho bạn ba ký tự, và cho là tên phương thức dễ đọc hơn.

Chỉnh sửa Để trả lời liên kết được đăng trong nhận xét.

Tuy nhiên, câu trả lời của Justin cho câu hỏi ban đầu của bạn có thể bị hỏng.

Liên quan đến các thuộc tính; Tôi không đề xuất sử dụng __attribute__((objc_method_family(copy))) Tôi đã đề xuất sử dụng NS_RETURNS_RETAINED, được dịch là: __attribute__((ns_returns_retained)). Trong khi ví dụ đầu tiên thậm chí sẽ không biên dịch (như anh ta nói) bằng cách sử dụng - (NSString *)string __attribute__((objc_method_family(copy))); nó biên dịch với - (NSString *)string; NS_RETURNS_RETAINED; tốt. Rõ ràng là nếu NS_RETURNS_.. được "ẩn" từ trình biên dịch trong riêng biệt .m s hoặc indirected theo một cách khác và trình biên dịch không thể nhìn thấy các chỉ thị sau đó nó sẽ không hoạt động. Bởi vì điều này tôi sẽ đề nghị đặt tuyên bố cho bất kỳ phương pháp nào có thể gây ra sự nhầm lẫn của trình phân tích/biên dịch trong tệp .h chính của bạn (tệp nhập tất cả các phương thức khác) để hạn chế cơ hội có vấn đề.

+0

Bạn có thể muốn [đọc câu trả lời toàn diện] (http://stackoverflow.com/questions/7770872/deep-copy-of-dictionaries-gives-analyze-error-in-xcode-4-2) Tôi nhận được từ @ Justin khi ban đầu hỏi về phương thức 'deepCopy' của tôi, mà tôi đã đổi tên thành' copyDeep' để phù hợp với các quy ước đặt tên. Nhưng tôi đang hướng tới việc sử dụng các tiền tố phương thức trong các danh mục của tôi, với 'NS_RETURNS_RETAINED' cho một vài phương thức cần nó. – Dejal

+0

@Dejal Cảm ơn bạn đã liên kết. Tôi thực sự thực sự thích nó. Tôi cập nhật câu trả lời của mình để có một chút ít giáo điều và trả lời nói chung. – NJones

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