なぜ.Netの世界は、静的に型付けされた代替の代わりに魔法の文字列を受け入れるように見えるのですか?


47

だから、私は.Netで働いています。.Netでオープンソースプロジェクトを作成します。それに関する私の最大の問題の1つは、.Netではなく、その周辺のコミュニティとフレームワークに必要なことです。魔法のネーミングスキームと文字列は、すべてを行うための最良の方法として扱われているようです。大胆な発言ですが、見てください:

ASP.Net MVC:

Hello world route:

        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のルーティング構文が実際にルートの処理方法を解決するためにほとんど排他的にリフレクションに依存する理由で私が逃している理由を継承していますか?メソッドまたはプロパティの名前を変更すると突然壊れるのは嫌ですが、そのメソッドまたはプロパティへの参照は存在しないようであり、もちろんコンパイラエラーはありません。なぜマジックストリングの見た目の便利さが「価値がある」と考えられていたのですか?

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


14
私たちのCPUがそれを実行するのに十分な速さだったので、無意味なダイナミズムは大流行しました。
DeadMG

7
どうして?LINQでこのような例を見たことはありません。
DeadMG

6
私の謙虚な推測は、適切に静的に型付けされた代替案は非常に不便であるということです。それは、ほとんどのタイプシステムで実際に多くのテーマになります。「タイプシステムでこれを行いたいのですが、表現力が十分ではありません。」(またはその逆:「型システムでこれをうまく表現しましたが、3倍複雑になりました。))@ GlenH7この投稿が説明するものに近いものでも。例を挙げてください。

2
@Earlzさらに重要なことは、匿名オブジェクトは静的に型付けされることです。魔法の文字列はありません。コンパイラは関係するすべてのものの名前とタイプを知っています。のその他すべての使用のために保存しますvar

1
@Earlzは興味深いですが、ここではラムダ構文が追加の肥大化であると主張できます。私の推測では、彼らはマジックストリング/コンベンションアプローチを採用しました。なぜなら、それは多くの人にとっては「十分に」非常にシンプルであり、常にツールを調整してガイダンス/安全性を与えることができるからです。それは安全性と利便性の間のトレードオフです、私見。動的なViewBagの使用も、この考え方を示唆しています(完全に同意するわけではありません)。
ダニエルB

回答:


31

実際、.NETの世界では、あなたが言及したこれらのこと自体に反論があります。ただし、最初の例では、ルーティングエンジンにデフォルトルートのマッピング規則が与えられています。ルートが動的であるという事実は、静的構成を使用することをほとんど不可能にします。

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

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

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

つまり、歴史的に、.NETは3.5リリースまでオブジェクトグラフの静的走査をサポートしていませんでした。これで、多くの開発者がマジックストリングよりもそれを好むようになり、多くの開発者はtypeOf演算子と同様に機能するsymbolOf演算子など、さらに深いサポートを求めています。


3
XAMLはそのまま冗長です...ジェネリックのサポートを追加すると、さらにそれが可能になります(はい、私はXAML全体が人間のために作られていないことを知っていますArgument)。それに、XAMLは実際のプログラミング言語よりもHTMLに似ていると思います。表示するオブジェクトの種類を気にするべきではなく、表示方法だけを考慮すべきです。
マイケルブラウン

2
ジェネリックは2.0で到着しましたが、3.5(LINQを使用)までは式を取得できませんでした。式はLINQを動かすものであり、コミュニティはその力を活用して実行します。この手法は静的反射
マイケルブラウン

1
静的反射についての良い点。3.5で導入されることを忘れていた
Earlz

2
これは素晴らしい答えであり、私は間違いなくプッシュバックに同意します。タイプミスやバグがある場合、それらは実行時にしかキャッチされないので、これらはすべて疫病のように避けます。また、リファクタリングは非常に異なります。避けないでください!
ロックラン

2
プッシュバックに同意します。T4MVCは、多くの文字列を削除し、それらを厳密に型指定されたコードに置き換えることを目指していることを思い浮かべるプロジェクトです。
Carson63000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.