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