2009-04-30 25 views
22

Tôi có tài sản BOOL chỉ đọc. Mô hình đặt tên chi phối ở đây là gì?Quy ước đặt tên cho thuộc tính BOOL Obj-C 2?

Bối cảnh: cho tờ khai phương pháp cũ đơn giản, mô hình được chấp nhận

- (BOOL)isEditable; 
- (void)setEditable:(BOOL)flag; 

Trong một thế giới @property, mà thường sẽ được diễn tả như

@property(getter=isEditable) BOOL editable; 

Tuy nhiên, có những ví dụ ngược lại. Chẳng hạn như trong CalStore/CalCalendar.h

@property(readonly) BOOL isEditable; 

(Is CalCalendar sai ở đây, hay là cũng là một mô hình đặt tên có thể chấp nhận cho read-only tính BOOL?)

Tôi đã có một bộ điều khiển trong đó quản lý một chế độ xem, có thể hoặc không thể thay đổi kích thước. Thuộc tính chỉ đọc.

@property(readonly) BOOL viewIsResizable; 
@property(readonly) BOOL isViewResizable; 
@property(readonly, getter=isViewResizable) BOOL viewResizable; 

Mẫu nào là tự nhiên nhất hoặc giống cacao?

+0

Nó có vẻ rất lúng túng để tôi phải viết calendar.isEditable như trái ngược với calendar.editable. Tôi nghĩ lựa chọn thứ ba của bạn là "giống cacao" nhất và tự nhiên nhất. Nó chủ yếu là một vấn đề của ý kiến, nhưng đó sẽ là sở thích của tôi vì nó phù hợp nhất với phần còn lại của Cocoa. – Alex

+0

Nó không phải là vấn đề của ý kiến, đó là vấn đề chính xác. Điều đó đang được nói, Alex chắc chắn đúng: thứ ba là con đường để đi. –

+0

Alex dường như mâu thuẫn với chính mình - không phải là câu trả lời thứ 3 mà kết quả là "calendar.isEditable" được gọi là "awkward" – Rhubarb

Trả lời

-2

Quy ước này chắc chắn là để làm is... cho getters BOOL. Lý do bạn thấy tài sản thiết lập như thế trong CalStore rất có thể vì nó chỉ đọc và viết theo cách đó để có thể đọc cơ bản của tập tin tiêu đề, vì:

@property(readonly) isEditable; 

nói chung là dễ đọc hơn:

@property(readonly, getter=isEditable) editable; 

Đối với loại đầu tiên của bất động sản, trong việc thực hiện của bạn, bạn có thể làm một trong hai:

@synthesize isEditable = editable; 

hoặc đơn giản là xác định các accessor:

- (BOOL)isEditable(void) { return editable; } 

Điều này khiến tệp giao diện (tiêu đề) dễ đọc hơn bởi người dùng tiềm năng.

+0

Trong trường hợp 2 và 3, getter sẽ được đặt tên làViewResizable. Nó chỉ là vấn đề của những gì tài sản được đặt tên. [controller isViewResizable]; nhưng controller.isViewResizable hoặc controller.viewResizable Sau này đọc buồn cười, nhưng là phù hợp với [nút IsEditable] -> button.editable (. Mà bản thân nó không phù hợp với CalCalendar) –

+0

@property (readonly) có thể chỉnh sửa; không tương đương với @property (chỉ đọc, getter = isEditable) có thể chỉnh sửa; bởi vì trong trường hợp trước, thuộc tính được truy cập với foo.isEditable và sau đó có foo.editable. Nó không có gì để làm với khả năng đọc tiêu đề, nó chỉ đơn giản là sai.Việc thay đổi ivar trở lại thành có thể chỉnh sửa bằng cách sử dụng câu lệnh tổng hợp sẽ không thay đổi tên thuộc tính. –

+0

@NickLockwood Anh ấy đã hỏi về quy ước và một số người thích truy cập các thuộc tính chỉ đọc của họ thông qua getters 'is' style. Bạn hoàn toàn có thể truy cập thuộc tính 'editable' trong ví dụ thứ hai là' foo.isEditable'. Rõ ràng, bạn có thể _only_ truy cập nó theo cách này theo kiểu đầu tiên. Tổng hợp cho ivar 'editable' không phải là một nỗ lực để thay đổi tên thuộc tính ... rõ ràng là' isEditable' là thay đổi mã vạch để mã cài đặt nó trong lớp thực tế vẫn tuân theo quy ước setter. Dù bằng cách nào, cá nhân tôi sẽ chỉ sử dụng thứ hai. –

5

Tôi không nghĩ rằng nó thực sự quan trọng, vì KVO sẽ xem xét cả hai is<Key><Key>.

Nhìn vào các lớp iPhone, mô hình phổ biến nhất mà tôi đã nhìn thấy là:

@property (nonatomic, getter = Được ẩn) bool ẩn;

của bạn truy cập vào bất động sản trong những cách để điều này:

obj.hidden = YES; // (1) 
BOOL hidden = obj.hidden; // (2) 
BOOL hidden = [obj isHidden]; // (3) 

Nhưng không:

BOOL hidden = obj.isHidden; // (4) 

CalStore không tuân theo quy ước đó. Bạn sẽ phải sử dụng dòng 4 thay vì dòng 2.

+1

Sự khác biệt thú vị ở đây (cho dù đó là quan trọng là một vấn đề khác) là trong CalStore tài sản là chỉ đọc. obj.hidden = YES đọc tự nhiên, trong khi obj.isHidden = YES thì ít hơn. Nhưng trong trường hợp chỉ đọc, bạn sẽ không bao giờ gán trạng thái, chỉ truy vấn nó. –

3

Ví dụ về CalStore dường như vi phạm quy ước. Tôi muốn dính vào tên của tài sản, trái ngược với tên của phương thức, không có "cái" trong đó.

29

trích dẫn từ ADC

Nếu thuộc tính được thể hiện như một tính từ , định dạng là:

- (void)setAdjective:(BOOL)flag; 
- (BOOL)isAdjective; 

Ví dụ:

- (void)setEditable:(BOOL)flag; 
- (BOOL)isEditable; 

Nếu thuộc tính được thể hiện như một động từ, định dạng là:

- (void)setVerbObject:(BOOL)flag; 
- (BOOL)verbObject; 

Ví dụ:

- (void)setShowsAlpha:(BOOL)flag; 
- (BOOL)showsAlpha; 

Động từ phải ở trong thì present simple căng thẳng.

| K <

+0

Những gì kent nói; tài sản của bạn nên được đặt tên là "resizable" hoặc "viewResizable" và nên khai báo getter = isViewResizable. –

+0

Một liên kết tốt hơn đến ADC sẽ là trang trên các thuộc tính chứ không phải là người truy cập - vì nó cho thấy cách khai báo điều này như là một thuộc tính https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CodingGuidelines/ Bài viết/NamingIvarsAndTypes.html # // apple_ref/doc/uid/20001284-BAJGIIJE – Rhubarb

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