オブジェクト指向を教える難しさ初めまして。世間では9月に入り涼しくなりましたが、私は世界陸上の男子4×100mリレーの熱い戦いを見て大興奮でした。200号記念ということで、創刊当時の思い出を紹介したいと思います。●メルマガ創刊当時を振り返るメルマガ創刊は2003年ですが、その頃皆さんはオブジェクト指向に関わっていましたか?これより少し前の2001年あたりからですがUMLをシステム設計に使用する企業が増え、UMLモデリングツールといえばRational社のRoseが主流を占めていました。デザインパターンがブームになっており、GoFの23パターンを説明できるよう結城浩さんの「Java言語で学ぶデザインパターン入門」に毎日目を通した思い出があります。当時私は某メーカーのUMLの普及・教育を行う部署にいましたが、新人研修でオブジェクト指向を理解してもらう難しさを実感しました。●オブジェクト指向を理解するための2つのハードルオブジェクト指向を理解してUMLで設計し、実際に開発ができるようになるまでには、ハードルがいくつかあると思います。見られるハードルとしては次の2つに集約されるのではないででしょうか。1つはユースケース図とソースコードのギャップです。人型と楕円で書かれたユースケース図が、どのような過程を経てソースコードに結びつくのか?ギャップが大きすぎて初めての人には理解しがたいものです。2つ目は現実世界とシステムの世界のオブジェクトの混同です。験の無い人はこの2つを混同しがちだと思います。今回は、筆者が新人研修の講師を務めた際に実感した2つ目のハードルについて紹介したいと思います。●銀行の業務には「植木」が必要である筆者が担当した新人研修は、カブセル化、継承などオブジェクト指向の考え方を理解することを目的として、講義と演習を交えて1週間行われました。1日目のオブジェクトについての説明が終わりディスカッションの時間です。課題:「銀行に預けられた貯金はコンピュータのシステムにより管理さている。さい」グループごとにディスカッションした後、模造紙に回答をまとめて発表します。どのグループでも見られたオブジェクトが次の3つでした。┗━━┛しかし次のようなオブジェクトを挙げたグループも少なくありません。動ドアは銀行の入り口に存在し、これらが無いと銀行の業務ができないから」という答えが返ってきました。「植木」は実際の店舗に存在する物理的オブジェクトであり、銀行の業務には必要です。システムで「貯金を管理する」という機能を実現するにはあまり関係がなさそうです。新人はどのように考えて「植木」を必要なオブジェクトとして挙げたのでしょう?その理由は主に次の2つだと思います。実現できると理解しているこれらについては、私の説明に問題があると思いました。「『人』のサブクラスが『一般社員』と『管理職』で・・・」のように、大半が現実世界のオブジェクトを用いて説明しています。私も講義ではこのような調子で説明してしまいました。オブジェクト指向の話を始めて聞く人がこう説明されることで、継承について理解できると思います。「現実世界のオブジェクトを挙げていき、現実世界の継承や関連をそのままUMLの図に描けば動くシステムになる!」と理解してしまう危険が非常に高くなります。相手の経験を踏まえて説明を変えることの大切さを実感した研修でした。(黒須)_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。[2]こんにちは、オブジェクト倶楽部のやせがえる、やっとむです。いうわけで応援してね。やせてない、というツッコミはかえるにしつれいですよ。Newsみなさんお待ちかね、全国3000万人のPythonistaが待っていたPython3000のアルファ版がリリースされましたね[*1]。Python3000とは、言わずと知れた未来のPython。いいアイデアだけど実現はちょっとムリかもねー、というのを「じゃ、それはPython3000で」みたいな言い方をしていたらしいです[*2]。その後、後方互換性を一部切り捨ててでも、よりよい言語を作ろうというバージョンをPython3000と位置づけました。PEP3000番台で仕様を検討してきて[*3]、Python3.0α1ということでいよいよリリースされたわけです。日本語を含むUnicode文字列の取り扱いが進歩したあたり、またRubyに一歩差をつけちゃいましたね!(地雷)ニュースをもうひとつ。JavaVM上で動作するPython処理系のJython2.2が正式リリースされました[*4]。Jythonは2.1以来しばらく動きがなかったのですが、JRuby(Java上で動くRuby)や.NET版PythonであるIronPythonに刺激されたのかどうなのか、そのあたりはよくわかりませんが、なんにせよPython界が活発なのはいいことじゃないですか!■いまさらSkypeという世間の活発な動きを軽くスルーして、仕事ではRubyを書きながらコソコソとPythonを使っている今日この頃ですが、ふとしたことからSkype[*5]をプログラムから操作できまいか?という話が持ち上がりました。SkypeAPIというものがあることは聞いていて、調べたところWindowsのCOM(Skype4COM)と、Java(Skyep4Java)のラッパーがある模様です[*6](LinuxではD-Busというものを使うそうです[*7])。「Pythonから使えるよな...」で、やってみました。通常SkypeはWindowsマシンで使っているので、COMラッパーのほうを使うことにしました。[*8])を使うのが簡単です。Skype4COMは、Skypeインストール時に既にインストールされています[*9]。pywin32でインストール[*10]したら、準備は完了[*11]。いつものとおり、Pythonをインタラクティブに使って試してみました。skype.PlaceCall('echo123')これだけで、通話テストにコールすることができます。call.Finish()これでOK。簡単じゃないですか?■なにができるの?Skype4COMのリファレンス[*12]を調べると、Skypeのさまざまな機能(通話、グループ通話、コンタクト管理、チャット、ボイスメール)がAPIからアクセスできることがわかります。プロフィールダイアログを開くといった具合です。A2A[*13]を使ってSkype上で動作するネットワークアプリケーションを構築することもできるでしょう。■まとめ今回はいまそこにあるSkypeをPythonでいじってみました。今回はWindows専用の方法を紹介しましたが、Skype4JavaとJythonを使えばクロスプラットフォームで動きますし、Skype4PyというクロスプラットフォームのPythonラッパーもあるようです[*14]。いずれもAPI自体には大きな違いはないようなので、自分の環境に合ったものを使ってみてください。ちなみに、今回のことの発端は、Skypeの履歴を取得したかったのですが、どうもSkypeはそういったログなどをテキストで保存していない!ので、どうやったら取り出せるかな?と調べ始めたのでした。インストール時のオプションによっては、導入されない。