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:
- Tạo thuộc tính, cho phép gọi
self.value
- Đổi tên instance variable của tôi, chẳng hạn như
_value
- Đổi tên biến lập luận init của tôi, chẳng hạn như
initValue
hoặcargValue
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.
Tôi sử dụng 'crunkIn' vì nếu không bạn sẽ không tự động hoàn tất. –
@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:]' –
@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. –