比較プログラム言語論 平成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!”); } } どの言語が良いかは用途によって決まる。 オールマイティな言語はない。
© Copyright 2024 ExpyDoc