私は彼が言うジョエルの記事の一つを読んだ:
一般的に、私は物事を隠す言語機能が少し怖いことを認めなければなりません。コードが表示されたら
i = j * 5;
…Cでは、少なくとも、jに5が乗算され、結果がiに格納されていることがわかります。
しかし、C ++で同じコードスニペットを見ると、何もわかりません。なし。C ++で実際に何が起こっているのかを知る唯一の方法は、iとjの型を調べることです。これは、jが
operator*
オーバーロードされた型であり、乗算しようとするとひどく機知に富んだ動作をするためです。
(エンファシス鉱山。)物事を隠す言語機能が怖い?どうしてそれが怖いの?物事を隠すこと(抽象化とも呼ばれます)は、オブジェクト指向プログラミングの重要なアイデアの1つではありませんか?methodを呼び出すたびにa.foo(b)
、それが何をするのかまったくわかりません。あなたは他のどこかで宣言されるかもしれないタイプa
とb
は何かを見つけなければなりません。それでは、オブジェクト指向プログラミングはプログラマからあまりにも多くのことを隠してしまうので、オブジェクト指向プログラミングを廃止すべきでしょうか?
そして、演算子のオーバーロードをサポートしていない言語で記述する必要があるかもしれないとはどうj * 5
違いj.multiply(5)
ますか?繰り返しになりますが、loとbeholdは、非常に機知に富んだ何かを行うメソッドを持つ型である可能性があるためj
、multiply
メソッドの型とピークをメソッド内で調べる必要があります。j
multiply
「ムアハハ、私はメソッドmultiply
に名前を付ける邪悪なプログラマーですが、実際にそれが行うことは完全に曖昧で直感的ではなく、物事を増やすこととはまったく関係ありません。」それはプログラミング言語を設計するときに考慮しなければならないシナリオですか?次に、誤解を招く可能性があるという理由で、プログラミング言語の識別子を放棄する必要があります!
メソッドが何をするのか知りたい場合は、ドキュメントを見るか、実装の内部を覗いてください。演算子のオーバーロードは単なる構文上のシュガーであり、それがゲームをどのように変えるかはわかりません。
教えてください