オブジェクト指向再考(イントロダクション)

 前回出した記事(オブジェクト指向おじさん?)のあいださんのコメントで最も興味深いものが、オブジェクト指向しかしらないプログラマが増えてきている、というものである。実は私はそれまで『なんでこうオブジェクト指向信者が途絶えないのか?』と疑問に思っていたのだが冷静に考えれば解るとおり『良いも悪いもなくソレしか知らない。』(あいださんのコメント)世代が増えて来ているようだ。幸いにして私の周り半径3メールではそんな奴はいないので私の視野が狭くなっていたらしい。そういう意味では前回の記事をアップして良かったと思う。
また、元々、オブジェクト指向に関する記事を書こうかと思って対象読者を従来の手続き型言語に精通している人としようかと思っていたのだが方針を若干変更してメインターゲットを『オブジェクト指向しか知らない世代』にして、今後増えるであろう、オブジェクト指向症候群に掛かった患者への処方箋を今後数回に分けて書くことにする。
 オブジェクト指向という言葉を聞くとみなさんはどんなイメージをもたれるでしょうか?『オブジェクト指向とは何か?』を素人に説明するとプログラミングパラダイムの事でつまりプログラムを開発する上での一つの考え方や一つの模範ということになる。実はこれ以上でもこれ以下でもないのですが、もしあなたが以下のどれか2つに当てはまるのならオブジェクト指向症候群に掛かっているかもしれないので、この連載は役に立つだろう。

 1.関数という言葉に嫌悪感を感じる。または時代遅れの遺物だと感じる。
 2.よく他のプログラマ・言語に対して『オブジェクト指向ではない』と言っている。
 3.staticを使っている人をみるとプログラマとして終わっていると感じる。
 4.過去にオブジェクト指向を批判した記事を読んだが書いている奴がオブジェクト指向を分かっていないだけだった。
 5.C++が最高、他の言語はダメと思う人。
 6.Javaが最高、他の言語はダメと思う人。
 7.C#が最高、他の言語はダメと思う人。
 8.と言いつつも、自分自身がオブジェクト指向というのが何か実は良く解っていない。

さて、こういうと『お前が解っていないだけだ』と批判を受けそうなので少し私自身について説明します。私は14歳の時からプログラミングを初めて今年で32年目になります。仕事で使った言語は、覚えた順からBasic,Assembly,C,C++,VB,SQL,Java,Perl,PHP,MDX,Ruby,VB.NETです。ちなみにAssemblyは複数のCPUのインストラクションセットを覚えたし、実際に20年前まで仕事で使っていました。メジャーな言語ではC#が抜けているがやったことがないだけです。オブジェクト指向についていうとこれまた20年以上の経験になり、いわゆる手続き型言語からオブジェクト指向言語へコンバートした人になります。批判される前に私のオブジェクト指向の経歴をいうと、十数年前にJavaの記事を書いたこともあるし、ADPというプログラミング言語のプロジェクトを持っているがこれはC++で書かれています。またADPもオブジェクト指向をサポートしてます。その関係で一般のプログラマよりもオブジェクト指向についてよく考えていると自負している。

さて、まず最初の処方箋を言うと、オブジェクト指向は過大評価されている点を挙げましょう。実際は全くそんなことはないのにも関わらず、『オブジェクト指向はプログラマが進む最終地点』と考えている人が多いでしょう。歴史的にみてオブジェクト指向が持てはやされたことがありそれに無意識に乗っかっている人々がいたということもあるが、実はオブジェクト指向自体になにかプログラマを引き付ける魅力があります。ある人はそれを『究極の一手』と表現し、またある人は『彼女(彼氏?)』と言ったり、私自身も『オブジェクト指向はプログラマが進む最終地点』と考えていた時があった。さてここまでで『私がオブジェクト指向を理解していない』と思ったあなたは充分オブジェクト指向病に冒されていますので、何かコメントをしよう考えたのなら少し我慢して以下を読んで頂いて反論を頂きたい。

