比較プログラム言語論
平成17年7月20日
森田 彦
レポート(7/13)総括
< テーマ >
以下の設問に答えて下さい。
1. カプセル化のメリットとデメリットについて、(あなた
が考える)具体的な(身近な)実例を挙げて下さい。
2. (講義で採りあげた)Java言語による人間クラスの
実装についての感想や質問を記述して下さい。
回答の詳細はHPを参照。
カプセル化のメリット・デメリット① -パ
ソコンの例

カプセル化のメリットデメリットを日常生活で例えるなら、
パソコンがいい例であると思う。パソコンを使用している
多くの人は、どのような構造で作られているかを知らな
いはずである。しかし普通に使用するぶんには、そんな
ことはまったく知らなくてもいい。しかしいざ壊れてしまっ
たときや、ウィルスに感染したときにどうしたらいいのか
解らなくなくなってしまう。実は大したことのないアクシデ
ントであっても、知らないがゆえに深刻に捕らえてしまう。
この点でのメリットは、使用する側が、まったくパソコン
の構造を理解していなくても便利に使用できることであ
る。反対にデメリットは、不測の事態が起こったときに、
実際簡単に直せるものでも本人一人では、どうすること
もできないという点である。
これは、全ての機器に当てはまる。
カプセル化のメリット・デメリット② -ソフ
トウェア関係の例


自分はカプセル化の実例についてはパソコンのWordもそう
だと思う。パソコンのキーを打つことによって画面には文字を
出している。何も知らなくても文字を打つことができるというこ
とがメリットだと思う。しかし、エラーが出たりパソコンがフリー
ズしてしまったりしたときにはどうすることもできないというこ
とがデメリットなのではないでしょうか。
今回の講義中に起きた脆弱性の検出のことがまさにそうだと
思います。 普段パソコンを使うにあたって、・・・(略)パソコン
の知識を熟知していなくても行えることだと思います(メリッ
ト)。しかし、今回のようにいったん脆弱性が検出されたり、ウ
イルスに感染したりすると、自分ではどうしようもなくなってし
まいます。・・・(略)やはり、ある程度パソコンに対しての知識
というか、使い方や対策を知っておかなければいけないと思
いました。
使いこなすためには、中身を知る必要がある。
カプセル化のメリット・デメリット③ -組
織の例 その1


カプセル化によっての具体的メリットを具体的にあげる
と、「学級」(には)、給食係、美化委員、 風紀委員、掃
除係などがあるが、クラスを運営する上で担当者が決
まっていることによって、作業の効率が上がる。また、責
任というものが生じる。デメリット(として)は、全体が把
握できないことや、問題を共有することが出来ない。
学校や会社などでの仕事分担を行うことにより、効率が
より良くなる。しかし問題が発生したときなど、分担した
数だけの報告を受けまとめなくてはいけず、また問題点
はどこにあるのか探さなければならない手間がかかる。
官僚組織の利点と弊害の指摘!?
カプセル化のメリット・デメリット③ -組
織の例 その2


会社などで事業を行う場合の部署を例にあげてみる。
開発部や営業部などが存在しているが、メリットとしては
その仕事には担当部署があるため、仕事効率は上がる
ということ。デメリットとしては、仕事をする上でお互いの
仕事がわからないため、仕事の話になるとコミュニケー
ションがとりにくいという点と、その仕事に秀でた人材が
要求される。
仕事をする上で品出し・レジ・清掃等役割を分担するこ
とで仕事効率があがる(メリット)。しかし、その役割を果
たすためには各仕事のプロフェッショナルが必要となる
(デメリット)。
組織の構築には時間がかる→いったんできると作
業の効率は上がる。
人間クラスの実装について① -全般的
感想


JAVAと言うか、サブクラスやスーパークラスなどを使ったオ
ブジェクトの仕組みや流れがアメリカ人クラスや人間クラスを
使うことにより、よりいっそうイメージしやすくなった。
昨年プログラミングのとき、Javaについてはあまり経験が無
かったので詳しくどうこうと言うのはわからなかった。ソースを
見れば大体のことがわかるが、クラスとかインスタンスとかよ
く分からないでやっていた。ようは、デメリットにどっぷりは
まっていたわけだが、今日の説明を見てやっと分かった部分
がいくつかあった。こうやって考えると、クラスの便利さや継
承があるといかに使いやすくなるのかよく分かった。 クラス
の実装など、実際にやって覚えるのも大切だと思うが、今回
の講義のように一度実際にやったことをもう一度言葉で教
わったほうが、理解がより深まると思った。
プログラミングの実体験→概念の解説 有効!?
人間クラスの実装について② -クラス
継承のメリットについて


