2011-10-06 3 views
6

iはサンプルコードListAdderを通して読んでいた、そして右の変数の後にアサート多くの、またはほとんどすべての方法に使用される、例えば、がある(そしてなぜ何度使用して):なぜプロジェクトで 'assert'を使うのですか?

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

をまたは:

- (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)); 

私は不思議に思っていましたが、何がポイントですか?

おかげ

答えて

5

Design by ContractまたはDbCの実装です。

Objective CはDbCの事前条件、事後条件および不変条件をネイティブサポートしていませんが、特にポスト条件および事前条件をマクロで実装することは可能です。 D programming languageDbCがあり、ここでDbCのと同じスタイルで、ミシェル・Fortinsの試みですが、ために

2

は、アサーションのポイントは、バグが後にすぐに表示し、簡単に診断可能な方法で、その代わりとして、微妙な不正行為のことを確認することです。この場合、そのコードの開発者は、コード実行後に4つの条件が成立することを保証したいと考えています。

2

アサーションは、コードがどのように呼び出されるかについてのプログラマの前提をチェックします。仮定が間違っていると、アサーションは失敗し、例外がスローされます。これによりコードはできるだけ早く失敗します。

これを行うかどうかは議論のポイントです。あまりにも遠くに取ることができます。

+0

私はObjective Cについては分かりませんが、他の言語ではコンパイル時には無効にすることができ、ライブシステムの速度を落とすことはありませんが、テストやステージング中にバグ検出に使用できます。 – corsiKa

関連する問題