比較プログラム言語論

比較プログラム言語論
平成17年7月13日
森田 彦
レポート(7/6)総括
< テーマ >
以下の設問に答えて下さい。
1. クラスとインスタンスの実例を挙げて下さい。
2. プログラムの再利用性を高める差分プログラムを可能にす
るのは、オブジェクト指向のどのような機能ですか?
→ クラスの継承機能
<感想・その他>
詳細はHP参照
 クラスの継承に関して
 カプセル化がもたらす危うさについて
 前回のレポートへのコメント
クラスとインスタンスの実例 ①
1.
★クラス→テレビ
※プロパティ:高さ・幅・奥行き・画面サイズ・画面材質 etc.
※メソッド :電源ON/OFF・チャンネル変更 etc.
★インスタンス→20インチ液晶テレビ
2. クラスがサッカーチーム、インスタンスがFCバルセロ
ナ、ACミランなど
3. クラスを(惑)星とすると、インスタンスは地球や火星と
いったものに当てはめられる。
4. 東芝製のパソコンというクラスの中のDynaBookSSと
いうインスタンス。
クラスとインスタンスの実例 ②
-スーパ
クラスとサブクラスの関係とした方がより適切な例-
1. クラス:動物
インスタンス:犬、鳥、人間、猫
→ 犬、鳥などは、動物クラスを継承してできるサブクラス
と捉えた方が良い。
2. クラス=乗り物
インスタンス=自動車、飛行機、新幹線
(乗り物ごとの速度や乗客数などの実例)
→ 乗り物クラスを継承してできるサブクラスと捉えた方が
良い。そして例えば自動車クラスのインスタンスはトヨタカ
ローラなど。
クラスとインスタンスの例② その2

クラスには人や車などがある。人(クラス)には日
本人とアメリカ人やイタリア人というインスタンス
がある。
→良く考えた例だが、人クラスを継承してできる
サブクラスに日本人、アメリカ人クラスがあると
捉えた方がより適切。そして日本人クラスのイン
スタンスとして太郎、アメリカ人のインスタンスと
してJohn等がいる、と考えれば良い。
クラスとインスタンスの実例 ③ 誤解等
1. 大学の学部と学科の関係が当てはまる。例を挙げ
るとすれば、札幌学院大学の人文学部の中に人
間科学科、英語英米文学科、臨床心理学科とそ
れぞれが存在する。その関係がクラスとインスタン
スの関係に当てはまるのではないだろうか。
→ クラスとインスタンスの関係ではない。学科は学
部クラスの構成要素と捉えられる。学部クラスのインス
タンスは、社会情報学部や人文学部など。
2. クラス)車
インスタンス)タイヤ、エンジン、オイル
→ 上と同じくクラスとインスタンスの関係ではない。タイヤ
等は車の構成要素。
クラスとインスタンス -プログラミング
の場合


クラス→ 型に対応
インスタンス(オブジェクト)→ 変数に対応
<通常の変数の場合>
int a,b ;
double x,y;
<オブジェクト(インスタンス)の場合>
JButton jButton1 = new JButton();
JButtonクラス
JButtonクラスのインスタンス
感想① クラスの継承に関して(その1)

今回の講義を受けて、オープンソースのこれか
らの重要性というのがさらに高まったと思います。
多くの人が自分の使いやすいようにカスタマイズ
し、さらに別の人がより使いやすくとまさに典型
的な再利用であると感じました。一種のクラスの
継承みたいなものであるとも思いました。
オープンソース運動は、オブジェクト指向のメリット
を生かせる格好の場!
関連する意見交換
6/29の質問「ソフトウエアの需要が生産を超えていると言うこと
は、もしかしたら色々な人が新しいソフトウエアを開発していく
時代になるのではないでしょうか?」について


確かに現状ならそういう時代になる可能性もあります。しかし
ある程度の知識がないとソフトウェアの開発は出来ませんか
ら、学校教育でプログラムの勉強をしない限りは実現は厳し
いと思います。
そんな時代がくる可能性ってのはあると思う。 各個人の物作
り意欲にも依存してくるとは思うのだが、・・・(略)「誰も作って
ないみたいだから作ってしまおう」となればソフトウェア開発
者は増えていくだろう。色んな人というのは、主に我々の世
代とそれ以降の人たちだと思う。 皆がいろんな事に疑問をも
てるようになったら、いい時代が来るかもしれないなぁ。
感想② クラスの継承に関して(その2)

差分プログラムの利便性の良さに感心しました。
ひとつ上のクラスと同じ式を書くのではなく、代
わりに「super.」を使うことで見やすく、また簡単
にできるようなっている。こういう差分プログラミ
ングをうまく利用できれば、洗礼されたプログラミ
ングを書くことが出来ると思います。ただ、差分
プログラミングのデメリットはあるのですか?多
用した場合、何か不都合なことが起こります
か?
補足 オブジェクト指向の難しさ