誰でも知っていることだがオブジェクト指向というのはもともと分類学の技法をプログラミングに取り入れて複雑なプログラムに対応しようというパラダイムの一種で、クラスとか継承とか多態性という言葉は分類学から借りてきたものであるといえる。ここで冷静になって考えてみれば分かることですがそもそも世の中の全ての事柄を分類学でカバーできるでしょうか?世の中の学問を見渡せば分かるとおり分類学では全てはカバーできないことは理解できるでしょう。つまり継承とか多態性というのは一部の領域にのみカバーをすることが保障されているということであり、ここで代表例を挙げると、GUIシステムにはオブジェクト指向がうまく適合できたようで、他の例を挙げると私の経験上になるがプログラミング言語の処理系もうまくマッチすると思う(残念ながら全く問題がない訳ではないが)。その他、経験上言えることは、一連の法則性を持った多様なものを処理するにはオブジェクト指向が向いていると考えられる。ほかの例を挙げると、実はオブジェクト指向ってしっくりこないんです!の記事にある、とりすけ さんのコメントで税金計算処理の適用事例があります。
以上、確かに適用できる事例はありますが、逆にいうと応用例はかなり限定されています。よく自称オブジェクト指向専門家に具体的な話を聞くと『息を吸うようにインタフェースを使っている』という分かったような分からないような返しをされますが、具体的な話ができないということはそもそも彼(彼女)も分かっていないということになるでしょう。本当に息を吸うようにインタフェースを使っているのなら具体例が多数出てくるでしょう。

また、オブジェクト指向の本質はメッセージだ!という人もいらっしゃいます。なるほどメッセージをやり取りすることにより複雑なシステムを簡単に構築しようということらしいです。では以下の2つのコードはどちらが理解しやすいでしょうか?

z = 3 * x * y + 4 * x + 6 * y + 2;

z = 3.multiply(x).multiply(y).add(4.multiply(x)).add(6.multiply(x)).add(2);

『下のコードの方が良い』という人はぜひリハビリを行ってください。少なくとも人前では上の方がよいと言いましょう。ちなみに当たり前ですが、これを持ってオブジェクト指向がダメだと言いたい訳ではなく、言いたいことは、『メッセージというある種のプログラムを抽象化する道具も乱用すると却って悪戯にプログラムを複雑にする』ということです。
次の回(おそらく来週?)このメッセージについて考察したいと思います。
2016-03-14 | コメント:21件



語学留学21週目(3/13)、通訳案内士合格

 早いもので、年が明けてから3月も中旬になりましたが、一応更新しておきます。
先ず、6年間にわたり私を苦しめてきた通訳案内士試験ですが、晴れて合格しました。
そういえば、2次試験のレポートも書いていませんでしたが、2次試験は昨年の12月13日にありました。英検と違いとにかく拘束時間が長く内心二度としたくないと思っていたところで今一つ自信がなく合格と知ったときは、うれしさ半分、ウソだろう?という気持ちが半分でした。何はともあれ合格できて良かったです。
語学留学の方は、02.16 5学期目からリーディング・ライティングをやるようになった。
その5学期も終わり今は6学期目に入っています。成績は以下のとおり
 10.15
1学期目
11.15
2学期目
12.15
3学期目
01.16
4学期目
02.16
5学期目
Level106107108109110
GPA3.32.93.23.13.0

かろうじて3.0を確保したかという感じだが、まぁ、成績が今一つ振るわなかったのは花粉症になりファイナルテストの成績が今一つだったからだと思われる。

最近は、言葉が口をついて出るようにはなったが、文法が今一つで、評価シートにも"Work on accuracy in speaking"と書かれた。まぁ仕方がない。後7週間で語学留学も終了になるので悔いがないように頑張りたい。
2016-03-13 | コメント:0件



語学留学15週目(1/30)

 すっかり遅くなりましたが、あけましておめでとうございます。
という訳で、さて昨年の年末で終わりにする予定でした語学留学ですが、4週間の休暇を挟んで続けることになりまして、今は15週目に入っています。ちなみに親しい人には年末に延長する話をしたのでブログの方は放置してました。
まぁ、留学生活ですが公私共に仕事をしていると時とちょっと違う体験をしておりましてブログの更新に手が回らない状況です、が、他に書きたいことが出てきたのでこっちも書きます。

さて、私の通っている語学学校は4週間毎に1学期としていて、それぞれにGPAというスコアがつくのですが、一応今までのスコアを列挙しておきます。
 10.15
1学期目
11.15
2学期目
12.15
3学期目
Level106107108
GPA3.32.93.2

留学当初はGPA3.5を目指していましたが、今はそういう必要もないのでじっくり勉強しようかと思っています。
発音については年末年始の特訓が功を奏したのか大分改善されたらしく、先生に「お前の発音はいいな」と褒められた。もっとも油断は禁物で手を抜くとすぐにレベルダウンするようで更なる精進が必要である。
また、リーディング力が大分ついてきたようで、興味のある記事については楽しめる程度に読めるようになってきた。あの独特の足かせというか今一つ意味が頭に入ってこない感覚がなくなりつつある。
一方でスピーキングについてはまだまだという感じで最近になってやっと晩飯の時にホストファミリーと少し話ができるところまで来た。
という訳で早くも次週の木曜日が4学期目のファイルテストになります。
2016-01-31 | コメント:0件



