6

私はサンプルコードListAdderを読んでいましたが、変数の直後に多くのアサートがあり、ほとんどすべてのメソッドで使用されています。たとえば、次のようになります。

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

私は疑問に思っていました、それをするためのポイントは何ですか?

ありがとう

4

3 に答える 3

5

これは、契約による設計、またはDbCの実装です。

Objective Cは、DbCの前提条件、事後条件、および不変条件をネイティブにサポートしていませんが、特に事後条件と前提条件は、マクロを使用して非常にうまく実装できます。

ObjectiveCでDbCを実装するための他のアプローチは次のとおりです。

于 2011-10-06T17:03:34.990 に答える
2

アサーションのポイントは、後で微妙な不正行為としてではなく、バグがすぐに、簡単に診断できる方法で現れるようにすることです。この場合、そのコードの開発者は、コードの実行後に4つの条件が保持されることを保証したいと考えています。

于 2011-10-06T17:02:22.183 に答える
2

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

これを行うかどうかは議論のポイントです。行き過ぎてしまう可能性があります。

于 2011-10-06T17:02:56.520 に答える