2012-01-05 28 views
5

Tôi chạy vào một kịch bản khá phổ biến trong Objective-C, trong đó tôi chuyển một biến cho một phương thức init và sau đó gán nó cho một biến cá thể của cùng tên. Tuy nhiên tôi đã không tìm thấy một cách để phạm vi các biến để làm rõ đó là giá trị từ đối số tin nhắn và đó là biến thể hiện.Thực hành tốt cho các tên đối số định hướng so với các tên biến thể trong Objective-C

Nói rằng tôi có một số lớp như sau:

@interface MyObject 
{ 
    NSString *value; 
} 
- (id)initWithValue:(NSString *)value; 
@end 

Thực hiện của tôi, tôi muốn phương pháp init của tôi để tìm một cái gì đó như thế này:

- (id)initWithValue:(NSString *)value 
{ 
    self = [super init]; 
    if(self) { 
     self.value = value; // This will not work with instance variables 
    } 
} 

tôi biết ba giải pháp:

  1. Tạo thuộc tính, cho phép gọi self.value
  2. Đổi tên instance variable của tôi, chẳng hạn như _value
  3. Đổi tên biến lập luận init của tôi, chẳng hạn như initValue hoặc argValue

Tôi không hài lòng với bất kỳ của các giải pháp này. Thêm thuộc tính hoặc làm cho thuộc tính có sẵn công khai trên giao diện hoặc, nếu tôi sử dụng phần mở rộng, hãy ẩn nó khỏi những người thừa kế. Tôi cũng không thích có các tên khác nhau cho các biến hoặc sử dụng dấu gạch dưới, mà có lẽ đến từ việc phát triển bằng các ngôn ngữ khác như Java và C#.

Có cách nào để phân biệt các biến mẫu từ đối số thư không? Nếu không, có một hướng dẫn mã hóa trong Cocoa để làm thế nào để giải quyết vấn đề này? Tôi thích các hướng dẫn về phong cách sau khi thích hợp.

Cập nhật

Sau khi suy nghĩ về cách để làm điều này trong C, tôi đã đưa ra các giải pháp của self->value. Điều này làm việc, nhưng nó tạo ra một cảnh báo trình biên dịch rằng khai báo địa phương là '' giá trị 'ẩn biến thể hiện. Vì vậy, đây không phải là giải pháp thỏa đáng vì tôi có mục tiêu không cảnh báo.

Trả lời

4

Đối setters (và bởi initializers mở rộng), tôi tin rằng các quy ước là tiền tố tên tham số với new:

- (void)setCrunk:(Crunk *)newCrunk; 
- (id)initWithCrunk:(Crunk *)newCrunk; 

Nói chung, tôi nghĩ rằng hình thức phổ biến nhất mà tôi đã nhìn thấy là để gọi tham số theCrunk, nhưng Apple seems to recommendaCrunk.

+0

Tôi sử dụng 'crunkIn' vì nếu không bạn sẽ không tự động hoàn tất. –

+0

@Josh Caswell, để nhất quán là quy ước sử dụng bất kỳ tiền tố nào bạn chọn (mới, a, a) trong mọi trường hợp - ngay cả khi bạn không gán nó? Có lẽ nó chỉ đơn giản là được truyền vào một thông điệp khác, chẳng hạn như '[super setCrunk:]' –

+0

@DavidV: Tôi muốn bỏ tiền tố trừ khi nó cần thiết để phân biệt với ivar, nhưng tôi không thể giả vờ là bất cứ điều gì khác hơn quyền của tôi. –

2

Nếu bạn chỉ sử dụng 1 trình biên dịch sẽ cho bạn cảnh báo.

Bạn có thể kết hợp 1 & 2 bằng cách sử dụng:

@synthesize value = _value; 

Nếu bạn muốn ẩn biến của bạn từ những người kế thừa bạn có thể khai báo một loại tên là trống rỗng và kê khai tài sản của mình ở đó.

Đối với 3 bạn có thể sử dụng aValue cho đối số của mình.

+1

Một nơi nào đó (không thể nhớ) được viết rằng bạn không được phép sử dụng '_' làm tiền tố. Chỉ có Apple làm điều đó. Bạn nên sử dụng nó như một hậu tố, mà Google đề xuất một nơi nào đó (mà tôi cũng không thể nhớ). Vì vậy, 'value = value_' ... kiểm tra http://www.kevincallahan.org/software/accessorizer.html và cũng AppCode nếu bạn nghiêm túc về việc sử dụng giải pháp này. –

+0

Tôi không đồng ý, đó chỉ là quy ước về phong cách. –

+0

Bạn không đồng ý rằng Apple khuyến cáo không nên sử dụng dấu gạch dưới làm tiền tố? –

3

Và thay đổi tên thành "inValue" không phải là một ý tưởng hay?Những gì bạn có ở đây - 'giải pháp' của bạn phức tạp, đặc biệt là với những người truy cập, vv của Obj-C 2. Vì self.value và inValue là những thứ khác nhau, chúng cần các tên khác nhau.

Lưu ý rằng bạn có thể sử dụng

-(void)method1:(NSString*)value; 

trong tiêu đề

-(void)method1:(NSString*)inValue; 

trong file .m.

+0

Tôi nhận thấy rằng bạn có thể có các tên đối số khác nhau trong giao diện và triển khai. Mục tiêu của tôi là có tính nhất quán để các nhà phát triển không phải suy nghĩ về tên được sử dụng. Bạn đã sử dụng quy ước của các tên khác nhau trong giao diện và triển khai chưa? Làm thế nào nó đã làm việc ra cho nhóm của bạn? –

+0

@DavidV đây là một vấn đề không liên quan đến giao diện, chỉ để thực hiện. Điểm của Tom là 100% hợp lệ. –

+0

@Yar, tôi không có ý nói rằng điểm của Tom không hợp lệ. Tôi hiểu rằng giao diện sẽ vẫn nhất quán và một nhà phát triển làm việc trong lớp học sẽ có một kế hoạch đặt tên phù hợp cho ivars. Nó chỉ đơn giản là đây là một giải pháp ban đầu tôi đã không xem xét cho đến khi tôi đọc bài của Tom và bây giờ tôi đang xem xét nó. Tôi làm giá trị nhất quán trong giao diện cao hơn sự nhất quán trong việc triển khai, nhưng tôi vẫn muốn có cái sau. –

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