オブジェクト指向おじさん?

 私の盟友(?)ことみながわさんの日記が更新されたので覗いてみた。2016年1月29日の記事によると、とあるWEBの記事「staticおじさん」はなぜ自信満々なのかというのが目につく。
この手の記事に対しての警鐘は以前にも行ったのだが、未だにこういう煽り記事が出てくるということは出版業界はよっぽど不景気なのか?と邪推したくなる。
アメリカに留学して習った単語にobjectiveというのがあり日本語訳は客観的で、反対語はsubjective(主観的)になります。論文を書くときは客観的であれといわれます。といっても何が主観で何が客観か分からないでしょう。本当かウソか分かりませんがアメリカではこのobjectiveということを子供の頃から教わるらしいです。もっとも子供の頃にそんなことを習ったことのない日本人は文章を読むときに、何が主観的か客観的かが判断がつかないこともあるでしょう。ちなみに何の説明もなしに『普通はこうだ』とか、他にも記事を読んで『俺の意見を代弁していてくれる』と思ったら、その記事は主観的である可能性があります(主観的の定義に従えば自明ですよね)。

さて、元の記事にあるこの部分
 Javaでメソッドを呼び出すときにはクラスからインスタンスを生成してインスタンスのメソッドを呼び出すのが普通です。一方、staticメソッドはインスタンスを生成しなくてもクラスから直接呼び出せます。このため、オブジェクト指向プログラミングを理解していない古いタイプのプログラマは、Javaでもstaticメソッドを多用します。これを揶揄して「staticおじさん」と呼ぶのです。
これは、

インスタンスメソッドを使う→普通
staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり

と読み取れます。思わず普通ってなんやねん?と突っ込みたくなるのですが、
そろそろこのインスタンスメソッドを使うのが普通という誤謬を解きたいのですが、staticメソッドは場合によっては推奨されています。
期待するコードを期待するように書こうという本から引用させていただくと
クラスのメンバへのアクセスを制限するもう一つの方法は、メソッドを出来るだけstatic にすることだ
このReadable codeという本は私は英語版を購入したのですがそこでも同様のことが書かれています。


また、英語が読める人は、static methodで検索をかければいろいろ議論を見ることができます。たとえば以下のQAたち
https://www.quora.com/Why-is-using-statics-Static-method-block-variable-in-Java-programming-bad-programming http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods
ここでは、インスタンスメソッドを使うのが普通とか訳のわからん理由ではなくきちんと事実に則って議論がされています。
事実(fact)に則って議論するということは客観的(objective)な議論ができているということになるでしょう。

ざっくりとまとめますと、staticメソッドを使うと

欠点:継承ができなくなる。ポリモーフィズムも使えなくなる。
利点:メンバー変数へのアクセスを制限できる。パフォーマンスが上がる。

ということです。他のものは自明として、利点のところで『パフォーマンスが上がる』かは検証の必要があるのですが、ポリモーフィズムはオーバヘッドを発生させるのでそれを使わなければパフォーマンスがあがる可能性はあります。
また欠点の中で、『ややこしくなる』という意見もあったのですが、これは主観的な意見でしょう。たとえばstaticメソッドを使いなれた人はむしろすっきりとすると考るかもしれません。

さて、継承もポリモーフィズムも使わないということであれば、staticメソッドを使ってもよいということになるのですが、この反論として、『オブジェクト指向でなくなる』というのがあります。もはや手段と目的が混同されているとしか言いようがない意見でいやはや疲れます。
まぁ一介の無名なエンジニアが何をいっても仕方がないのでもっと説得力のある例を出しましょう。
επιστημη さんという著名なライターさんがいらっしゃいますが、彼は思い切りstatic メソッドを使っておられます。
http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx のコードのrefereeクラスがそれに当たります。refereeクラスには3つのメソッドがありますが、すべてstaticメソッドになっています。
つまり、事実としてstaticメソッドは使うときは使うのです。ちなみにもちろんですが、επιστημη さんがオブジェクト指向を理解していないということはないでしょう。

という訳で、
 ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。
