2011-10-06 32 views
6

tôi đã đọc qua mẫu mã ListAdder, và có rất nhiều khẳng định ngay sau khi thay đổi, hoặc được sử dụng trong hầu hết các phương pháp, ví dụ:tại sao sử dụng 'khẳng định' trong một dự án? (Và tại sao sử dụng nó rất nhiều lần)

self.formatter = [[[NSNumberFormatter alloc] init] autorelease]; assert(self.formatter != nil);

hoặc :

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    #pragma unused(tv) 
    #pragma unused(indexPath) 
    UITableViewCell * cell; 

    assert(tv == self.tableView); 
    assert(indexPath != NULL); 
    assert(indexPath.section < kListAdderSectionIndexCount); 
    assert(indexPath.row < ((indexPath.section == kListAdderSectionIndexNumbers) ? [self.numbers count] : 1)); 

Tôi đã tự hỏi, điểm quan trọng để làm điều đó là gì?

Cảm ơn

Trả lời

5

Đó là việc triển khai Design by Contract hoặc DbC.

Mục tiêu C không có hỗ trợ gốc cho các điều kiện trước, sau điều kiện và bất biến của DbC, nhưng đặc biệt các hậu điều kiện và tiền tố có thể được triển khai khá tốt với các macro.

Dưới đây là một số phương pháp khác để thực hiện DbC trong Objective C:

2

Mấu chốt của khẳng định là để đảm bảo rằng lỗi xuất hiện ngay lập tức, và theo những cách dễ dàng có thể chẩn đoán, thay vì hành vi sai trái như tinh tế sau này. Trong trường hợp này, nhà phát triển của mã đó muốn đảm bảo rằng 4 điều kiện giữ sau khi mã của họ chạy.

2

Các xác nhận kiểm tra các giả định của lập trình viên về cách mã sẽ được gọi. Nếu giả định là sai, khẳng định sẽ thất bại và ném một ngoại lệ. Điều này làm cho mã thất bại càng sớm càng tốt.

Có nên thực hiện điều này hay không là điểm tranh luận. Nó có thể được thực hiện quá xa.

+0

Tôi không biết về mục tiêu C nhưng bằng ngôn ngữ khác Họ có thể bị vô hiệu hóa tại thời gian biên soạn để họ không làm chậm hệ thống trực tiếp, nhưng bạn có thể sử dụng chúng để phát hiện lỗi trong quá trình thử nghiệm và dàn dựng. – corsiKa

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