ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【iPhoneアプリ】基本を忘れないように「オブジェクト指向」について

今回は「オブジェクト指向」についてです。


今後、「Objectiv-C」や「Java」などの開発を行うにあたり
忘れては行けないと思いましたので記載します。

オブジェクト指向とは

プログラム作成する処理内容を物(オブジェクト)として捉え
属性」と「機能」に分類して表現する考え方です。


では、実際にオブジェクト指向の例を使って記載して行きます。


自動販売機のシステムオブジェクト指向を考えてみます。

まず、性質を整理します。
下記の絵のように洗い出してみます。

f:id:kassans:20140307194002p:plain


次に、「属性」「機能」に分けてみます。

属性とは
オブジェクトが持っている値を指します。
機能とは
オブジェクトの値を操作する事を指します。

f:id:kassans:20140307185043p:plain


このように整理を行うと
以下の特徴がある事が見えてきます。

・オブジェクト生成時に以下の項目の値を決める必要がある。
 商品名、商品の価格

・オブジェクト生成後に以下の項目の値が決まる。
 投入金額

・属性・操作ともに洗い出しの時点では抽象的な言葉で表現してある
 例:どんな商品名なのか不明
   どんな商品を出すのか不明

など

特徴を整理し設計を行う

これらを以下のようにまとめ(設計し)てみます。


▼初期設定について(コンストラクタまたは、イニシャライズ)
・「オブジェクト生成時に以下の項目の値を決める必要がある。」
 とのことで属性の「商品名」「商品の価格」を初期設定する。

▼機能について
・機能「お金を入れる」を利用すれば、属性の「投入金額」を設定出来る。
・機能「商品を出す」を利用すれば、初期設定した属性の「商品名」が出てくる。
・機能「おつりを出す」を利用すれば、初期設定した属性の「商品の価格」と「投入金額」の差額を出す。

上記の記載内容を見ると機能によって、属性の値が変換している事が分かります。

■実際にプログラムで書くと以下のようになります。


ヘッダーファイルはこんな感じです。
■Vending.h

#import <Foundation/Foundation.h>

@interface Vending : NSObject{
    
    //商品名
    @private NSString *itemName;
    //商品の金額
    @private int itemPrice;
    //投入金額
    @public int itemPay;
    
}
//イニシャライザ
-(id)initWithVending:(NSString *)name price:(int)price;

//メソッド名:お金を入れる
-(void)setCoin:(int)coin;
//メソッド名:おつりを出す
-(int)getCoin;
//メソッド名:商品を出す
-(NSString*)getItem;

@end


モデルファイルはこんな感じです。
■Vending.m

#import "Vending.h"

@implementation Vending

/**
 * イニシャライザ(初期化)
 */
-(id)initWithVending:(NSString *)name price:(int)price{
    if((self = [super init]))
    {
      //商品名
      itemName = name;
      //商品の価格
      itemPrice = price;
    }
    return self;
}


/**
 *  メソッド名:お金を入れる
 *  用途:引数で受け取った、「投入金額」を属性「投入金額」に代入
 *
 * @param coin 投入金額
 *
 */
-(void)setCoin:(int)coin{
    itemPay = coin;
}

/**
 *  メソッド名:おつりを出す
 *  用途:「投入金額」と「商品の価格」差額を返す。
 *
 * @return おつり
 *
 */
-(int)getCoin{
  return itemPay-itemPrice;
}

/**
 *  メソッド名:商品を出す
 *  用途:「商品名」を返す。
 *
 * @return 商品名
 *
 */
-(NSString*)getItem{
    return itemName;
}


@end


メインファイルをこんな感じで書いて、実行します。
■ViewController.m

    Vending *Ven = [[Vending alloc] initWithVending:@"コーラ" price:100];
    [Ven setCoin:200];
    NSLog(@"商品名;%@",[Ven getItem]);
    NSLog(@"おつり:%d",[Ven getCoin]);

なぜ、オブジェクト指向を使うのか

使う理由として、以下のメリットがあるからです。

オブジェクト指向のメリット


▼保守性の向上
クラス化を行うことにより、設計図が確立されており
以下の2点のメリットがあります。

 ・障害発生時に的確に問題を把握し対応出来る。
 ・仕様変更時に的確に場所を特定出来、対応出来る。

▼再利用性(汎用性)
クラス名「自動販売機」属生名「商品名」など
あいまいな命名をしています。

なので、オブジェクト生成時に以下のように、販売機を変えることが
可能となります。

f:id:kassans:20140307185042p:plain


上記のメリットがあり、汎用性も高く使い回せるようになるため
オブジェクト指向を使うメリットがあります。