今日の講義の人間クラスの定義で、日本人、アメリカ人、
イタリア人を使ったプログラムの例がわかりやすかった
です。人としての基本動作はそのまま継承でき、違う部
分つまり言語の部分だけを変えることができるということ
を理解できました。
人間クラスの定義については、登場から始まり、移動し
たり話したり、最後は退場したりという流れが面白いと思
いました。どこの国の人を選ぶかによって話す言葉が異
なったり、移動する方向も右か左を選べたりして、選択
肢(インスタンス)によって結果が異なるということも面白
いと思いました。
差分プログラムと多態性の実現の指摘
人間クラスの実装について③ -クラス
定義の複雑化の懸念の指摘


言葉とか場所(の移動)とかの実装なら可能ではあるが、
その人間個人の人格まで取り組むとそれは膨大な量に
なるので難しい問題ではないでしょうか。
人間の人種、性別、そして細かく言えば人間の行動まで
をもクラス、オブジェクトで作ることで、より細かい対応が
出来るようになる。これが実装できるようになれば、それ
はとても便利なものになるかもしれない。だが、行動ま
でをも網羅するには、かなりの労力と時間が掛かるだろ
うと思った。
複雑なクラスを定義するには?
部品(部分)に当たるクラスを定義→それらを組み合わせて
全体のクラスを定義
人間クラスの実装について④ -ゲーム
への応用を連想


これが分かることにより、ゲームを作れたり、ソフトを
作れると実感した。
ゲームを作ったりするのが趣味なので、このプログ
ラムをうち込むことで、ロールプレイングゲームが作
れたりするんだなぁと素直に思った。意外なところで、
ゲームの中身を知れた気がする。
登場するキャラクターをクラスとして定義 → オブジェクトの
生成と継承(による拡張)は容易に実現!
オブジェクト指向プログラミング はゲーム開発に
最適!
(参考)あるベテランSEへのインタビュー
から
「ソフトウェア危機」を講義した際、ソフトウェア開発現場の実
状を危惧するレポートが幾つかありました。
そこで・・・
ある大手企業のSEの方に以下の点を聞いてみました。



1.SEの研修体制は?
2.SEという職業の魅力は?
3.SEになりたい人へのメッセージ
1.ある企業のSE研修体制




4~7月 研修期間
基礎トレーニング (接客の仕方、電話での応対の仕方、
レポートの書き方等々)
プログラム、ネットワーク、セキュリティなどの学習
7月 配属 → 2年間は先輩SEの指導によるOJT期間
1年度目末・2年度目末に成果発表会
OJTの2年間でプログラミング、データベース、ネット
ワーク等を学ぶが、教えるのは基礎のみ。→後は自分
でつかみ取る必要がある
新人を育てることは重要→研修はみっちりやる!
2.SEの魅力は?





厳しい仕事なのは間違いない。特に納期前の作業は確
かにハード!
しかし、自分(達)が作成したシステムが稼働したときの
達成感は何ものにも代え難い。
システムを一つ作ると・・・また次のシステムを作りたくな
る。→モノ作りはやめられない!
モノ作りのためには最先端の技術動向を把握する必要
がある。
大変だが、それを獲得して行くことで、自分自身の成長
を実感できる。
ハイリスク・ハイリターンな職業!?
3.SEになりたい人へのメッセージ






まず、コンピュータが好きなことが第一要件。
共同で作業を進めるのでコミュニケーション力は重要。
プログラミング、データベース、ネットワークそしてセキュ
リティの問題など、勉強すべき点は数多くある。それらを、
主体的に勉強することが必要。
進展が激しい分野なので、常に勉強が必要。→ 勉強
する人は伸びる。逆に、勉強をやめた人はそこまでで終
わる。
それがはっきりと出る(見える)職業。
意欲のある人には、大変やり甲斐のある職業!
若い人にチャレンジして欲しい!
<本日のテーマ>
Javaプログラミング総復習
 JBuilderを用いて行ってきたフレームの生成やイベント処
理などを、(JBuilderに頼らず)最初から記述してみる。
 その過程を通じてJBuilderの機能のメリットを理解する。
