読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Objective-Cでオブジェクト指向入門してみる。クラスやメソッドを作るサンプル。

<スポンサーリンク>

用語

■間接化って何?
間接化とは、コードで値を直接使う代わりに、その値へのポインタを使うとう意味。
プログラミングの世界では昔から「コンピュータサイエンスでは、間接化のレベルを引き上げることで解決できない問題はない」と言われているらしい。

手続き型プログラミングは関数に基づいている。データは関数を中心に回る。
オブジェクト指向ではこれが逆になる。データを中心に考えて、そのまわりを関数が回っている。
プログラムは関数ではなく、データに焦点があてられる。

■クラス
クラスとは、オブジェクトの型を表す構造体のこと。

■オブジェクト
オブジェクトの値とクラスへの隠しポインタを含んでいる構造体のこと。

インスタンス
インスタンスとは、オブジェクトの別の表現のこと。
オブジェクト = Hogeクラスのインスタンス
ともいえる。

■メッセージとは
メッセージとは、オブジェクトが実行できるアクションのこと。
オブジェクトに何かを実行させるためにメッセージを送信する。

■メソッド
メッセージに応答する形で実行されるコードのこと。

■メソッドディスパッチャ
特定のメッセージに応答する形で実行されるメソッドを判断するメカニズムのこと。

サンプル

NSStringのセッターを作るところで苦戦した。

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @private
    NSString *_name;
    NSString *_message;
}

- (void) setName: (NSString*)name;
- (void) setMessage: (NSString*)message;
- (void) sayMessage;
- (NSString*) getName;
- (NSString*) getMessage;
@end

@implementation Person

- (void) setName: (NSString*)name {
    _name = name;
}

- (void) setMessage: (NSString*)message {
    _message = message;
}

- (void) sayMessage {
    NSLog(@"メッセージは:%@",_message);
}

- (NSString*) getMessage {
    return _message;
}

- (NSString*) getName {
    return _name;
}
@end

int main (int argc, const char * argv[])
{

    Person *mine = [Person new];
    
    [mine setName: @"sho322"];
    [mine setMessage: @"hello, Objective-C"];
     
    [mine sayMessage];
    
    NSLog(@"セットされたメッセージは:%@", [mine getMessage]);
    NSLog(@"セットされた名前は:%@", [mine getName]);

    return 0;
}

これの実行結果は以下のようになる。

2013-10-24 00:20:52.179 mytest[689:903] メッセージは:hello, Objective-C
2013-10-24 00:20:52.183 mytest[689:903] セットされたメッセージは:hello, Objective-C
2013-10-24 00:20:52.184 mytest[689:903] セットされた名前は:sho322

クラスに関する情報を指定する

特定のクラスのオブジェクトを宣言するには、そのクラスに関する情報をObjective-Cコンパイラに指定する必要がある。
オブジェクトのデータメンバーやオブジェクトが提供する機能をコンパイラに教えるためには@interfaceディレクティブを使う。

サンプルでは以下の部分だ。

@interface Person : NSObject
{
    @private
    NSString *_name;
    NSString *_message;
}

- (void) setName: (NSString*)name;
- (void) setMessage: (NSString*)message;
- (void) sayMessage;
- (NSString*) getName;
- (NSString*) getMessage;
@end

ここでは、コンパイラに、「こんなクラスを作るよ〜」って教えているわけだ。

@interfaceセクションはクラスのパブリックインターフェースを定義する。
インターフェースはAPIとも呼ばれる。

サンプルを見てみよう。
先頭のハイフン(-)は、これがObjective-Cのメソッドの宣言であることを示している。
かっこで囲まれている部分がメソッドの戻り値の型のこと。(void)とか(NSString*)のところね。

メソッド名の末尾のコロン(:)も名前の一部で、ちゃんと意味がある。
これを手がかりに、コンパイラもユーザーも「このあとにパラメータが続くんだな」ということがわかる。

逆にいうと、メソッドが引数を取らない場合は、無駄にコロン(:)は付けない。

引数の型はかっこで囲んで指定される。次に続くのがパラメータ名だ。

■@implementation
@implementationは、「クラスの内部構造を表すコードがこれから提供されるよ!」というのをコンパイラに教えるための目印だ。
@endで終わりを表す。
サンプルではこの辺の部分だ。

@implementation Person

- (void) setName: (NSString*)name {
    _name = name;
}

- (void) setMessage: (NSString*)message {
    _message = message;
}

ここでは実際にメソッドが何をするか、具体的な処理を書いている。

Objective-Cオブジェクト指向はけっこう癖があって難しいけれど、慣れるまで頑張りたい。

Tips

Objective-Cでは、@(アットマーク)はC言語に対する拡張を示す。

・Local declaration of 'name' hide instance variable
こんな感じでセッターを書くと
「Local declaration of 'name' hide instance variable」みたいなエラーが出た。

- (void) setName: (NSString*)name {
    self.name = name;
}

以下の記事を参考に直してみたので、メモしておく。
http://stackoverflow.com/questions/7009740/objective-c-this-equivalent-for-fields-with-the-same-name-as-method-parameters

読んだ本

Objective-C超入門 改訂第2版――ゼロからしっかり学べるiPhoneプログラミング【Xcode 4.6で解説】

Objective-C超入門 改訂第2版――ゼロからしっかり学べるiPhoneプログラミング【Xcode 4.6で解説】

感謝のプログラミング

今回で感謝のプログラミングは【678時間目】
10000時間まで、あと【9322時間】

雑感

Objective-Cは普通にJavaとかRubyとかPHPを勉強するときよりも難しい。
でも面白い。やっぱりC(系)言語って難しいんだな。C#はとっつきやすかったんだけど。。
数々の新しい言語達はみんな、C言語の難しいところを抽象化していって、わかりやすくしてくれたんだな〜って思う。
でもやっぱり、Cはプログラマなら避けては通れないはずだから、Objective-CをきっかけにC言語の世界に触れていきたいデス。