レポート抜粋(7/13)
<テーマ>
以下の設問に答えて下さい。
- カプセル化のメリットとデメリットについて、(あなたが考える)具体的な(身近な)実例を挙げて下さい。
- (講義で採りあげた)Java言語による人間クラスの実装についての感想や質問を記述して下さい。
なお、上の記述を行った上で、いつものように興味を持った点や講義の感想、そして前回のレポートに対するコメント(意見や感想)を付加しても結構です。
T.カプセル化の実例とそのメリットとデメリット(回答より抜粋)
A.パソコンの例
- カプセル化のメリットデメリットを日常生活で例えるなら、パソコンがいい例であると思う。パソコンを使用している多くの人は、どのような構造で作られているかを知らないはずである。しかし普通に使用するぶんには、そんなことはまったく知らなくてもいい。しかしいざ壊れてしまったときや、ウィルスに感染したときにどうしたらいいのか解らなくなくなってしまう。実は大したことのないアクシデントであっても、知らないがゆえに深刻に捕らえてしまう。この点でのメリットは、使用する側が、まったくパソコンの構造を理解していなくても便利に使用できることである。反対にデメリットは、不測の事態が起こったときに、実際簡単に直せるものでも本人一人では、どうすることもできないという点である。
- カプセル化のメリットは内部の詳細を知ることなく、その機能を使用することである。それの例を挙げるとすれば、コンピュータです。コンピュータはその構造を知らなくても誰でも扱えます。また、カプセル化のデメリットはその機能が使えなくなったとき、内部の詳細を知らないためどうにも出来ないことである。ここで僕の友達の例を使おうと思う。友達は講義中にコンピュータを使用していたら突然キーボードが打てなくなったという現象が現れた。そして、それを自分では直せないため電子計算機センターに修理に出しました。このように僕の友達はコンピュータを使うことはできるが壊れたときの修理はできない、つまり、機能は使えるが、内部の詳細は分からないためどうしようも無いというカプセル化のデメリットに当てはまるのである。
- 例えば私たちがよく使っているパソコンにしても、その中身が一体どのようになっているかを詳しく知らなくても、色々なソフトや機能を使用することができます。しかし、一旦エラーが起こると、自分では解決できないという人がとても多いと思います。もしかすると、開発者でも解決できないことがあるのかもしれません。
どんなに技術が向上し今よりもより高い性能のマシンやソフトが出ても、利用者はそれを意識することなく使っているのではないでしょうか(勿論全ての人がとは言いませんが)。そして、本当の意味で使いこなせている人というのは少ないのではないでしょうか。
- たとえばパソコンというオブジェクトがあったとすると、CPU、メモリスペックのデータのプロパティが存在し、起動、シャットダウンなどの操作のメソッドが存在します。カプセル化することにより通常では必要のない内部情報を知らずしても利用できます。しかし、内部情報を知らなかった為に用途を間違ったり思わぬ動作をしたりする危険性もあります。
B.ソフトウェア関係の例
- 自分はカプセル化の実例についてはパソコンのWordもそうだと思う。パソコンのキーを打つことによって画面には文字を出している。何も知らなくても文字を打つことができるということがメリットだと思う。しかし、エラーが出たりパソコンがフリーズしてしまったりしたときにはどうすることもできないということがデメリットなのではないでしょうか。
- 今回の講義中に起きた脆弱性の検出のことがまさにそうだと思います。 普段パソコンを使うにあたって、ワードやエクセル、インターネットなどを何気なく使っています。これはパソコンの知識を熟知していなくても行えることだと思います(メリット)。しかし、今回のようにいったん脆弱性が検出されたり、ウイルスに感染したりすると、自分ではどうしようもなくなってしまいます。まさに自分がそういう状態になってしまいました。
やはり、ある程度パソコンに対しての知識というか、使い方や対策を知っておかなければいけないと思いました。
- ゲームソフトの場合、利用者は操作さえできればいい。だが、どのようなデータ構成になっているかわからない利用者が、過剰な高性能化を要求することもある。
C.その他の機器の例
- カプセル化をCDコンポの操作を例にして考えてみると、再生・停止などの仕組み(システム)などがわからなくても、ボタンを押すだけで簡単に操作できるというメリットがあるが、音が出なくなったり、再生・停止ができなくなるといったような、原因がわからない状態になった場合は、コンポの内部を調べなければならない(修理に出す)といったデメリットがある。
- 自動券売機に例えた場合、購入者はお金を投入してボタンを押すだけで券を手に入れられるというメリットがある。自動券売機内の仕組みを知らなくてもいいのである。だが、自動券売機が壊れた(故障した)場合、一般の利用者はどうすることもできないというデメリットがある。
- このことを例に挙げるならば、私は、車を例に挙げます。車の中身をわかっていなくても、操作の仕方を理解していけば、運転をできるところが、メリットで、デメリットは、故障してしまった場合、一般の人には直すことができないことです。
D.組織の例
- カプセル化によっての具体的メリットを具体的にあげると、「学級」(には)
給食係
美化委員
風紀委員
掃除係
などがあるが、クラスを運営する上で担当者が決まっていることによって、作業の効率が上がる。また、責任というものが生じる。デメリット(として)は、全体が把握できないことや、問題を共有することが出来ない。
- ・学校や会社などでの仕事分担を行うことにより、効率がより良くなる。
・しかし問題が発生したときなど、分担した数だけの報告を受けまとめなくてはいけず、また問題点はどこにあるのか探さなければならない手間がかかる。
- 会社などで事業を行う場合の部署を例にあげてみる。開発部や営業部などが存在しているが、メリットとしてはその仕事には担当部署があるため、仕事効率は上がるということ。デメリットとしては、仕事をする上でお互いの仕事がわからないため、仕事の話になるとコミュニケーションがとりにくいという点と、その仕事に秀でた人材が要求される。
- 仕事をする上で品出し・レジ・清掃等役割を分担することで仕事効率があがる(メリット)。しかし、その役割を果たすためには各仕事のプロフェッショナルが必要となる(デメリット)。
E.その他の例
- 使う側は必要以上のことは知らなくてもいいというようなこの仕組みは、開発者側が一方的に使う際の制限を与えているようにも思える。極端な例を挙げれば、一昔前の医療問題にあったインフォームドコンセント(治療を行う際に医者が患者へどのようなものなのかを説明すること)に似ていると思った。
- 以前から議論してきた“コンパイル過程を理解してからプログラミングを行ったほうが良いか?”の中にもこのカプセル化の問題は潜んでいると思いました。プログラミングとコンパイルは一セットだが、実際は詳細を知らずともプログラミングすることができます。
知らなくてもプログラミングは問題なくできる。最初から難しいことをやろうとせず、まずは取り組んでみるという親しみやすさのメリットと、その裏で過程を知らないがためにプログラムやエラーへの応用力や対応力が身につかないというデメリットがあるのではと思いました。
- カプセル化のメリットとデメリットについて、身近な例を挙げるとすれば、病院の薬があると思います。医師の指示通りに服用すれば特に問題はないけれど、一度に多量に服用したり、何年も前にもらった薬を服用したりすると大変なことになってしまう・・・これらは、薬を服用する人(患者)が、薬の成分についての知識がないから起こってしまうことだと思います。
U.人間クラスの実装について
A.全般的な感想
- JAVAと言うか、サブクラスやスーパークラスなどを使ったオブジェクトの仕組みや流れがアメリカ人クラスや人間クラスを使うことにより、よりいっそうイメージしやすくなった。
- 講義の中にも出ていたけど、人間クラスの(インスタンスの)例として太郎とジョンという名前を用いたやり方はとても分かりやすいと思いました。このプログラムは・・・(略)スーパークラスとサブクラスの色分けがはっきり分かるため、こういうプログラムを遊び感覚で作ってみたいと思えました。
- 人間という分類のなかに日本人、アメリカ人、イタリア人が存在している。日本人インスタンスが情報を受け取ると日本人クラスが属している人間クラスを継承する。人間クラスの実装例でオブジェクト指向プログラミングが簡単に出来ることがわかりました。
- 昨年プログラミングのとき、Javaについてはあまり経験が無かったので詳しくどうこうと言うのはわからなかった。ソースを見れば大体のことがわかるが、クラスとかインスタンスとかよく分からないでやっていた。ようは、デメリットにどっぷりはまっていたわけだが、今日の説明を見てやっと分かった部分がいくつかあった。こうやって考えると、クラスの便利さや継承があるといかに使いやすくなるのかよく分かった。
クラスの実装など、実際にやって覚えるのも大切だと思うが、今回の講義のように一度実際にやったことをもう一度言葉で教わったほうが、理解がより深まると思った。
- 自分は昨年プログラミングを履修していましたがこのクラスの生成の部分が一番苦手でした。しかし、今この人間クラスの定義を聞いてみるとすごくわかりやすく、色々なメソッドの定義クラス、スーパークラスの定義などよくよく考えれば意外とわかったような気がします。 しかし、わかったような気がしているだけで自分が見ているのはカプセル化されている表面上を見ているだけなのかもしれないとも感じました。まだまだ理解力 が足りないと思いました。
B.クラス継承のメリットについて
- 今日の講義の人間クラスの定義で、日本人、アメリカ人、イタリア人を使ったプログラムの例がわかりやすかったです。
人としての基本動作はそのまま継承でき、違う部分つまり言語の部分だけを変えることができるということを理解できました。
- 人間クラスの定義については、登場から始まり、移動したり話したり、最後は退場したりという流れが面白いと思いました。どこの国の人を選ぶかによって話す言葉が異なったり、移動する方向も右か左を選べたりして、選択肢(インスタンス)によって結果が異なるということも面白いと思いました。
C.例題プログラムの機能の拡張を提案
- 今回は単純なプログラムで、ボタンを登場させ左右に移動させるものでしたが、これを応用してボタンではなく例えば人の画像にしてみたら“話す”や“移動”の意味合いが出てきて、幼児向けに楽しめる学習アプリケーションができるのではと感じました。
- 「左右だけでなく上下にも移動できるようにする」、「ドイツ人、ロシア人など他の国の人も増やす」、「話す内容に挨拶以外も作る」などをクラスの継承、クラスでメソッド定義を更に行えば拡張は可能なので、思い付くだけ多種多様な拡張が可能でかつ拡張をしやすいプログラムだと感じた。
- 登場ボタンを押した時に出てくる長方形は白色に設定されていますが、この長方形を利用したプログラムを思い付きました。「話す内容に感情的な言葉(嬉しい、怒っている、悲しい、楽しいなど(日本語の場合))を追加して、その感情を分岐処理によって変化するようにする。そして、話すボタンを押した時の感情によって長方形の色・大きさ、字の太さ・大きさなどが変わるようにする」というプログラムを考えたのですが、どうでしょうか?
D.クラスの定義の複雑化の懸念の指摘
- 言葉とか場所(の移動)とかの実装なら可能ではあるが、その人間個人の人格まで取り組むとそれは膨大な量になるので難しい問題ではないでしょうか。
- 人間の人種、性別、そして細かく言えば人間の行動までをもクラス、オブジェクトで作ることで、より細かい対応が出来るようになる。これが実装できるようになれば、それはとても便利なものになるかもしれない。だが、行動までをも網羅するには、かなりの労力と時間が掛かるだろうと思った。
E..ゲームへの応用を連想
- これが分かることにより、ゲームを作れたり、ソフトを作れると実感した。
- ゲームを作ったりするのが趣味なので、このプログラムをうち込むことで、ロールプレイングゲームが作れたりするんだなぁと素直に思った。意外なところで、ゲームの中身を知れた気がする。
F.質問
- クラスとインスタンスの例で人をつかって説明したのが非常に分かりやすかった。 根本にまず人があって、そのサブクラスに日本人、アメリカ人といって。またそこから細分化されていき、日本人クラスのインスタントとして太郎など(があることを)理解できました。
しかし、クラスとして哺乳類を考え、インスタンスを人と考えると、日本人、アメリカ人はどういう位置づけになるのだろうか?なんかごちゃごちゃになってきます。
- Java言語のデメリットのところで質問なのですが、クラスが仮に多くなりすぎたとして、それをなにかの表にまとめたりするなどの方法で見やすくするということは出来ないのでしょうか?
- 私はクラスとインスタンスとはどういったものなのかあまり理解できていません。なので、今日の講義中の人間クラスの例もあまりわからずに聞いていました。来週、少しの時間でいいのでクラスとインスタンスの基本的なことを再度教えてもらいたいです。
V.その他の感想
- 使いやすくなればなるほど、中身を知ろうとする人がへり、仕組みが理解できなくなる。仕組みを理解させ、汎用性を高めようとしたら、覚えることや制約が増え、使いがってが悪くなる。この両立の難しさが今後のプログラミングの課題だと思いました。
- 今回一番興味を待ったのは、javaの役割分担の明確化です。トヨタのかんばん方式しかり、今は役割分担をはっきりさせることで、非常に高い効率にすることが出来ます。そういった意味では、時代も経済も企業もプログラミングも、目指しているものは似ている部分が多々あると思います。
後、横にずらすといったプログラミングを作ったことがなかったので、今回の例は非常に見ていて勉強になりました。プログラミングってこんなことも出来るのか、と僕の中のプログラミングの可能性が広がりました!
- 最近は実生活に存在する大半のことがカプセル化している気がします。携帯電話にしてもパソコンにしても、毎日使っている人もいるであろう自動車にしても、内容を知らなくても、使い方さえ覚えてしまえば使いこなせてしまうものが多すぎると思います。例えば携帯電話のメール送信機能についても、一体どれだけの人が携帯電話の中でどのような処理をしているか説明できるでしょうか? はずかしながら自分も知りません。周囲の人も知らないでしょう。 カプセル化が進む世の中に不安を覚えてなりません。
- カプセル化は利用する側には、とても便利ですが作るほうの苦労は耐えないと思います。今の時代のものはほとんどがカプセル化されてきているように思えます。そういった事にありがたみを感じる事が大事だと思います。
前回のレポートへのコメント
- 一応先週(7/6レポート抜粋「前回のレポートへのコメント」A-2)の補足というか。
皆がいろんな事に疑問をもてるようになったら、というのは「何でこんなことができないんだろう?」と言った感じの疑問のことです。