Obj-Cメソッドの戻り値の型は「BOOL」が良いと思う

Objective-Cのメソッドの戻り値の型は「BOOL」が良いと思っています。
こう書くと、何でもかんでも「BOOL」にするべきだと、言っているように誤解されてしまいますね。「BOOL」にした方が良いと思うのは、次のタイプのメソッドのときです。

  • 成功したのか失敗したのかを返すとき

C言語であれば、成功したかどうかを返すときは、エラーコードを返すことが多くあります。エラーコードは一般的には整数型です。そして、エラーコードとして一般的に使われるのは、「0はエラー無し」という定義です。
MacのCarbonの関数でも「noErr」という定数が定義されていて、「エラー無し」を示し、この定数の値は「0」です。
Objective-Cでも同様に、戻り値の型を整数型にしてエラーコードを返すようにすることはできますが、ちょっと考えると不便な点が出てきます。
今、「MyObject」というクラスがあるとし、そのクラスには「doSomething」というメソッドがあるとします。このメソッドは、エラーコードを返し、成功したら「noErr」を返すものとします。それと、「MyObject」クラスの共有インスタンスを返す「sharedInstance」というメソッドもあるとします。

[cc lang="objc"]
@interface MyObject
+ (MyObject *)sharedInstance;
- (NSInteger)doSomething;
@end
[/cc]

次のようなコードを考えてみます。

[cc lang="objc"]
MyObject *obj = [MyObject sharedInstance];
if ([obj doSomething] == noErr)
{
    NSLog(@"Successed");
}
[/cc]

特におかしなところはないコードです。ここで、「sharedInstance」が、このクラスを使用できないマシンでは「nil」を返すとするとちょっと問題が起きます。「obj」が「nil」になってしまうと、「[obj doSomething]」は「0」になってしまい、「noErr」になってしまいます。「obj」が「nil」ということは、クラスを使用できないので「doSomething」も失敗なのにです。「obj」が「nil」ではないかどうかをチェックすることもできますが、それよりも、Objective-Cの特徴を活かして、戻り値の型を「BOOL」にしてみると次のようになります。

[cc lang="objc"]
@interface MyObject
+ (MyObject *)sharedInstance;
- (BOOL)doSomething;
@end
[/cc]
[cc lang="objc"]
MyObject *obj = [MyObject sharedInstace];
if ([obj doSomething])
{
    NSLog(@"Successed");
}
[/cc]

このようにすると、失敗したときは「NO」が返り、「obj」が「nil」のときは「0」なので「NO」という解釈になります。「obj」が「nil」のときも、本当に「doSomething」が失敗したときも同じ扱いになります。
このような理由で「成功したのか失敗したのかを返すとき」は「BOOL」にした方が良いと思います。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次