2012年12月29日土曜日

「オブジェクト指向」≠「オプジェクト指向プログラミング」

今蔓延してる「オブジェクト指向」は厳密には「オプジェクト指向プログラミング」と呼ぶべきもので
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91#.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E6.8C.87.E5.90.91.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.9F.E3.83.B3.E3.82.B0.E3.81.AE.E6.A7.8B.E6.88.90.E8.A6.81.E4.BB.B6

  • カプセル化
  • ポリモーフィズム 多様性?
  • 継承
  • 動的束縛?


本来SmallTalkが謳ってるものは、「メッセージ」の話しかしてないような。※詳しくないです

前述のどれでもない。

前述のそれらは、あくまでJava族やエンタープライズ界隈から始まったことです。UMLだの何だのかんだのも含めて。

昨今の「オプジェクト指向(もどき)言語」の殆どは、Javaを手本にしているため、「オブジェクト指向プログラミング」を至上とするのはしかたがない。しかしそのすべてが必須あるいは究極だとは小生も思いません。

と言うことを、2年もまえの記事

実はオブジェクト指向ってしっくりこないんです!
http://el.jibun.atmarkit.co.jp/minagawa/2010/04/post-ebc4.html
を読んで思いました。

コメントは追いかけたのですが、メゲました。
これって炎上なの?この程度で炎上なの?
罵詈雑言吐いてる奴なんか居ないじゃん。

#それにしてもこのコラムの元タイトルって、「 システムエンジニア 生き残りの極意」だったのね。大きく出たなあ。それを「気分はstatic!」に変えたってことは、釣り職人認定ってことでしょうか。

全般的に、説明が舌足らずですね。コラムの文字数制限があるのでしょうか?

前半のstatic「笑ってしまう」は、変数あるいは多段オブジェクトの初期化位置のことを言ってるような気がする。

ただし、全ての関数をstaticにするのは辞めてほしい。その関数は引数が3個以上、そして関数名が20文字以上になるはず。使いにくいし、読みにくい。非オブジェクト指向で書く功罪はソレです。ここは「カプセル化」してほしい。「隠蔽」ではないです。「集積」です。

ただし、VisualStudioが補完してくれるよ!と言うのはその通りですが、Javaが優れてるよ!とEclipseを使ってる人も言っています。似たり寄ったり。目くそ鼻くそ。言語やプログラミング手法の問題ではない。ツールが凄いだけ。

C#やら.netで仕事をしている人が、マイクロソフトマンセーになるのは仕方がない。これは相容れるものではない。そして、オープンソース寄り(だった)Java界隈と敵対するも仕方がない。

中盤は興味深い。

プログラムの記法から見ると、インスタンス生成って
               クラス名 インスタンス名 =  ・・・
となっていて、型宣言と非常に似ている。データベースにはこのクラスで宣言し、ファイルにはあのクラスで宣言し……なんてことをすると、データベース操作やファイル操作で便利なプロパティやメンバー関数が使える。
「型宣言がコンパイラの仕事」という言語しか使ってない人には間違いにしか見えないと思うけど、
「型宣言」じゃなくて「型オブジェクトの生成」だと思うと実はそうでもない。

new演算子が必要な言語って、実はダサイのですよ。

pythonでは、前者はtype型オブジェクトのcall、後者はtype型オブジェクトの作成。

上の引用の後半もやや意味不明ですが、O/Rマッピングの事を言ってるような気がする。であるとすると、staticオジサンは、オブジェクト指向で仕事をしてることになる。本人その自覚なさそうだけど。

後半のコレは全然解らない

オブジェクトはその種類により特有のクラスでインスタンス宣言が必要であり、クラスで規定されたメンバー関数、プロパティしか使用できない。
  非オブジェクト指向言語で数値型宣言されているものは + (プラス)という記号を使って加算できるが、文字列宣言されているものは加算できない。プラスという記号が一種のメンバー関数の役割を果たしている。
「クラスで規定された」の文脈が解らない。宣言してないプロパティを使うと怒られると言ってる?まあJava族には当たり前の話ですね。それは実は静的オブジェクト指向言語の「制限」なんだけどね。

プラスがメンバー関数だ、という下りは解らない。何度も読んだけど解らない。両者は本質的には別物で「(同じ)役割を果たす」訳がない。プラスはどこまで言っても、「加算演算子」でしかない。
ただし、50代ぐらいのオジサマ達は、わずかな共通点で「一緒」と言っちゃうらしいので、多分彼には見えてる何かがあるのでしょう。でも聞いてるほうは混乱するので、辞めてほしい。

まあ総合すると、staticオジサマは頭はいいのだろうけど、それを言語化する能力が低いのでしょう。学歴も高いらしいし。思考が言語中枢を追い抜いちゃう人は、知人に何人か居るので、それ自体は馬鹿にはしません。※馬鹿にしませんよ。しても何も得がない。小生、高卒だし。高学歴の皆さんと違って護るものが少ないんでね。

Java族の功罪は、「protectedにして、getter/setterで呼ぼうね」これが酷い被害を出してます。それらを聞きかじった連中が、関数の頭にget/setをつけりゃいいと思ってる。

具体的には、ストレージからデータを引っ張って、モデルクラスに入れる場合。getUserDataとかつけちゃう人が多いけど、これらはloadとか言ってほしい。「オブジェクトの中に無いものを、オブジェクトの中に入れる機能だから」

getter/setterは、1対1のものに対して使ってほしい。っていうか1文字違いで逆機能だというネーミングは、仕事プログラミング的には悪です。間違い探しなんてしたくない。