問題タブ [design-guidelines]
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.
c# - C# でバッキング フィールドを誤って使用しないようにする最善の方法
(Bar) という名前のプロパティを遅延ロードするクラス (Foo) があります。初期化されていないバッキング フィールドを (インテリセンスまたは経験の浅いスタッフによる) 誤った使用から保護するための優先する方法は何ですか?
私は3つのオプションを考えることができます:
バッキング フィールド バーをいじくり回してほしい唯一の場所は、プロパティのセッターとゲッターであることを覚えておいてください。クラスの他の場所では、常に this.Bar を使用する必要があります
アップデート
私は現在、次の Lazy 実装を使用しています(バッキング フィールドを持つすべてのプロパティではなく、遅延読み込み、同期、および通知を必要とする一部のプロパティに対して)。先物もサポートするように拡張できます(後で別のスレッドで評価を強制します)
注私の実装は、外部セットをサポートしているため、読み取り時にロックされます。
また、これはRuby などで克服できる言語の制限だと思います。
この方法で遅延を実装できます。
c# - C# でツリー構造を生成するエレガントで保守可能な方法
私は木を持っています。
単体テストの目的で大きなものを作成したいと思います。私は本当に物をDRYに保ちたいです。
説明のために、私のツリーには次の構造があるとします
エレガントで保守しやすい方法でツリーを作成するにはどうすればよいでしょうか?
このコードは非常に繰り返しが多く、エラーが発生しやすいと思います。
編集
私は最終的にDSLアプローチを行いました:
デモテストはここにあります。
実装はこちらです。
ビルダーと単純な DSL を使用します。
single-responsibility-principle - SRP (単一責任原則) に違反するのはいつですか?
SRP ( PDF版; HTML版) は次のように述べています。
クラスを変更する理由は複数であってはなりません
Outlookのカレンダーイベントウィンドウを見ると、「保存して閉じる」ボタンがあります。
そのため、保存または閉じるのいずれかまたは両方の機能が変更された場合、そのボタンも変更する必要があります。明らかに SRP に違反しています。この機能は、ほとんどのユーザーが予定をカレンダーに保存するときに行うことを期待
しているため
、時間の節約と便利さの両方を実現します。
しかし今、私の質問は、機能を Outlook で使用可能にする必要がある場合以外に、SRP に違反するのはどのような場合ですか?
c# - ブールプロパティに名前を付けるためのFDGとは何ですか?
ブールプロパティに名前を付けるためのフレームワーク設計ガイドラインとは何ですか?ない場合、あなたの推薦は何ですか?
クラスがUser
あり、ユーザーが有効かどうかを指定するプロパティが必要だとします。これらは私が考えることができるオプションです:
- 有効
- 有効
- 有効になっています
- 無効にする
- 無効
- 無効になっています
System.Boolean
また、BLがユーザーをデフォルトで無効にし、明示的に有効にする必要があると言っている場合、のデフォルト値がであると考えて、「有効」バリエーションを優先する必要がありfalse
ますか?
design-patterns - 単一責任原則(SRP)は、どのレベルの抽象化で意味をなさなくなりましたか?
私は同僚からデザインに反対されており、この場合のSRPの適用について誰が正しいかについてコンセンサスがあるかどうか疑問に思っています。
SRPは、主にクラスの責任など、設計の下位レベルの詳細に関連していると思います。抽象化のレベルが上がるにつれて、SRPは依然として適切であると思いますが、単一の責任の定義も必然的に、より高いレベルの抽象化に向かって移動します。
私の特定のケースでは、「fooを処理し、その結果を保存し、それらの結果へのアクセスを提供する」サービスは、「foo処理サブシステム」の単一責任を負っていますが、同僚はこれに同意せず、これを2〜3個の別個のものと見なしています。責任。私の場合、あなたが常に単一の責任を詳細に分解する場合、「銀行」を持つことは「お金を保持し、口座を維持し、住宅ローンを販売する...」ので、SRPの違反です。
c# - 型付きSQLステートメントAPIを作成するための設計ガイドライン?
昨夜、私は新しいプロジェクトを設計しているときに何か興味を持ったので、ここでこの質問をするようになりました。
私のプロジェクトは、データアクセスに従来のADO.Netデータセットを使用するTableGatewayパターンに従うことになっています。データアクセスクラスにプレーンクエリを記述したくありません。そこで、ドメインオブジェクトに基づいて移動中にクエリを生成するオブジェクトとメソッドを公開するパーサーkindaaapiを作成するというアイデアを思いつきました。
後で、このAPIをビジネスオブジェクトに接続して、ビジネスオブジェクトインスタンスに型付きSQLジェネレーターAPIを提供したいと思います。
アイデアや参考資料はありますか?そもそもこれは非常に広いように思われるので、ここであなたの意見を聞くことを余儀なくされています。これを行うことができるものはすでに存在しますか?
user-interface - 非表示または無効にしますか?この例では、一般的に
私は次のコントロールのセットを持っています。
シナリオ1:
最初の3つのラジオボタンの1つを選択し、Enterをクリックすると、フォーカスが[パスポート番号]テキストボックスにジャンプします。ユーザーが[その他]を選択すると、[その他、指定してください]テキストボックスが有効になり、便宜上、そのテキストボックスに画面フォーカス(カーソルが移動)します。
シナリオ2:
[その他を指定]テキストボックスは、ユーザーが[その他のラジオ]ボタンをクリックするまで非表示になります。そうすると、テキストボックスが表示され、カーソルがこのテキストボックスに配置されます。
どのシナリオがより良いアプローチだと思いますか?おそらくあなたは別のバリエーションがありますか?あなたの理由を述べてください。
また、非表示にする方が無効にするよりも優れている、またはその逆の場合について一般的な説明をしていただければ幸いですが、この特定の例にも興味があります。
ありがとう。
Afetrthought:おそらく、2番目の例では、「指定してください」というテキストは、ユーザーが「その他」ラジオボタンを選択した後にのみ表示されます。
internationalization - コード「国際化」
私はさまざまな国でさまざまなプロジェクトに取り組んでおり、次のようにコードが国際化されることがあると述べました。
LargeurEtHauteur () (SetWidthAndHeight、frの場合) Dim _ListaDeObiecte as List(Of Object) (_ObjectList、roの場合) internal void Sohranenie User ov () (SaveUsers、ruの場合) など。
ラテン文字を使用している国では、文字変換の必要がないため、この混合がより顕著になることがあります。
それ以上に、多くの場合、プログラミングの「専門用語」はプロジェクト仕様言語に触発されています。「プロジェクト言語」の用語は、英語で「翻訳可能」でない意味を持つ場合があります。
フランスのチームのように、フランス語の単語を使用するだけのプロジェクトもあります (たとえば、Personne、Vehicule、Projet など)。
その場合、すべてのビジネスオブジェクト名を説明する「辞書」を仕様に個人的に追加し、これらのオブジェクトのみが他の (フランス語) 言語で使用されます。
言う:
Collectif - ensemble des Personnes ;
すべてのアクション (Get、Set、Update、Modify、Load など) は英語です。
「強い」名前をコードで使用できるようになったので、 Add Personne To Collectif。
- 「国際化」へのあなたのアプローチは何ですか?
PS。
「btnAdd É l è ve」または「кпкСтоп」という名前のボタンを使用して、VisualStudio が .NET でプロジェクトをコンパイルおよび実行することに面白がっていました...
android - Androidでデータをメモリとデータベースに同時に保持するためのベストプラクティス
大量のデータ(「顧客」、「製品」、「注文」など)を含むAndroidアプリを設計しており、レコードが必要になるたびにSQLiteにクエリを実行する必要はありません。データベースへのクエリはできるだけ避けたいので、特定のデータを常にメモリに保持することにしました。
私たちの最初のアイデアは、2つの単純なクラスを作成することです。
「MemoryRecord」:基本的にオブジェクトの配列(string、int、double、datetimeなど)、テーブルレコードからのデータ、およびこれらのデータをこれから出し入れするためのすべてのメソッドを含むクラス。配列。
「MemoryTable」:基本的に[Key、MemoryRecord]のマップと、このマップを操作し、データベースにレコードを挿入/更新/削除するためのすべてのメソッドを含むクラス。
これらのクラスは、データベースにあるあらゆる種類のテーブルから派生します。もちろん、上記にリストされていない他の便利な方法もありますが、現時点では重要ではありません。
そのため、アプリを起動するときに、これらのクラスを使用してSQLiteデータベースからメモリにこれらのテーブルをロードし、データを変更する必要があるたびに、メモリを変更してすぐにデータベースに投稿します。
しかし、私たちはあなたからの助け/アドバイスを求めています。そのようなことを実装するために、より単純または効率的な何かを提案できますか?それとも、すでに私たちのためにそれを行っているいくつかの既存のクラスですか?
私はあなたたちが私に見せようとしていることを理解しています、そして私はそれをありがとうございます。
しかし、2000レコードのテーブルがあり、それらのレコードをリストする必要があるとしましょう。それぞれについて、他の30個のテーブル(1000レコードのテーブルと10レコードのテーブル)をクエリして、リストに追加情報を追加する必要があります。これは、「飛行中」です(ご存知のとおり、非常に高速である必要があります)。現時点で)。
ここで、「これらすべての「結合」を使用してメインクエリを作成し、必要なものをすべて1つのステップにまとめるだけです。データベースが適切に設計されている場合など、SQLiteは非常に高速になります...」と言います。
OK、しかしこのクエリは非常に複雑で確実になりますが、SQLiteは非常に高速ですが、「遅すぎる」でしょう(私が確認したように、2〜4秒で、これは私たちにとって許容できる時間ではありません)。
もう1つの複雑な点は、ユーザーの操作に応じて、関連するテーブルが同じではないため、すべてのレコードを「再クエリ」する必要があり、別のテーブルのセットに「再結合」する必要があることです。
したがって、代替手段は、結合なしでメインレコードのみを取得し(これは、ユーザーが何をしたり、望んでいるかに関係なく)、データが必要になるたびに他のテーブルにクエリを実行することです。10レコードしかないテーブルでは、同じレコードを何度もフェッチすることに注意してください。この場合、SQLiteが高速であっても、一種の「メモリキャッシュ」からレコードを取得するよりも、クエリ、カーソル、フェッチなどのコストが常に高くなるため、時間の無駄になります。すべてのデータを常にメモリに保持するのではなく、頻繁にクエリを実行する一部のテーブルだけを保持する予定であることを明確にしておきます。
そして、最初の質問に行き着きました。これらのレコードを「キャッシュ」するための最良の方法は何ですか?「なぜデータをキャッシュする必要があるのか」ではなく、それに焦点を当てて議論するのが本当に好きです。