Đóng gói dữ liệu Objective-C
Tất cả các chương trình Objective-C đều bao gồm hai yếu tố cơ bản sau:
Program statements (code) - Đây là một phần của chương trình thực hiện các hành động và chúng được gọi là các phương thức.
Program data - Dữ liệu là thông tin của chương trình bị ảnh hưởng bởi các chức năng của chương trình.
Đóng gói là một khái niệm Lập trình hướng đối tượng liên kết dữ liệu và các chức năng thao tác dữ liệu với nhau và giữ an toàn trước sự can thiệp và lạm dụng từ bên ngoài. Tính năng đóng gói dữ liệu đã dẫn đến khái niệm OOP quan trọng vềdata hiding.
Data encapsulation là một cơ chế gói dữ liệu và các chức năng sử dụng chúng, và data abstraction là một cơ chế chỉ để lộ các giao diện và ẩn các chi tiết triển khai với người dùng.
Objective-C hỗ trợ các thuộc tính đóng gói và ẩn dữ liệu thông qua việc tạo ra các kiểu do người dùng xác định, được gọi là classes. Ví dụ -
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
Biến tổng là private và chúng ta không thể truy cập từ bên ngoài lớp. Điều này có nghĩa là chúng chỉ có thể được truy cập bởi các thành viên khác của lớp Adder chứ không phải bất kỳ phần nào khác trong chương trình của bạn. Đây là một cách để đạt được sự đóng gói.
Các phương thức bên trong tệp giao diện có thể truy cập được và có phạm vi công khai.
Có những phương pháp riêng tư, được viết với sự trợ giúp của extensions, mà chúng ta sẽ tìm hiểu trong các chương sắp tới.
Ví dụ về đóng gói dữ liệu
Bất kỳ chương trình Objective-C nào mà bạn triển khai một lớp có các biến thành viên công cộng và riêng tư là một ví dụ về đóng gói dữ liệu và trừu tượng hóa dữ liệu. Hãy xem xét ví dụ sau:
#import <Foundation/Foundation.h>
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
@implementation Adder
-(id)initWithInitialNumber:(NSInteger)initialNumber {
total = initialNumber;
return self;
}
- (void)addNumber:(NSInteger)newNumber {
total = total + newNumber;
}
- (NSInteger)getTotal {
return total;
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Adder *adder = [[Adder alloc]initWithInitialNumber:10];
[adder addNumber:5];
[adder addNumber:4];
NSLog(@"The total is %ld",[adder getTotal]);
[pool drain];
return 0;
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
2013-09-22 21:17:30.485 DataEncapsulation[317:303] The total is 19
Lớp trên cộng các số lại với nhau và trả về tổng. Các thành viên công cộngaddNum và getTotal là các giao diện với thế giới bên ngoài và người dùng cần biết chúng để sử dụng lớp. Thành viên riêngtotal là một cái gì đó ẩn với thế giới bên ngoài, nhưng cần thiết để lớp hoạt động bình thường.
Chiến lược thiết kế
Hầu hết chúng ta đã học được qua kinh nghiệm cay đắng để đặt các thành viên trong lớp ở chế độ riêng tư theo mặc định trừ khi chúng ta thực sự cần để lộ chúng. Điều đó thật tốtencapsulation.
Điều quan trọng là phải hiểu đóng gói dữ liệu vì nó là một trong những tính năng cốt lõi của tất cả các ngôn ngữ Lập trình hướng đối tượng (OOP) bao gồm Objective-C.