比較プログラム言語論 平成16年7月14日 森田 彦 レポート(7/7)総括 < テーマ > 本日の講義で、あなたが最も興味を持った点はどのような点で すか?講義の全体的な感想と共に、できる限り具体的に、200 字~400字程度で記述して下さい。 <論点のピックアップ> オブジェクト指向的考え ソフトウェアの著作権 オブジェクト指向の難しさ クラスの中身を知る必要は(本当に)ないのか? オブジェクト指向に欠点はないのか? 天気はオブジェクト? オブジェクト指向的考え 一番興味を持ったのは、オブジェクト指向的考え方です。 この考え方でいくと、もしかしたら身の回りのものはすべ てオブジェクトとメソッドを用いて考えることができるのか なと思いました。車オブジェクトがあるのなら、「人間オブ ジェクト」も可能なのでしょうか・・・?ゼミでコンパを企画 することを、オブジェクト指向で表現できるなんて思いま せんでした。 今日の講義で印象に残ったのは、オブジェクト指向の考 え方です。(中略)既存の処理プログラムをまた1から作 るのではなく、簡単に複製、または拡張することができ るようになったことはプログラマーにとって、とても革新 的だと思いました。 ソフトウェアの著作権 今回の講義でソフトウェア危機という、無限の需要からくる開 発問題を、オブジェクト指向ならば、避けられることがよくわ かった。しかし、ソフトウェア(ソースプログラム)には、侵害さ れない権利が発生する。 だから、需要を受けてAを作ったか らといって、他の誰かが簡単にAを改良したものや、Aをベー スにしたA+が作られるわけではない。(中略)権利の関係上 侵害はできないが、権利が切れたものは順次使用できる。こ のことからもう少し先になれば、オブジェクト指向の真価を発 揮できるのではないか。 (画像形式GIFの権利はきれました よね?) 独自に開発されたクラスももし企業秘密として扱われて、そ の企業内でしか使われないのであれば、言われるほど効果 を挙げないのではないでしょうか? オブジェクト指向はソー スがオープンになってこそ真価を発揮するような気がします。 オープンソース運動につながる。 オブジェクト指向の難しさ クラスについて理解はしているつもりなんですが、どうも実際使いこな せていない。ゼミの課題等で使っているのですが、細かいところが分 からなくなってしまうんです。クラスに何のメソッドを残して、アプリケー ションのほうで何のプロパティを入れればいいのか。returnでどう返せ ばいいのか。色々わかりません。まさに「使うは天国、作るは地獄」だ と実感しています 今日の授業で最も興味を持ったのは、スーパ疑似変数と差分プログ ラムです。これがうまく使えるようになれたら、もっと効率的なプログラ ムが書けると思いました。今日習ったところは、他の授業でも習ったこ とが多かったので、よくわかったと思います。しかし、クラスの継承の 理論はわかるのですが、実際にやると難しいように思いました。 こんなに難しくてオブジェクト指向は本当に現場で取り入れられてい るものなのでしょうか? オブジェクト指向で開発効率を上げようとす ると、長い時間をかけて勉強しなければなりません。 補足 オブジェクト指向の難しさ ’90年代初頭の技術者は皆頭を悩ませた。 オブジェクト指向の機能は便利。しかし、その活用方法 のノウハウは当初は手探りだった・・・。 プログラマによってクラスの設計や継承の仕方(考え 方)が異なるので、共有しにくい。 行き当たりばったりの継承が流行→スパゲッティ継承!? 現在は開発手法が整備されてきた。→クラスの設計や 継承に関するルールが共有されるようになった。 きちんと教育を受ければ一定のレベルに到達するように なった。 カプセル化:クラスの中身を知る必要はないの? プロパティとメソッドがカプセル化されたものを用いれば手続 き指向のプログラミングよりも効率が上がるのでは?と言っ ていましたが、確かにカプセル化することで、やることが明確 にはなりますが、オブジェクトの内部を知らなくても理解する ことが本当に可能なのかという疑問が出てきました。大体の ことは知らなくても理解できるかも知れないが、やはり中身を 知る必要があるときもあるのではと思いました。 プロパティとメソッドがカプセル化されたオブジェクトというの は初めて知りました。そのオブジェクトの使い方以外は、情 報を見せない→情報の隠蔽が行われ、利用者は、オブジェ クトの内部の詳細をしることなく、オブジェクトに備わった機能 を利用できるというので、それは内部の詳細を知らないで利 用することがよいのかどうかよくわからなかったのですが、ど うなのですか? 補足 カプセル化のメリット クラス定義の詳細を知ることなく、それを利用できる→ 効率は上がる。→カプセル化のメリット 利用に必要な情報は、公開されているメソッドの使い方 のみ。 原則としてこれでOK しかし一般には・・・ 予期せぬ結果が得られたり、意味不明なエラー(動作不 良)が生じた場合は、クラス定義のソースを調べる必要 がある。 開発現場では、オブジェクトの動作については、担当の 開発者が責任を持つ、という役割分担がしっかりしてい る。→それにより開発効率が向上 カプセル化→役割分担の徹底 とも言える。 オブジェクト指向に欠点はないの? 今日はオブジェクト指向プログラミングのいいところだけを聞 いて、ソフトウェア危機の救世主と聞かされてもなるほどと 思ってしまいますが、オブジェクト指向に欠点はないのでしょ うか。 一つ疑問に思ったことがあるのですが、スライドの「クラスの 拡張性」の部分でもあるように、複雑なクラスを次々と増やし てしまったら、混乱するのではないかな?と思いました。 万能の方法などない。一般に、長所は短所にもなり得る。 例1) 継承→スパゲッティ継承に陥りやすい 例2) カプセル化→中身を知らないため適用範囲外の用途 に用いる危険性がある。 天気はオブジェクト? この前オブジェクトの話を聞く機会ありました。予報 士から見たとき“天気”はオブジェクトになると言わ れましたが実際は状態のことではないのでしょう か? データはオブジェクトになり得る。 気象情報(データ)オブジェクトの場合、 プロパティ:各地点の気圧配置データ メソッド:指定日時の気圧配置図をグラフ化表示する操作 気象情報.気圧配置図示(2004,7,14,11,20) 補足 サブルーチン(関数)とオブジェクトの違い 手続き型言語では、データはサブルーチン(関 数)の引数→関数が主役 例) データの平均を求める関数 HEIKIN(Data1,Data2,Data3) オブジェクト指向ではデータはオブジェクト→ データが主役、操作(関数)は従属 例) データオブジェクトに平均操作を指示する。 Data.Heikin() データ構造+アルゴリズム → オブジェクト <本日のテーマ> オブジェクト指向の実装(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 フレームを生成 役割分担の明確化! 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 Japanese1; private American American1; private Italian Italian1; ・・・ ② コンストラクタによるインスタンス生成 Japanese1= new Japanese(); アメリカ人およびイタリア人オブジェクトの生成も同様 「登場」ボタン void jButtonCreate_actionPerformed(ActionEvent e) { if(jRadioButtonJapan.isSelected()) { Japanese1=new Japanese(); 日本人インスタンスを生成 contentPane.add(Japanese1); Japanese1.setBounds(new x , y , w , h 大きさを設定 Rectangle(110,10,110,30)); Japanese1.setBackground(Color.white); 白色に設定 Japanese1.setText("日本人"); 日本人と表示 } else if(jRadioButtonAmerica.isSelected()) { ・・・ アメリカ人インスタンスの処理 } else if(jRadioButtonItaly.isSelected()) { ・・・ イタリア人インスタンスの処理 } } 移動「→」ボタン void jButtonMoveRight_actionPerformed(ActionEvent e) { if(jRadioButtonJapan.isSelected()) { Japanese1.Move(5); 5歩右へ移動 } else if(jRadioButtonAmerica.isSelected()) { American1.Move(5); } else if(jRadioButtonItaly.isSelected()) { Italian1.Move(5); } } 「話す」ボタン void jButtonSpeak_actionPerformed(ActionEvent e) { if(jRadioButtonJapan.isSelected()) { Japanese1.Speak(); } else if(jRadioButtonAmerica.isSelected()) { American1.Speak(); } else if(jRadioButtonItaly.isSelected()) { Italian1.Speak(); } } 多態性の実現 「退場」ボタン void jButtonDelete_actionPerformed(ActionEvent e) { if(jRadioButtonJapan.isSelected()) { Japanese1.setVisible(false); } else if(jRadioButtonAmerica.isSelected()) { American1.setVisible(false); } else if(jRadioButtonItaly.isSelected()) { Italian1.setVisible(false); } } サンプルプログラム 4.Java言語のメリット・デメリット (オブジェクト指向の観点から) メリット デメリット オブジェクト指向プログラミ オブジェクト指向の独特の記 ングの記述が容易にできる。 述が初心者には理解困難。 豊富なクラスライブラリが存 クラスライブラリの全体像を把 在する。→色々な用途のア 握する事が困難。 プリケーション開発が可能に。 第13回目レポート 本日の講義で、あなたが最も興味を持った点はどのよう な点ですか?講義の全体的な感想と共に、できる限り 具体的に、200字~400字程度で記述して下さい。 なお、上の記述を行った上で、(いつも通り)講義の感想 や質問等を付加しても結構です。 提出先:[email protected] 件名:「学籍番号(半角)+半角空白+氏名」を記入し て下さい。 例) s02xxx 学院太郎 HPに自由掲示板を開設(6/24) 各自活用して下さい。 Java言語におけるクラスの定義 class クラス名 { プロパティの定義 コンストラクタの定義(初期化処理) メソッドの定義 } クラスの継承 サブクラス スーパークラス public class Frame1 extends JFrame { プロパティの定義 コンストラクタの定義 メソッドの定義 } 全クラスから参照可能 コンポーネントはオブジェクト
© Copyright 2024 ExpyDoc