<内容>
1.
2.
3.
4.
5.
6.
mainクラスの定義
フレームの生成
mainクラスとフレームクラスの役割分担
ボタンとテキストフィールドの貼り付け
イベント処理の実装①
イベント処理の実装②
1.mainクラスの定義
class FrameApplication {
コンストラクタ
public FrameApplication() {
省略可
}
public static void main(String[] args) {
System.out.println("実行成功!");
}
}
mainメソッドの定義:一つの処理に対し必ず一つ定義する。
FrameApplication.javaとして保存
以下、作成したファイルやフォルダが、javac.exeやjava.exeなどのJava翻
訳システムがあるフォルダにあるものとして話を進める。
mainクラスの翻訳・実行
① バイトコードへの変換(翻訳)
② バイトコードの実行
実行結果!
2.フレームの生成
import javax.swing.*;
フレームクラスはjavax.swing
パッケージにある
class FrameApplication {
public static void main(String[] args) {
JFrame frame=new JFrame(); フレームオブジェクトの生成
w h
フレームの幅wと高さhを設定
frame.setSize(300,200);
}
}
frame.setTitle("自作のフレーム");
x y
frame.setLocation(100,50);
表示位置(x,y)の設定
frame.setVisible(true);
フレームを表示させる
フレームの生成→実行
50
100
200
300
※ ×をクリックしても、ウィンドウは閉じるがプログラムの実行は終了しない。
プログラムの終了処理を記述しなければならない。
3.mainクラスとフレームクラスの役割分担
<準備>
1. 適当なフォルダ、例えばframesampleというフォルダを作る。
2. その中にFrameApplication.javaを移動する。
3. 同フォルダ内に、フレームを定義するFrame1.javaを作る。
framesample
パッケージ
FrameApplication.java
Frame1.java
フレームを生成・表示
フレームを定義
Frame1.java
package framesample;
import javax.swing.*;
import java.awt.event.*;
パッケージの指定
ウィンドウ(フレーム)の終了処理
のために必要
class Frame1 extends JFrame {
public Frame1() {
・・・
}
JFrameを継承
コンストラクタ
フレームの初期処理
//ウィンドウが閉じられたときに終了するようにオーバーライド
protected void processWindowEvent(WindowEvent e) {
・・・
}
}
FrameApplication.java
package framesample;
class FrameApplication {
public static void main(String[] args) {
Frame1 frame=new Frame1();
frame.setLocation(100,50);
frame.setVisible(true);
}
}
これで、FrameApplication.javaはいじる(変更する)必要が
なくなる。
JBuilderで皆が意識しなかった理由
4.ボタンとテキストフィールドの貼り付け
<Frame1.java>
class Frame1 extends JFrame {
private JPanel contentPane;
private JTextField TField1 = new JTextField();
private JButton Btn1= new JButton();
public Frame1() {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
TField1.setBounds(20,10,200,25); テキストフィールドの
貼り付け
contentPane.add(TField1);
Btn1.setBounds(20,60,120,25);
Btn1.setText("自作ボタン");
ボタンの貼り付け
contentPane.add(Btn1);
this.setSize(300,200);
this.setTitle("自作のフレーム");
}
5.イベント処理の実装①
ボタンをクリックした時に、テキストフィールドに「イベント処理
成功!」という文字を表示させるには・・・
以下の部分を加える。
イベントリスナの登録
public Frame1() {
・・・
this.setTitle("自作のフレーム");
リスナインタフェース
Btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
TField1.setText("イベント処理成功!");
}
});
}
メソッドの上書き(定義)
6.イベント処理の実装②
public Frame1() {
・・・
this.setTitle("自作のフレーム");
Btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Btn1_actionperformed();
TField1.setText("イベント処理成功!");
}
});
}
メソッドに置き換える
public void Btn1_actionperformed() {
TField1.setText("イベント処理成功!");
}
皆がいつも記述していた部分
第14回目レポート

講義中に指示します。
コンストラクタの記述
class Frame1 extends JFrame {
public Frame1() {
this.setSize(300,200);
this.setTitle("自作のフレーム");
}
・・・
}
これにより、フレームが生成されるときに、その大きさとフ
レームタイトルが設定される。
フレームの終了処理
//ウィンドウが閉じられたときに終了するようにオーバーライド
protected void processWindowEvent(WindowEvent e) {
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
×を選択した場合
}
プログラムを終了させる。
メソッドの上書き→終了処理を加える。
カプセル化のメリット・デメリット② 関連
するレポート

以前から議論してきた“コンパイル過程を理解してから
プログラミングを行ったほうが良いか?”の中にもこのカ
プセル化の問題は潜んでいると思いました。プログラミ
ングとコンパイルは一セットだが、実際は詳細を知らず
ともプログラミングすることができます。知らなくてもプロ
グラミングは問題なくできる。最初から難しいことをやろ
うとせず、まずは取り組んでみるという親しみやすさのメ
リットと、その裏で過程を知らないがためにプログラムや
エラーへの応用力や対応力が身につかないというデメ
リットがあるのではと思いました。
参考:言語の制約の度合い
print “Hello!”
BASIC
行が基本
main( ) {
C
printf(“Hello!\n");
関数が基本
}
制約大
public class Hello {
public static void main(String args[ ]) {
Java
クラスが基本
System.out.println(“Hello!”);
}
}
 どの言語が良いかは用途によって決まる。
 オールマイティな言語はない。
ダウンロード

講義スライド - SGU動画共有