オブジェクト・プログラミング 第4回 手続き指向からオブジェクト指向へ (1) 品質の高いプログラムを書く 品質の高いプログラムって? 正しさ 使いやすさ 再利用性 可読性(読みやすさ) 効率(速さ) 品質の高いプログラムを求めて プログラム手法の変遷 機械語 高級プログラミング言語 手続き指向 (構造化プログラミング) オブジェクト指向 今日の目標 プログラムを手続き指向で書けるようになる。(前 回の続き) 手続き指向の利点を説明できるようになる。 オブジェクト指向を考える際に重要な「クラス」と いう概念について説明できるようになる。 クラスとは何か説明できるようになる。 クラスを使う利点を説明できるようになる。 Javaでクラスを使ったプログラミングが書けるようにな る。 クラス図(UML)が少し読めるようになる。 前回の課題 自動販売機の商品管理プログラムの簡易 版を作ります。(実はただの数字当てです) 商品番号を整数型(int)の配列としなさい。 授業で扱った「挿入」「検索」と「削除」を行なう プログラムを作りなさい。 「表示」メソッドを完成させなさい。 「表示」メソッドを用いて配列の中身を確認しな さい。 前回の宿題で多かった質問 コメントのつけ方が難しい。 なぜstaticをつけねばならぬか? 変数のスコープについて 仮引数と実引数がわからない。 なぜstaticをつけねばならぬ か? これは今日学習する「クラス」と深い関係 があります。 来週のプログラムにstaticは必要なくなりま す。 詳しくは来週説明します。 変数のスコープ(1) メソッド内で宣言した変数はメソッド内での み有効 public class A{ public static void main(String args[]){ int i; i = 3;//これはOK } } public static void display(int[] target){ i = 3;//コンパイルエラー } iの有効範囲 変数のスコープ(2) メソッドの仮引数の有効範囲もそのメソッド 内のみ public class A{ public static void main(String args[]){ target[0] = 3;//コンパイルエラー } } public static void display(int[] target){ target[0] = 3;//OK 仮引数targetの有効範囲 } 変数のスコープ(3) 実は、クラス内で有効な変数も作ることが できます。来週やります。(今日は使いま せん) public class A{ static int i; } public static void main(String args[]){ i = 3; } 仮引数と実引数(1) スコープで説明したように、displayメソッド はmainメソッドでのみ有効な「itemNo」を 知ることができません。 public class A{ public static void main(String args[]){ int[] itemNo = new itemNo[10]; System.out.println(itemNo[3]);//OK } } public static void display(){ System.out.println(itemNo[3]);//コンパイルエラー } 仮引数と実引数(2) displayメソッドがitemNoを知るためには、 教えてもらう必要があります。そこで仮引 数を利用するのです。 public class A{ public static void main(String args[]){ int[] itemNo = new itemNo[10]; System.out.println(itemNo[3]); } } public static void display(int[] target){ System.out.println(target[3]); //OK } 仮引数と実引数(3) mainメソッドは実引数として値itemNoを与 えます。 public class A{ public static void main(String args[]){ int[] itemNo = new itemNo[10]; display(itemNo); } } public static void display(int[] target){ System.out.println(target[3]); } 仮引数と実引数(4) 与えられた実引数itemNoが仮引数target に代入され、displayメソッドで表示に使わ れます。 public class A{ public static void main(String args[]){ int[] itemNo = new itemNo[10]; display(itemNo); 代入される } } public static void display(int[] target){ System.out.println(target[3]); } 表示に使われる 今日の課題(1) 先週書いたプログラムをさらに構造化しま す。 作業ごとにメソッドを作ります。 「挿入」を行なうinsert()メソッドを作ります。 「検索」を行なうsearch()メソッドを作ります。 「削除」を行なうdelete()メソッドを作ります。 プログラムの内容(10項目挿入して、66を 検索して、55を削除して、)は変えません。 今日の課題(1)全体の構成 public class VendingMachineMain{ public static void main(String args[]){ } public static void insert(int[] target){ } public static void find(int[] target){ } public static void delete(int[] target){ } } public static void display(int[] target){ } まず、「挿入」メソッドを作る /** * 取扱商品を挿入するメソッド(クラスの本体から抜粋) */ public static void insert(int[] target){ int registerKey = 77;//登録すべき商品番号 //空いている配列を探して挿入する for(int i=0;i<10;i++){ if(target[i] == 0 ){ target[i] = registerKey; break; } } } これは不便ですね! 登録すべき商品番号ごとに メソッドが必要になってしまいます! 汎用的な「挿入」メソッド /** * 取扱商品を挿入するメソッド */ public static void insert(int[] target,int registerKey){ //空いている配列を探して挿入する for(int i=0;i<10;i++){ if(target[i] == 0 ){ target[i] = registerKey; break; } } } 登録番号を 引数にとるようにします。 こうして、どんな登録番号でも 登録できるようになります。 「挿入」メソッドを呼び出す。 ※mainメソッドの一部を抜粋してます。 前回のプログラム 今日のプログラム int[] itemNo = new int[10]; int[] itemNo = new int[10]; //取扱商品を10種類登録する itemNo[0] = 77; itemNo[1] = 99; itemNo[2] = 44; itemNo[3] = 55; itemNo[4] = 22; … //取扱商品を10種類登録する insert(itemNo,77); insert(itemNo,99); insert(itemNo,44); insert(itemNo,55); insert(itemNo,22); … 課題の残りをやってみましょう。 「検索」、「削除」メソッドも同じようにして作 ることができます。 仕事をメソッドごとに分け、そして汎用的な メソッドを作るのが、「構造化プログラミン グ」の基本です。 できたけど、、、 商品番号だけで、商品っぽくない。 商品名を扱いたいよね。 手続き指向からオブジェクト指向 へ(1) 今日覚えてもらう言葉 クラス オブジェクト(インスタンス) インスタンス化(オブジェクト化) 属性 クラスとは?(1) オブジェクトを製造する型。 インスタンス化 クラス (タイヤキの型) オブジェクト (実際のタイヤキ) =インスタンスともいう クラスとは?(2) クラスは、「属性」と「操作」を持ちます。 「属性」は変数のこと 「操作」はメソッドのこと 今日は「属性」だけ取り扱います。 <テレビ> チャンネル: 電源: 電源を入れる() 電源を切る() 属性 メソッド 今日つくるクラス <取扱商品情報> 商品番号: 商品名: クラス (取扱商品情報の型) 商品番号:01 商品名:コーラ 商品番号:02 商品名:ソーダ オブジェクト (実際の取扱商品情報) Javaでクラスを取り扱う ① クラスを定義する。 ② クラスをインスタンス化してオブジェクト を作る。 ③ オブジェクトへアクセスする。 クラスを定義する-1 /** *取扱商品情報を表すクラス */ public class ItemInfo{ ③ }① ② <取扱商品情報> ①そのクラスの「可視性」(あとで説明します)を定義します。 ②「クラス」を定義しますよと言う意味です。省略できません。 ③クラスの名前です。省略できません。任意の名前を付ける ことができますが、慣習として、頭文字は大文字にします。 (課題でできていない人は大幅減点します。) クラスを定義するー2 • 属性を定義します。 public class ItemInfo{ int no;//商品番号 String name;//商品名 } <取扱商品情報> 商品番号: 商品名: 商品番号を整数型(int)で 商品名を文字列型(String)で定義します。 クラスごとに別ファイルに ファイル名(.javaを除く)とクラス名を同じにします。 public class VendingMachineMain{ } … … VendingMachineMain.java public class ItemInfo{ } … … ItemInfo.java クラスをインスタンス化する ItemInfo iteminfo1 = new ItemInfo(); <ItemInfo> no: name: new iteminfo1 no: name: オブジェクトへアクセスする。 iteminfo1.no = 1; iteminfo1.name = “コーラ”; iteminfo1 no:1 name:コーラ オブジェクト名.属性名 でアクセスします。 ItemInfoのインスタンス化とアクセスは今回、 VendingMachineMainクラスのmainメソッドが行ないます。 public class VendingMachineMain{ public static void main(String args[]){ ItemInfo iteminfo1 = new ItemInfo(); iteminfo1.no = 10; iteminfo1.name = “コーラ”; System.out.println(“[“+iteminfo1.no+”,” +iteminfo1.name+”]”); } } VendingMachineMain.java 今日の課題(2) ItemInfoクラスとVendingMachineMainク ラスを作り、前ページのプログラムを動か して見ましょう。 久々にUML(クラス図入門) テレビ チャンネル 電源 電源を入れる() 電源を切る() チャンネルを変える() クラス名 属性 操作 クラス図入門(型を指定) 型を書く テレビ チャンネル : int 電源 : boolean 電源を入れる() 電源を切る() チャンネルを変える(i : int) 引数を書く 今日の課題(2)のクラス図 クラス図入門(関係) クラスとクラスに関係がある場合、 線で結ぶ クラス図入門(多重度) 今日の段階では、VendingMachineMainオブジェクトは 一つのItemInfoオブジェクトを持つので1対1の関係 になる。これを「多重度」と呼ぶ。 クラス図入門(多重度)(2) だけど、取扱商品情報は複数もたないと管理できません。 来週は、ItemInfoクラスの配列を使って、たくさん処理します。 その場合の多重度は0..n(0からnまでという意味)になります。 次週予告 この設計図をJavaで実装してもらいます。 課題の確認 課題① 前回のプログラムを構造化し、すべてのメソッ ドを完成させる。 課題② ItemInfoクラスとVendingMachineMainクラス を作り、前ページのプログラムを動かして見ま しょう。 提出方法 [email protected]宛て。 今回はファイルが3つになるので、添付す る人は必ず一つのファイルにまとめてから 送ってください。 (圧縮不可) Subjectはログイン名を必ず書いてください。 ex)Subject:t96844ym 余計な[]などをつけないでください。 水曜まで。 提出フォーマット ○○学部○年の○○××です。 感想: つかれた。 ソース(添付する人もこの形式で) -----MyClass.java(課題1)----… -----VendingMachineMain.java(課題2)----… -----ItemInfo.java(課題3)----…
© Copyright 2024 ExpyDoc