’90年代初頭の技術者は皆頭を悩ませた。
オブジェクト指向の機能は便利。しかし、その活用方法
のノウハウは当初は手探りだった・・・。
プログラマによってクラスの設計や継承の仕方(考え
方)が異なるので、共有しにくい。
行き当たりばったりの継承が流行→スパゲッティ継承!?
現在は開発手法が整備されてきた。→クラスの設計や
継承に関するルールが共有されるようになった。
きちんと教育を受ければ一定のレベルに到達するように
なった。
感想③ カプセル化がもたらすあやうさ
について

今回の授業をきいていて素直に思ったことは、
世の中のあらゆるものが、複雑になってしまって
いて、ものの内面が、「カプセル化」されて、わか
らなくなっているということです。機械の中身にし
ても、どうなっているかは、わからないけど、使用、
利用することはできます。そう考えると、開発者
と、利用者の差(距離)が離れているんだなぁ、と
感じました。
補足 ソフトウェア開発におけるユーザ
の要求と開発者の技術力の連鎖
要求
ユーザ
開発者
技術力
 この連鎖を止めることは
困難
 この連鎖が技術革新を
生んできた。
現代は、需要と技術のあやういバランスの上に成り立って
いる。
ソフトウェアシステムの開発技術レベルを把握しておかなけ
ればトラブルが生ずる。
例:みずほ銀行のシステム障害
技術者の力不足?
管理者の無理解(過酷な要求)?
補足 カプセル化のメリット+危うさ







クラス定義の詳細を知ることなく、それを利用できる→
効率は上がる。→カプセル化のメリット
利用に必要な情報は、公開されているメソッドの使い方
のみ。
原則としてこれでOK しかし一般には・・・
予期せぬ結果が得られたり、意味不明なエラー(動作不
良)が生じた場合は、クラス定義のソースを調べる必要
がある。
一般の開発者では解読困難→発展を阻害する可能性
がある。
しかし・・・、開発現場では、オブジェクトの動作について
は、担当の開発者が責任を持つ、という役割分担がしっ
かりしている。→それにより開発効率が向上
カプセル化→役割分担の徹底 とも言える。
感想②再 オブジェクト指向に欠点はな
いの?

差分プログラムの利便性の良さに感心しました。ひとつ上
のクラスと同じ式を書くのではなく、代わりに「super.」を使
うことで見やすく、また簡単にできるようなっている。こうい
う差分プログラミングをうまく利用できれば、洗礼されたプ
ログラミングを書くことが出来ると思います。ただ、差分プ
ログラミングのデメリットはあるのですか?多用した場合、
何か不都合なことが起こりますか?
万能の方法などない。一般に、長所は短所にもなり得る。
例1) 継承→スパゲッティ継承に陥りやすい
例2) カプセル化→中身を知らないため適用範囲外の用途
に用いる危険性がある。
<本日のテーマ>
オブジェクト指向の実装(Java言語の場合)
オブジェクト指向の機能が、Java言語でどのように実装(実
現)されているのかを理解(確認)する。
<内容>
1.
2.
3.
4.
フレームクラスの定義
人間クラスの定義
インスタンス(オブジェクト)の生成・利用
Java言語のメリット・デメリット
1.フレームクラスの定義(復習)
<空っぽのフレームの場合>
<Frame1クラスの定義>
プロパティの定義
・・・
コンストラクタの定義
}
}
・・・
メソッドの定義
フレームの生成
<Application1.javaファイル>
フレームを生成する役割
frameの生成
Frame1クラスのイ
ンスタンス
インスタンスの生成(Java言語)
コンストラクタ
クラス名
Frame1 frame = new Frame1();
インスタンス名
クラスがあれば、インスタンス(オブジェクト)の生成
は容易!
JBuilderによるJavaアプリケーションの構成
(補足)
パッケージ(samplejava)
<クラス>
Frame1.java フレームクラスの定義
<クラス>
Application1.java フレームを生成
役割分担の明確化!
クラスとインスタンスの例(レポートより)

