3

perl や C# などの主流言語による匿名メソッド/関数への最近の動きは、何か重要なことですか、それともオブジェクト指向の原則に違反する奇妙な機能ですか?

最新バージョンの Intel の Thread Building Blocks や Microsoft の PPL や Linq のような最近のライブラリは、そのようなものに依存しているのでしょうか。

現在、Java のような匿名メソッド/関数を拒否している言語は、純粋な OO モデルに固執するという賢明な選択を行っているのでしょうか、それとも基本的なプログラミング機能が欠けているために後れを取っているのでしょうか?

4

8 に答える 8

18

LINQ のような流暢な API と組み合わせたラムダ式の表現力は、純粋な OO 原則の違反と見なされるものをはるかに上回ります。

于 2009-09-18T14:14:57.450 に答える
13

オブジェクト指向は設計哲学であり、石版の一連の戒めではありません。

ラムダ関数は言語のパワー/表現力を何倍も向上させるため、単に「純粋な OO モデルに違反している」という理由だけでラムダ関数を拒否するのは自滅的です。全体的な目標は、OO コードを設計することではなく、優れたソフトウェアを設計することです。

さらに、正しく記述されたラムダ関数自体が「オブジェクト指向モデルに違反している」とは確信が持てません。もっと似ているのはモデルの外です。

于 2009-09-18T14:18:38.967 に答える
3

とにかく、オブジェクト指向原則の固有の違反はありません..私が見ることができるわけではありません...

カプセル化、継承、およびポリモーフィズムが標準的なリストであり、AM は 3 つのいずれとも矛盾しません...それらはメソッドであり、型ではありません...したがって、メソッド デリゲートの完全な .Net 1.1 表現のように、それらはOO の 3 つの原則のいずれかを使用または悪用するように書かれています。

于 2009-09-18T14:20:24.617 に答える
1

C#には常にデリゲートがあります。常にイベント処理がありました。CLR 2.0(およびC#2.0)は、匿名デリゲートの概念を導入して、あらゆるOOテクノロジのデザインパターンで解決できた可能性のあるさまざまなニーズに対応しました。彼らは、関数がこれらのテクノロジーの「ファーストクラスのオブジェクト」であることを公式に発表しました。

私はあえて、C#のようなテクノロジーにおける機能機能とオブジェクト機能の組み合わせが非常に有用になり、両方の世界の利点なしにアプリケーションを作成することを想像するのは困難になっていると言います。

于 2009-09-18T14:31:03.720 に答える
1

Java は原則として「純粋な OO モデルに固執する」ことはありません。Java コミュニティは、言語への機能追加がどのように見えるべきか、または構文をさらに複雑にする価値があるかどうかについて、意見が一致していません。ジェームズ・ゴズリングによると:

クロージャーは、何よりも時間のプレッシャーのために、最初は Java から取り残されていました。Java の初期の頃、クロージャの欠如は非常に苦痛だったので、内部クラスが生まれました。これは、多くの難しい問題を回避しようとする不快な妥協でした。しかし、非常に多くの設計上の問題でよくあることですが、単純化によって実際に問題が解決されることはなく、問題が移動しただけです。

(去年の夏の時点でのJavaコミュニティにおける関数型プログラミングの議論の状態のかなり良い概要である「クロージャーの議論を理解する」から。コンセンサスは今のところそれをパントすることであったようです。)

于 2009-09-18T14:39:17.417 に答える
0

OOの原則にどのように違反しますか?

カプセル化に違反しません。クラスは、どの関数がそのプライベートメンバーにアクセスできるかを完全に制御できます。

継承やポリモーフィズムにも干渉しません。

あなたがJavaプログラマーであり、「オブジェクト指向の原則を「Javaで実装できる」と定義した場合にのみ、オブジェクト指向の原則に違反します。

幸いなことに、Javaの世界以外では、このようなOOPの定義を使用したことはありません。

Javaの哲学は本質的に「壊れた、壊れたバージョンのOOPから始めて、そこにとどまり、追加したり、意味のあるものに進化させたりすることなく、Javaの哲学に違反していると言えます。これは良いことだと思います。仕方"。それは、途切れることなくとどまるに値する哲学ではありません。

しかし、それはOOPの原則に違反していません。

于 2009-09-18T15:08:32.570 に答える
0

コールバックは OO の基本的な部分です。むしろ、単一メソッドのコールバック オブジェクトの一般的なケースを構文的にサポートすることは理にかなっています。それが正確にどのように実装されるかは別の問題です。

于 2009-09-18T14:33:43.717 に答える
0

Pythonには常にそれらがありました。

関数は、非常に狭いインターフェイスと多くの属性を持たないオブジェクトのクラスです。

Python 関数オブジェクトには多数の組み込み属性があり、必要に応じていつでも追加できます。

于 2009-09-18T14:19:12.040 に答える