問題タブ [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 アクション URL
私はこの構文を見たことがあると確信しています
または、マジック ストリングを使用せずに ASP.net MVC でアクション URL を生成する方法として、それに似たものを使用します。ただし、その Action オーバーロードが見つかりません。ASP.NET MVC 1.0 を使用しています。それはどこにある?
c# - マジックストリングなしで画面を切り離す
私のWPFプロジェクトは次のように構成されます。
Screen1
からを表示するには、次のScreen2
ようなものを使用します。これは、ViewとViewModelの名前空間でScreenManager.Show("Group1.Screen1")
(リフレクションを使用して)表示され、それらをインスタンス化します。Screens.Group1.Screen1
Screen1
結合せずにマジックストリングを削除するにはどうすればよいですか(クラスで名前空間を使用しScreen2
たくない)。また、ある種の画面検出(オートコンプリート/インテリセンス)が欲しいです Screen2
Screen1
ScreenManager.Show
または、へのすべての呼び出しが有効であることを確認するための何らかの方法(自動テスト) 。
更新: 私はこれを思いついた:
使用法:
理想的ではありませんが、DRYに違反することはマジックストリングよりも優れていると思います。そして、すべての呼び出しが有効であることを(リフレクションを使用して)自動的にテストできます。
c# - フィールドを識別する「エレガントな」方法は?
私は、プログラマー アプリケーションの根底にあり、特定のデータへのアクセスを検出する必要があるシステムを作成しています。私はほとんどの場合、次のようにプロパティを使用してこれを行うことができます。
次に、アクセスを適切に処理できるようにアクセサーget
とアクセサーを微調整します。set
ただし、これには、ユーザー (アプリケーション プログラマー) がすべてのデータをプロパティとして定義する必要があります。
ユーザーが (プロパティではなく) 「通常の」フィールドを持つ既存のクラスを使用したい場合、それらのアクセスを検出できません。例:
へのアクセスを検出できませんy
。ただし、既存のクラスの使用を許可したいと考えています。妥協点として、そのようなデータへのアクセスが発生するたびに、ユーザーは私に通知する責任があります。例えば:
そんな感じ。信じてください、私はこれを非常に徹底的に調査しましたが、アクセスを検出するためにバイトコードを直接分析することでさえ、間接的な可能性などのために信頼できません.私は本当にユーザーに私に通知してもらう必要があります.
そして今、私の質問: これらの通知を実行するための「エレガントな」方法をお勧めできますか? (はい、私はこの状況全体がそもそも「エレガント」ではないことを知っています;私はそれを悪化させないようにしています;))。どのようにしますか?
実際の状況は次のようなものであるため、これは私にとって問題です:私は次のクラスを持っています:
ユーザーがこれを行いたい場合:
代わりに、次のようにする必要があります。
WhereWrite
は のクローンを返します。これは、とにかくアクセサに実行してnotSoNice
ほしかったことです。set
ただし、文字列を使用するのはかなり醜いです。後でフィールドをリファクタリングする場合、Write("notSoNice")
アクセスを調べて文字列を変更する必要があります。
どのようにフィールドを識別できますか? 文字列、整数、列挙型 (つまり、整数) しか考えられません。しかし:
- 文字列の問題についてはすでに説明しました。
- イントは苦痛です。ユーザーはどの int がどのフィールドに対応するかを覚えておく必要があるため、さらに悪いことになります。リファクタリングも同様に困難です。
- 列挙型 ( や など
NOT_SO_NICE
、Z
つまり のフィールドSemiNiceClass
) はリファクタリングを容易にしますが、ユーザーはクラスごとに列挙型 (SemiNiceClass
など) を、クラスのフィールドごとに値を記述する必要があります。気に障る。彼らに嫌われたくないです;)
では、なぜ私たちはこれを行うことができないのでしょうか?
どのフィールドがアクセスされているかを知る必要がありsemiNice.notSoNice
、フィールドを識別しないためです。フィールド自体ではなく、フィールドの値です。
はぁ。私はこれが醜いことを知っています。私を信じてください ;)
提案をいただければ幸いです。
前もって感謝します!
(また、この質問に対する適切なタグが思いつきませんでした。より良いアイデアがあればお知らせください。編集します)
編集 #1: Hightechrider の提案: 式。
Write(x =>semiNice.y, 0)
質問のために書いたクラス ( など) に基づいているSemiNiceClass
のか、それとも単なる例なのかはわかりませんが、前者の場合は構造と一致しません: にy
フィールドがありませんSemiNiceClass
。ということWrite(x =>semiNice.notSoNice.y, 0)
ですか?
これをどのように使用するつもりなのかわかりません...私が書いたコードを投稿します:
でその情報を取得するにはどうすればよいWrite
ですか? からその情報を抽出する方法が見つかりませんFunc<,>
。また、何にも使用していないのに、なぜsemiNice.Write(x => semiNice.notSoNice.y, 50);
の代わりに書くのですか?semiNice.Write(() => semiNice.notSoNice.y, 50);
x
ありがとう。
編集 #2: Hans Passant の提案: フィールドをプロパティに置き換えます。
これは私が最初に意図したことですが、再コンパイルはオプションではありません。
編集 #3 : Ben Hoffstein の提案: 動的プロキシ。リンフー。
私はすでにこれを長く懸命に調べてきましたが、比較的複雑な理由で使用できません。説明するには長くなりすぎますが、安心してください。それは私の現在のソリューションよりもはるかにきれいです。
.net - .Net - 魔法の文字列を避けるための戦略
作業中のコードでは、次のコード スニペットのようにマジック ストリングが多く使用されています。
そのため、ユーザーが特定の権限を持っているかどうかを確認するために、パラメーターとして文字列を渡す場所がたくさんあります。それは多くの魔法の文字列を生成するので、私はそれが好きではありません.
それを行うより良い方法は何ですか?
列挙型、定数、クラス ?
c# - ラムダ式を使用して「魔法の文字列」を使用してプロパティを指定することを避ける
特定の型のオブジェクトのコレクションを取得し、そのプリミティブ型、文字列型、および DateTime 型をCSV Formatの文字列に出力するサービスを作成しています。以下のステートメントの両方が機能しています。ラムダベースのバージョンの方がずっときれいだと思います。
魔法のひものバージョン
vs. Lambda バージョン
Jon Skeet の推奨に従って、すべてのラムダ メソッドは同様のメソッド シグネチャを共有します。
expression.Body
次に、をに渡しFindMemberExpression
ます。nhlambdaextensions プロジェクトFindMemberExpression
の ExpressionProcessor.cs のメソッドからコードを採用しました。私の非常によく似たバージョンは以下のとおりです。FindMemberExpression
で十分なケースをテストしていFindMemberExpression
ますか? 私のユースケースを考えると、私がやっていることはやり過ぎですか?
c# - QueryOver (またはおそらく Fluent NHibernate) から魔法の文字列を取得しますか?
FluentNHibernate、新しい QueryOver API、および新しい Linq プロバイダーを使用する多くの理由の 1 つは、「マジック ストリング」、つまりコンパイル時に表現できるプロパティやその他のものを表す文字列を排除するためです。
悲しいことに、NHibernate の空間拡張を使用していますが、これはまだ QueryOver または LINQ をサポートするようにアップグレードされていません。その結果、QueryOver Lambda 式と文字列の組み合わせを使用して、クエリを実行するプロパティなどを表す必要があります。
私がやりたいことはこれです - Fluent NHibernate (またはおそらく NHibernate QueryOver API) に、魔法の文字列が「あるべき」ものを尋ねる方法が必要です。疑似コードの例を次に示します。
現在、私は書くだろう -
書きたいことは――
このような利用可能なものはありますか?書くのは難しいでしょうか?
編集:これは、空間以外にも適用されることに注意したかっただけです。実際には、QueryOver または LINQ に変換されていないものはすべてメリットがあります。
asp.net-mvc - カスタム モデル バインダーからマジック ストリングを削除するにはどうすればよいですか?
私は今、いくつかのカスタム モデル バインダーを作成しましたが、魔法の文字列に依存するという罠に陥っていることに気付きました。
式を使用して接頭辞名を厳密に入力できるようにしたいのですが、方法がわかりません。助けていただければ幸いです。
ありがとう。
.net-4.0 - Entity FrameworkのInclude()でマジックストリングを回避するための組み込みの方法はありますか?
さて、Includeを使用して関連オブジェクトをロードするように指示するエンティティフレームワーククエリがあります。
var employees = _entities.Employees.Include("Manager").ToList()
includeを使用することで、すべての従業員のマネージャーレコードに対してクエリを生成することを回避します(代わりに、クエリでフレンドリーなJOINが使用され、データベースが再び煩わされることはありません)。
しかし、マジックストリング「Manager」の使用は、特に、おそらくより原始的で、迅速で汚いLinq2SQLから来た後は、不安になります。コーディングの観点からは、それはロードされた銃のようなものであり、コンパイル時にキャッチされるべきであったランタイム例外をスローする準備ができています。また、リファクタリングに大きなダンパーをかけます。
これを回避するための組み込みのプロパティまたはメソッドはありますか?たとえばManager.EntityKeyPropertyName
、静的な文字列プロパティとして表示されますが、これは私が望んでいるものではないようです。ハードコードされた定数のリストを手動でどこかに追加したくないのですが、裸のインテリセンスブラインドマジックストリングよりも優れています。
flash - ActionScript 3オブジェクトのプロパティ名を文字列に変換しますか?
これらのマジックストリングの使用を排除したい:
また
次のように入力するだけでよいでしょう。
これにより、リファクタリングが容易になり、プロパティ名が変更されたときのランタイムエラーがなくなります。
何か案は?
magic-numbers - 「単純な」魔法の値を処理するには?
これはかなり言語に依存しないと思いますが、間違っている場合は C# (または C または C++) を使用してください。
「単純な」魔法の値とは、次のようなことを意味します。
また
また
これ(上記の疑似コード)を書いているときに、実際には0と比較されるものにのみ適用されることにちょっと驚かされました。
とにかく、これらの種類の魔法の値を処理する最良の方法は何ですか (読みやすさ、作成するキーストローク/コードの量と名前を考慮して)?
これ専用の (静的) クラス全体 (または C# では列挙型) を持つことは、非常にやり過ぎのように感じます。