クラスには人や車などがある。人(クラス)には日
本人とアメリカ人やイタリア人というインスタンス
がある。
→良く考えた例だが、人クラスを継承してできる
サブクラスに日本人、アメリカ人クラスがあると
捉えた方がより適切。そして日本人クラスのイン
スタンスとして太郎、アメリカ人のインスタンスと
してJohn等がいる、と考えれば良い。
この人間クラスを例として用いる。
2.人間クラスの定義
サンプルプログラム
人間
動け:左右に動く
話せ:あいさつ
日本人
話せ:こんにちは
アメリカ人
話せ:Hello
イタリア人
話せ:Buon Giorno
① プログラム起動時
② 日本人を選択し[登場]ボタン
をクリック
⑤ [退場]ボタンをクリック
③ [→]ボタンをクリックし、右へ移動
④ [話す]ボタンをクリック
プログラムの構成
パッケージ humanmain
クラスApplication1: フレームの生成
クラスFrame1: フレームの定義
クラスhuman: 人間クラスの定義
人間クラスの定義
ボタンクラス(JButton)
をスーパークラスに
Moveメソッドの定義
Speakメソッドの定義
サブクラスを指す
人間クラスの定義(詳細)
class Human extends JButton {
public void Move(int Dist) {
Rectangle Rect;
Rect=this.getBounds(); 現在位置を取得
Rect.x=Rect.x+Dist;
水平位置をずらす
this.setBounds(Rect); ずらした位置に表示(移動)
}
thisはHumanクラスを
public void Speak() {
指す。
this.setText("あいさつ");
}
}
日本人クラスの定義(継承)
Humanクラス定義部の下に以下を追加
Humanクラスを継承
class Japanese extends Human {
public void Speak() {
this.setText("こんにちは");
}
}
メソッドの上書き
Americanクラス、Italianクラスの定義も同様
3.インスタンスの生成・利用
① インスタンス(オブジェクト)名の宣言(Frame1クラス内)
public class Frame1 extends JFrame {
private Japanese Taro;
private American John;
private Italian Mario;
・・・
② コンストラクタによるインスタンス生成
Taro= new Japanese();
アメリカ人およびイタリア人オブジェクトの生成も同様
「登場」ボタン
void jButtonCreate_actionPerformed(ActionEvent e) {
if(jRadioButtonJapan.isSelected()) {
日本人インスタンスを生成
Taro=new Japanese();
contentPane.add(Taro);
Taro.setBounds(new
x , y , w , h
大きさを設定 Rectangle(110,10,110,30));
Taro.setBackground(Color.white); 白色に設定
Taro.setText("日本人"); 日本人と表示
}
else if(jRadioButtonAmerica.isSelected()) {
・・・
アメリカ人インスタンスの処理
}
else if(jRadioButtonItaly.isSelected()) {
・・・
イタリア人インスタンスの処理
}
}
移動「→」ボタン
void jButtonMoveRight_actionPerformed(ActionEvent e) {
if(jRadioButtonJapan.isSelected()) {
Taro.Move(5);
5歩右へ移動
}
else if(jRadioButtonAmerica.isSelected()) {
John.Move(5);
}
else if(jRadioButtonItaly.isSelected()) {
Mario.Move(5);
}
}
「話す」ボタン
void jButtonSpeak_actionPerformed(ActionEvent e) {
if(jRadioButtonJapan.isSelected()) {
Taro.Speak();
}
else if(jRadioButtonAmerica.isSelected()) {
John.Speak();
}
else if(jRadioButtonItaly.isSelected()) {
Mario.Speak();
}
}
多態性の実現
「退場」ボタン
void jButtonDelete_actionPerformed(ActionEvent e) {
if(jRadioButtonJapan.isSelected()) {
Taro.setVisible(false);
}
else if(jRadioButtonAmerica.isSelected()) {
John.setVisible(false);
}
else if(jRadioButtonItaly.isSelected()) {
Mario.setVisible(false);
}
}
サンプルプログラム
4.Java言語のメリット・デメリット
(オブジェクト指向の観点から)
メリット
デメリット
オブジェクト指向プログラミ オブジェクト指向の独特の記
ングの記述が容易にできる。 述が初心者には理解困難。
豊富なクラスライブラリが存 クラスライブラリの全体像を把
在する。→色々な用途のア 握する事が困難。
プリケーション開発が可能に。
第13回目レポート

<テーマ>
講義中に指示します。
Java言語におけるクラスの定義
class クラス名 {
プロパティ(フィールド)の定義
コンストラクタの定義(初期化処理)
メソッドの定義
}
クラスの継承
サブクラス
スーパークラス
public class Frame1 extends JFrame {
プロパティの定義
コンストラクタの定義
メソッドの定義
}
全クラスから参照可能
コンポーネントはオブジェクト
参考:言語の制約の度合い
print “Hello!”
BASIC
行が基本
main( ) {
C
printf(“Hello!\n");
関数が基本
}
制約大
public class Hello {
public static void main(String args[ ]) {
Java
クラスが基本
System.out.println(“Hello!”);
}
}
 どの言語が良いかは用途によって決まる。
 オールマイティな言語はない。