オブジェクト指向はなぜダメなのか?

再び週末になり、Java、Lisp、および C というプログラミング言語の「ビッグ 3」が Hello World Cafe に集まっています。

ウェイターはコーヒーを配達しながら今日の新聞を一枚持ってきました.3人はいくつかの言葉を交換し、C言語で新聞を開き、突然目を輝かせました.「この記事のタイトルはよく書かれています.方向性ひどい!」

(これは有名な Erlang の父である Joe Armstrong によって書かれた古い記事です。)

Javaはびっくりしました、誰かがオブジェクト指向をそのように叱ったのですか?!

彼はすぐにそれをつかみ、しばらくそれを見て、次のように述べました。一緒に縛られてはいけません. !

C言語は、「彼の言ったことは非常に理にかなっています。関数は、ちょうどブラックボックスのように、アルゴリズムを実装します。その入力と出力を理解している限り、その機能を理解することができ、データ構造は単なるステートメントです」と述べました。 、なぜそれらを結びつけるのですか?

「いやいや、くっつけたほうがいいですよ! 例をあげましょう、スタックです。完全なオブジェクトとして扱うと、はるかに便利に使用できます。」

スタック s = 新しい Stack();

s.push(100);

s.push(200);

s.pop();

C 言語に負けてはいけません。「データ構造と関数を分離するのは良いことです。たとえば、Stack というデータ構造を作成し、このデータ構造を操作する関数をいくつか書くことができます。」

プッシュ (スタック、100);

プッシュ (スタック、200);

ポップ(スタック);

ジャバは否定的に言った:「あなたがこのようにどれほど醜いか見てください」

C 言語は、「本質は同じです。あなたは of() です。私は f(o) です。違いは何ですか?」

Lisp も次のように割り込んできました。「そして、私の (fo)」

2

Java は、この 2 人がただいじっているだけだと思って、言葉を失いました。突然、彼の心は動いた。どうしてポリモーフィズムを忘れたのだろう。

Java は次のように述べています。ファイルに記録され、将来どこかであなたのデザインがこのようになるかもしれません。」

640?wx_fmt=png640

C言語:「そうじゃない?ある関数が別の関数を呼んでいる?」

Java は次のように述べています。

C言語「普通じゃないですか!」

Java も次のように述べています。ビジネス ロジックも変更する必要があります。

640

640?wx_fmt=png

C言語:「たしかに!関数呼び出し、片方を変えたらもう片方も変えないといけない」

「これが問題です。コンパイル時/ソースコードの依存関係により、システムを独立したコンポーネントに分割することができなくなります。コンポーネントは独立して開発され、独立して展開されます。一方の変更は他方に影響を与えます。」

C言語は理にかなっていて、「じゃあどうすればいいの?」と。

Java は次のように述べています

640

640?wx_fmt=png

「インターフェイス Writer が変更されない限り、FileWriter や MailWriter などの基になる具体的な実装は、プラグインと同じように自由に変更および置換できるということですよね?」と C 言語は言いました。

「はい、コンパイル時間/ソース コードは依存しませんが、ランタイムは依存します。これが遅延バインディングの利点です。これで、of() と f(o) の本質的な違いが理解できました。」

Lisp は機会を失うことなく中断しました。

Java は微笑んで言った。この安定したものがなければ、抽象化を行うことができなければ、システムを独立して開発および独立して変更できるコンポーネントに分割することはできません。

C 言語は依然として反撃を望んでいますが、ブレークスルーを見つけることができていません。

Lisp は次のように述べています。

C 言語は太ももを平手打ちしました。ファイル。open、read などの標準的なメソッドがあります。さまざまなデバイスに対して、対応するメソッドを呼び出すことができます。それはどのように実現されますか?仮想関数テーブルを介した遅延バインディングでもあります!"

(コード ファーマーである古い Liu は、自分自身をひっくり返しました。注: C 言語のオブジェクト指向実装の詳細については、"

C 言語は満足しています。

Java は次のように述べています。

C言語のうなずき、プログラミングの重要なポイントは、安定したインターフェイスを見つけて抽象化し、このインターフェイス用にプログラムして、各モジュールを個別に変更できるようにすることです。

3

「言うは易く行うは難しです。例を示します。オブジェクト指向の設計を教えてくれませんか?」 Lisp は質問を投げかけました。

動物は肉食動物、草食動物、水生動物、陸生動物に分けられますが、どのように分類して表現すればよいのでしょうか。

Java は次のように述べています。

640

640?wx_fmt=png

Java が罠にはまったのを見て、Lisp はにっこりと笑いました。

「じゃあ、陸生の肉食動物を追加します」 不適切だと思いながらも、ジャバは言った。

640

640?wx_fmt=png

「では、別の水生肉食動物がいた場合はどうなるでしょうか。それとも、新しい概念の「哺乳類」にどのように対処すればよいのでしょうか?」

「ははは、わかりました。需要が増えると、クラスが爆発するだけでなく、奇妙なクラスが出現する可能性があります。これは、オブジェクト指向プログラミングの大きな問題です!」とC言語.

Java は頭を下げてしばらく考えた後、突然、次の文が頭に浮かびました。継承ではなく、最初に組み合わせを使用してください。

コンビネーションの使い方は?問題の見方を変える必要があります。はい、次のようにする必要があります。

640

640?wx_fmt=png

Java は誇らしげに次のように述べています。このコンセプトは、これらのインターフェイス機能を通じて組み合わせることができます。」

Lisp は感謝の気持ちを込めてうなずき、C 言語は Java に感嘆の視線を投げかけました. この男はオブジェクト指向の設計を行うことが多く、彼はまだ 2 つのブラシを持っています. 彼は機能を通じて変更を分離し、各機能を組み合わせることができます. , プラグのように自由に置き換えます.なるほど、これがオブジェクト指向の本質です。

深夜になり、ようやく Java がまとめを作成し、全員が散り散りになった。

「プログラミングとは、変化を発見し、それを切り分けることです。どんな言語でも使えます。オブジェクト指向言語は、ポリモーフィズムを直接利用できる便利さがあります。将来、それをただ否定するだけではだめです」

参考文献:

http://www.cs.otago.ac.nz/staffpriv/ok/Joe-Hates-OO.htm

アジャイル ソフトウェア開発: 原則、パターン、および実践

「きれいな建築」

「オブジェクト指向開発リファレンスマニュアル」

著者について:

、ソフトウェア開発で 15 年以上の経験を持ち、ベストセラーの本「」の著者である元 IBM アーキテクトは、複数のエンタープライズ アプリケーション アーキテクチャの設計と開発を主導してきました。複雑な技術をストーリーで説明すること。

過去の素晴らしいレビュー

640?wx_fmt=jpeg

おすすめ

転載: blog.csdn.net/coderising/article/details/101444370