オブジェクト・プログラミング

オブジェクト・プログラミング
第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)----…