目次へ戻る 下へ↓
12、初歩のオブジェクト指向とアドレス帖アプリケーション1
作成者:Fumitaka Makino 更新日:2003-04-10 18:05

オブジェクトの作り方

今回から基礎ではなく、より応用的なプログラミングを行っていきます。いままで皆さんが行っていたプログラミングの大半は、関数を作るプログラミングだったと思います。これからは関数のような機能だけではなく状態を持つプログラミングを行ってみましょう。

講義の当初から頻繁にオブジェクト指向の話をしていましたね。ではオブジェクト指向プログラミングにおけるオブジェクトとはいったいなんでしょう?もちろんただの変数ではありません。これにはいろいろな解釈が存在すると思われますが、私は以下の表現をもってオブジェクトと認識しています。

1つの集合(型)として表され、内部に複数の状態(フィールド)や機能(メソッド)を持つもの

この表現をあまり難しく考えないでくださいね。我々の身近にたくさん存在しています。例えばコンビニエンスストアなどもオブジェクトとして表現することが可能です。下図を見て下さい。

例:コンビニオブジェクト

私たちが日常利用している「コンビニ」オブジェクトは「商品を売る」「荷物を送る」などの機能をもち、なおかつ内部に「店員」「レジスター」「商品棚」「銀行ATM」などの別なオブジェクトを保持しています。当然ながら「店員」オブジェクトは内部に「脳」「手」「足」「内臓」「口」オブジェクトを保持し「接客する」や「掃除する」という機能を持っています。その他の「レジスター」や「商品棚」、「銀行ATM」も同じように考えることができます。どうですか?オブジェクトという概念がなんとなく理解できたでしょうか?普段からこのような形で日常生活の事象をモデル化して扱ってみる訓練をしておくと非常に良い訓練になります。

それでは抽象的な話ではなく実際にJavaにおいてはどのようにこの概念を適用するかというと、話は単純です。ここで表されているオブジェクト自体はクラス、オブジェクト内部に保持されている他オブジェクトはフィールド、機能をメソッドとして扱えば良いのです。例えば「コンビニ」クラスであれば下記のようなコードとなるでしょう。(*これはサンプルです。コンパイルできません。)

例:「コンビニ」クラスのサンプル

     
  /**
  コンビニを表現するクラス
*/

public class ConvenienceStore {
  
  /**
    店員配列
  */

  private Assistant[] asist = null;
  
  /**
    レジスター
  */

  private Register regi = null;
  
  /**
    銀行ATM
  */

  private BankAtm atm = null;
  
  /**
    商品棚配列
  */

  private Shelf[] Shelf = null;
  
  
  /**
    コンビニクラスのデフォルトコンストラクタ、店員やレジ、ATMの登録を行う
  */

  public ConvenienceStore(){
    
    //店員配列のセット:店員のコンストラクタは名前と時給
    asist = { new Assistant("牧野",850) , new Assistant("安西",800) };
    
    //レジスターのセット:コンストラクタの引数はレジのお金と操作できる店員配列
    regi = new Register( 300000 , asist );
    
    //ATMのセット:Bankクラスのスタティックメソッドを利用してATMを取得
    atm = Bank.getAtm("ATM00325");
    
    //棚をセット
    shelf = { new Shelf("食品") , new Shelf("化粧品") ,new Shelf("飲料") };
    
  }
  
  
  /**
    商品を売るメソッド
  */

  public int sell( Goods[] goods , int money ) {
    
    //なんかロジックを記入
    
  }
  
  
  /**
    荷物を送るメソッド
  */

  public void send( Goods[] goods ){
    
    //なんかロジックを記入
    
  }
  
}
 
     

いかがですか?これは少し難しいかもしれませんね。しかし実際にはこのようなイメージでクラスを作ることができるということを忘れないようにしてください。

 

・アドレス帖アプリケーションの初期設計

なんとなくオブジェクトと言うものが理解できたところで、実際にオブジェクト的な考え方を利用してアドレス帖アプリケーションの初期設計を行ってみましょう。最初ですから何からやってよいのかわからないかもしれません。そのようなときには、目的とするものに必要な機能や区分けを単純化してみましょう。当然ですが、目的は「アドレス帖アプリケーション」を作ることです。ではこのアドレス帖にはどのような機能や区分けが必要かというと大体ですが以下のようになります。

  • アドレス情報 → 氏名や住所、電話番号
  • アドレス帖 → 上のアドレス情報を管理するもの

これらを先ほどのように簡単な図にしてみましょう。下を見て下さい。

例:アドレス帖の簡易モデル

このように対象となる問題(「ドメイン」、「ホットスポット」と表現します)を複雑なまま扱わず、区分けを行い、より単純で小さな問題へと切り分けるためには「絵を書く」という動作が非常に有効です。ノートなどに落書きのようなもので構わないので繰り返しドメインを分析してみてください、プログラムを完成するまでの工程が大きく短縮できます。もちろん最初のうちはドメインを単純化できず複雑なモデルを作り上げてしまうかもしれません。そのようなときには、頭を休めた後にもう一度見直してみてください。間違っても複雑なモデルのままで強引に設計をはじめてはいけません。なぜなら後々のメンテナンスや仕様変更に対しての対応力が低くなるからです。

まず「アドレス帖」があります。そして「アドレス帖」は内部に「アドレス情報」を複数保持しています。さらに「名前で検索」や「一覧表示」、「番号で取得」などの機能があります。さらに「アドレス情報」は文字列として「氏名」や「住所」、「電話番号」などの複数の情報をカプセル化した状態で保持しています。これらを実際にJavaのクラスとして実装すると「アドレス帖クラス」と「アドレス情報クラス」の2つになります。いきなり「アドレス帖クラス」から作るのは大変なので、今回は「アドレス情報クラス」をつくり、アドレス情報を配列として扱い一覧として出力したり、配列番号を用いて1つだけ取り出したりするmainメソッドを作ってみましょう。今回からは難易度の高いものを除いて、各コードに対する文法の説明などは記述しません。サンプルコード中のコメントを参照しながら自分で考えてみましょう。

アドレス情報クラスのソースJavaDoc

 

 
↑上へ 目次へ戻る