問題タブ [magic-string]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc - ASP.NET MVC のマジック ストリング
私はデスクトップ ソフトウェア開発の経験があり、ASP.NET MVC の学習を始めています。
デフォルトの HomeController には、次のようなコードを持つ Index アクションがあります。
つまり、ユーザーを「/account/login」にリダイレクトします。AccountController.Login アクションはユーザーを処理し、ユーザーが正常にログインすると、ユーザーを HomeController に送り返します。
このコードは、私がデスクトップ ソフトウェアで別の方法で行うことに慣れているためか、匂いがします。Login アクションの名前を「LogOn」に変更するとどうなりますか? AccountController を完全に削除して別のものに置き換えるとどうなりますか? 新しいバグを導入しますが、コンパイラ エラーは発生しません。また、単体テストでもそれをキャッチできない可能性があります。コントローラーとアクションの名前を指定するために文字列を使用したため、リファクタリングと再設計により、コード全体が壊れる可能性が高くなります。
私が欲しいのは次のようなものです:
ただし、それが可能かどうか、またはそれが最善の方法であるかどうかはわかりません。
私は愚かですか、それとも他の人も同じ問題を抱えていますか? それを回避するために何をしますか?
php - マジック ストリングを回避するにはどうすればよいですか (PHP MVC フレームワーク)
MVC フレームワークを PHP と一緒に使用して、コードとプレゼンテーションを適切に分離したいと考えています。私は現在、CakePHPを見始めています。素敵に見えますが、これらすべての魔法の糸はどうですか?
以下のコードを見てください (CakePHP クックブックから引用):
あの魔法の糸が気になる。コード内の文字列は、出力されるテキストのみであるべきです!
「Recipe.created DESC」に 1 つのスペルミスがあり、期待どおりに機能しません。ここで役立つインテリセンス/コード補完はありません!
また、「レシピ」を別のものに変更したい場合はどうすればよいですか?すべてのコードを手動で検索し、それが通常のテキストなのかマジック ストリングの 1 つなのかを調べる必要があります。
他の PHP MVC フレームワークは優れていますか? (読む: 魔法の糸が少ないかまったくない)
魔法の文字列を回避する方法に関するリンクはありますか (少なくとも可能な限り)...?
c# - C#でのコンパイル時の反映
プロパティ名を表現するためにマジックストリングを使用する必要があるC#コードを頻繁に記述します。誰もがマジックストリングの問題を知っています。それらはリファクタリングが非常に難しく、コンパイル時のチェックがなく、多くの場合、診断が難しい問題につながります。それでも、C#/。NETは、プロパティ/クラス/メソッド名を表すために、あらゆる場所でそれらを使用します。
この問題は何年にもわたって続いており、現在実行可能な唯一の解決策は、実行時にプロパティ名を解析する式ツリーを使用することです。これにより、コンパイル時のチェックを十分に行うことができますが、コードが複雑になり(Expression型のパラメーターが必要)、実行時のコストが発生します。
この広範な問題を克服するためにコンパイル時の反映を追加するためにC#/。NETの機能に関する考慮事項があったかどうかを誰かが知っていますか?
簡単に追加できるようで、重大な変更ではなく、多くの開発者に大きなメリットがあります。typeof()演算子は、コンパイル時のリフレクションの形式をすでに実行しているため、演算子nameof()(または同様のもの)は非常に補完的であるように思われます。
さらに、そのような機能の潜在的な問題を知っている人はいますか?
助けてくれてありがとう。
c# - How can I control the attempted value for a custom model binder?
I've got an action with a signature like this:
Which is implemented like this:
Basically, i'm binding a raw value to an enum, pretty simple. Works fine.
But, notice how in order to get access to the attempted value, i need to use a magic string ("myEnum").
Is there any way i can supply this to the model binder, so remove the magic string?
Because if i want to use this model binder in other places, then i have to make sure i call the parameter "myEnum", otherwise it will cause a runtime error.
I tried adding a ctor to the model binder, but there's nowhere where i actually instantiate it.
Any ideas?
language-agnostic - 魔法の糸はできるだけ避けるべきですか?
次のコードがあります。
AD の解析を行っているため、"DC="、"objectCategory="、"LDAP://"、","、"." などの文字列がいくつかあります。まだまだ。上記のコードは、以下のコードよりも読みやすいことがわかりました:(反対のコードを見つけたかもしれません。お知らせください。)
「DC」と「DC=」があるかもしれませんが、この変数の名前を考えるか、これらを2つに分割する必要があります:(。それから私の質問: 魔法の文字列をできるだけ避けるべきですか?
更新。
いくつかの結論:
- 文字列をまったく使用しないようにする方法はいくつかありますが、その方がよい場合があります。それを達成するには、静的クラス、列挙子、数値定数、IOC コンテナー、さらにはリフレクションを使用できます。
- 定数文字列は、タイプミスがないことを確認するのに役立ちます (文字列へのすべての参照で)。
- 句読点の定数文字列には、グローバル セマンティックはありません。これらを","のまま使用すると読みやすくなります。「、」を「。」に変更するなど、その定数が将来変更される可能性がある場合は、この場合に定数を使用することを検討してください。(リシャーパーとしての最新のツールは定数や変数を必要とせずにこれを行いますが、定数を使用するとそのリファクタリングに役立つ場合があります)。
- 文字列を一度だけ使用する場合は、定数にする必要はありません。ただし、定数を文書化して、ドキュメントに (Javadocs として) 表示できることを考慮してください。これは、重要な文字列値にとって重要な場合があります。
asp.net-mvc - T4MVC for Web.config
T4MVCの良いところは、リテラル/マジックストリングを取り除くことができることです。
T4MVCは、ASP.NET MVCアプリ用のT4テンプレートであり、コントローラー、アクション、およびビューを参照するときにリテラル文字列の使用を排除する、強く型付けされたヘルパーを作成します。
Web.config
ファイル内のアプリ設定に関して、同様のことが可能かどうか疑問に思っています。
したがって、これの代わりに:
次のようなものがあります。
また
これは、コンパイル時にアプリの設定がまだ存在するかどうかを確認するのに役立ち、ランタイムエラーを回避できます。
これは実行可能でさえありますか?はいの場合、これに似たものがすでにどこかに実装されているかどうか知っていますか?
events - bbvEventBroker 強く型付けされ、マジック ストリングなし
Ninject で bbvEventBroker を使用したいのですが、パブリッシャーとサブスクライバーを接続するためのマジック ストリングの使用が心配です。魔法の文字列なしでそれを行う強く型付けされた方法はありますか。中央の静的マジック ストリング リポジトリが必要ですか?
websocket - WebSocketプロトコルでの「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」の意味
RFC6455の「258EAFA5-E914-47DA- 95CA -C5AB0DC85B11」の意味がわかりません。サーバーがこのマジックストリングを必要とするのはなぜですか?そして、なぜWebSocketプロトコルにこのメカニズムが必要なのですか?
asp.net-mvc - MVCビューで「マジックストリング」を処理する方法(例:要素id:s?)
私のMVCビューでは、JavaScriptのさまざまな要素を頻繁に参照する必要があります。そのために、これらの要素のid属性を定義します。これは多くの場合、さまざまなコンテナ要素のコンテンツを更新するAjax呼び出しと関連しています。
短い例(かみそり):
これには、「PersonList」、「PersonDetails」、「CurrentPersonId」の3つの「マジックストリング」が含まれています。Ajax呼び出しは次のようになります。
ここでも、マジックストリング「PersonDetails」が表示されます。
良くない!
これらの魔法の文字列を1つの場所で定義し、1)ビュー、2)できればAjax呼び出しなどを実装する静的JavaScriptファイル、および3)CSSファイルで使用するための「ベストプラクティス」を提案できますか?
おそらく_Layout.cshtmlには、そのコントローラーまたは特定のアクションの魔法の文字列を定義する部分的なビューが含まれている可能性があると思います。それは、どのコントローラーおよび/またはアクションがそれを呼び出したかを調べ、それに基づいて適切な部分ビューを呼び出します。私はすでに.cssとstatic.jsに対して同様のことを行っており、Person.cssを追加するだけで、Personコントローラーのすべてのビューに自動的に含まれるようになります。
部分ビューは次のようになります。
これにより、RazorコードはC#文字列constsを使用して適切なHTMLを生成でき、静的JavaScriptファイルはjQueryセレクターなどでNamesAndIdsを参照できます(部分ビューで定義されたconstsが呼び出し元のビューで使用可能であると想定していますが、これは疑わしいです(まだチェックしていません)...わからない.cssファイルでそれらを使用する方法。
より良い提案はありますか?この問題をどのように処理しますか?
c# - 配列内の基本クラスの実装を識別します
次の問題があります。モデルを自動的に (イベントをリッスンして) 制御する一連のエンジンがあります。次の図は、一般的なクラス図を示しています。
現在、EngineFacade を認識しているクライアントがあり、クライアントから Engine2 からプロパティ Active を設定したいのですが、クライアントも EngineFacade も 3 つのエンジンのどれが Engine2 であるかを認識していません。
2つの方法がありますが、私はそれらのどれも好きではありません:
- エンジンの 1 つがタイプ Engine2 であるかどうかを確認します。同じタスクを実行するが別の名前の別のクラスがある場合は、EngineBuilder と EngineFacade でそれを変更する必要があります。
- 識別子文字列で確認してください - 私は魔法の文字列があまり好きではありません。
クライアント サイトで私が知っていることは、グリッドを処理するエンジンがある、またはあるべきだということです。しかし、私はもっと知りません。
たぶん、私は 2 人の悪魔のどちらかを選ばなければならないかもしれませんが、どちらかがより良い解決策を持っているかもしれません。