というヒマがあったら自身が思わぬ誤謬をしていないか記事の検証を行うことを勧めます。

2/4追記
 コメント欄で文意を汲み取っていないという指摘を受けましたが、まぁ充分文意を汲み取って反論をしているのですがどうも分かりづらいかもしれないので、補足します。

 ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。

こういう教示的な文章は一見ごもっとなことのように受け取れますが、冷静に読めば分かりますとおり、ど素人でも同様のアドバイスができるでしょう(例を出すとサッカーや野球観戦をしているおっさんが野次っているさまと同じと言えば納得できるでしょうか?)。
社会人としては自分を律したり反省することは歳をとろうが若かろうが、技術者であろうがなかろうが、常に必要でいちいちアマチュアに指摘されることではないです。

そうはいっても100歩譲って、プログラミングに携わるプロが
『(引用先の記事に書かれてるニュアンスでの)自分はstaticおじさんではないか?』
と自問するということはどういうことでしょうか?
つまり、『staticは使えるのか?使えないのか?』という正に私がここで行っている議論をすることです。
そしてまさに

インスタンスメソッドを使う→普通
staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり

こういう意見が20年前はともかく今となっては偏見に基づく誤謬でしかないということを認識することが重要だと言いたいわけです。プロなら気づきましょうということと、素人なら知ったかぶりをするのはやめましょう、という話です。
2016-01-31 | コメント:61件



語学留学6,7,8週目(11/14)

時が流れるのは早いもので8週間が過ぎ去った。で、もう4週間(1セッション)滞在を伸ばすことにした。
という訳で、6,7,8週目のレポートですが、ハロウイン(10/31)やら、クラスメートとサンフランシスコに行ったり、ペイントボールで遊んだりやらで、ブログも書けずじまいで、いい感じに勉強に集中できなかった。
前回まではミュージアムめぐりをしたが今セッションは週末はクラスメートと過ごすことが多かった。かなり年下になるが意外に大丈夫なもんだ(まぁ、仕事モードになって気合を入れると変わってくるかもしれないが)。
さらにどうでも話を続けるとアメリカに来て体重を10Kg落とした(それでも結婚前と比べると7Kgほど多い)。普通にダイエットをした結果だが、なぜか中国人(および台湾人)にモテるようになった。日本人ブランドはまだ健在なのか複数の人から、かっこいいねとか言われて『あー20年前に台湾に住みつけば・・・・』と若干後悔をしてしまった。

 とまぁそんなアホなことを考えているうちに2セッション目のファイナルテストが終了した。GPAは2.9だった。残念ながら3.5は取れなかった。パスはしたがスキップはできなかった。ので残念ながら上級クラスを卒業することはできなくなった(年末には帰らなければならない)。
ただ発音については大分良くなった。先生が「ゆっくりしゃべれ」とアドバイスをくれたがその通りにして乗り切り発音の評価は上がった。

さて、せっかくなので発音についてコメントします。
  • 日本人の発音はアメリカ人には割と通じない。あまりの通じなさに凹むので、意識して治す必要がある(出来れば日本を出発する前に)。
  • 英会話の日本人の先生方は多分、かなり努力して直している。ちなみに同じぐらいを目指す必要がある(それが普通であることを理解する)。
  • 発音記号をマスターする。lとrの違いはもちろん、母音は5種類ではなく、十数種類あることを理解しマスターする(違いが判る男になる)。
  • 音読する時は単語を直接読むのではなく、発音記号を書き出してそれを読む(これは意外に効果的)
  • 自分の声を録音して聞き比べる
  • 最終的には個々の単語の発音を一つずつ丁寧に直していく作業を行う(手間がかかるが仕方がない)
ここまでは自分自身で訓練ができる。あとはネイティブの前で音読をしてコメントを貰えばかなり改善できると思う。
偉そうに書いているが私もまだまだ道半ばです。

 ちなみにファイナルテストの結果があまり良くなかったので詳細を聞いてみた。リスニングが半分ぐらい間違えていた。
ただダイアログの大筋の流れは把握しているし、最近発音を治したせいか割と細かいとこまで聞き取れるようになった(毎度おなじみのNHK RADIO JAPANはほぼ何を言っているか判るようになった)。
ただそれを処理する能力が追いついていないようで、イマイチ細かなニュアンスで勘違いがあるようだ。
次のセッションで直したい気もするがこちらはそのうち改善すると信じて授業と発音をきっちりとこなすようにしたい。
2015-11-16 | コメント:0件
Previous Page | Next Page