web-dev-qa-db-ja.com

.NETの世界で、静的に型指定された代替手段ではなく、マジックストリングが採用されているのはなぜですか?

だから、私は.Netで働いています。 .Netでオープンソースプロジェクトを作成しています。私の最大の問題の1つは、.Netではなく、コミュニティとその周りのフレームワークに関するものです。魔法のような名前の付け方や文字列は、すべてを行うための最良の方法として扱われているようです。大胆な声明、しかしそれを見てください:

ASP.Net MVC:

こんにちは世界のルート:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

これは、ASP.Net MVCがコード内でHomeControllerを何らかの方法で検索することを意味します。どういうわけか、それの新しいインスタンスを作成し、関数Indexを何らかのidパラメータを付けて呼び出します。そして、他のようなものがあります:

RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";

そして、XAMLでも同様のことが行われます。 DataContextはオブジェクトとして扱われ、希望のタイプに解決されることを願って祈る必要があります。 DependencyPropertiesは、マジックストリングとマジック命名規則を使用する必要があります。そして、このようなもの:

  MyData myDataObject = new MyData(DateTime.Now);      
  Binding myBinding = new Binding("MyDataProperty");
  myBinding.Source = myDataObject;

それはキャストとさまざまな魔法のランタイムサポートに依存していますが。

とにかく、私はここですべてを終わらせると言います:.NETの世界ではなぜこれがそれほど容認されるのですか?静的型付け言語を使用して、ほとんどの場合、型が何であるかを知っているのではないでしょうか。なぜ、リフレクションとタイプ/メソッド/プロパティ/名前(文字列として)がジェネリックやデリゲートやコード生成に比べて非常に好まれているのですか?

ASP.Netのルーティング構文がほとんど排他的にリフレクションに依存して実際にルートの処理方法を解決する理由が欠けている継承の理由はありますか?メソッドやプロパティの名前を変更していきなり何かが壊れるのは嫌ですが、そのメソッドやプロパティへの参照はなく、コンパイラエラーもありません。マジックストリングの明らかな利便性が「価値がある」と見なされたのはなぜですか。

静的に型付けされた代替物がいくつかあることも知っていますが、それらは通常、後部座席を取り、チュートリアルやその他の初心者向け資料には含まれていないようです。

47
Earlz

実際、.NETの世界には、あなたが述べたまさにこれらのことに対する反発があります。ただし、最初の例では、ルーティングエンジンにデフォルトルートをマッピングするための規則が与えられています。ルートが動的であるため、静的構成を使用することはほぼ不可能です。

また、XAML/WPFについても触れています。どちらもジェネリックが.NETに導入されるかなり前に開発中であり、ジェネリックのサポートに戻ると、すでに非常に遅い製品(Longhorn/Vista)がさらに遅れることになります。

ASP.NET MVCフレームワークには、マジックストリングの代わりにラムダ式を使用する例があり、Entity Framework/LINQは、静的オブジェクトグラフ上でSQLクエリを構成するためのネイティブサポートを言語とフレームワークが提供する(さらに、魔法のSQL文字列、クエリのコンパイル時の検証を取得します)。

静的構成の他の例については、構造マップやその他の最新の依存関係注入コンテナー、および実行時にオブジェクトグラフを検査する必要があるが、開発者がラムダ式を使用してヒントを静的に提供できる他のフレームワークを参照してください。

つまり、歴史的に、.NETは3.5リリースまでオブジェクトグラフの静的トラバーサルをサポートしていなかったということです。これができたので、多くの開発者は魔法の文字列よりもそれを好み、typeOf演算子と同様に機能するsymbolOf演算子などのより深いサポートを強く求めています。

30
Michael Brown

Asp.Net MVCは、DjangoおよびRails動的型付け言語に由来する)のようなフレームワークに強く触発されています。そのため、多くのパターンと規則を採用しています。たとえば、リフレクションオブジェクトやdynamicオブジェクトを多用するなど、.netカルチャの通常よりも動的です。これは、.netがこれらと比較してWeb開発者間のマインドシェアを失っていたため、おそらくMSによる意図的な戦略的決定でした。プラットフォーム。

0
JacquesB