問題タブ [anti-patterns]
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.
design-patterns - 提案:アンチパターンの反例
この正確な質問は以前に尋ねられたことがないようですので、私は解雇します:
私たちのほとんどは、アンチパターンの概念に精通しています。ただし、アンチパターンの実装を回避すると、原則として、逆方向に大きく振れすぎて、問題自体が発生する可能性があります。例として、「委員会による設計」には、私が「マーベリックによる設計」と呼ぶ反例があります。重要な機能の設計は、レビューを目的として、個人が最もよく考えることを行うために個人に渡されます。彼らの仕事は後で、それを完成させるべきか、それとも別の反復を経るべきかを決定します。チームの他のメンバーが他のことに専念しているため、これには実際にははるかに長い時間がかかり、特にMaverick自体が経験豊富なエンドユーザーでない場合は、誰にも役立たない機能になってしまう可能性があります。
アンチパターンの反例の例は他にありますか?
api - インターフェイスではなく抽象クラスを使用してパラメータ化する場合はありますか?
私は現在、非常にステートフルなコンポーネントベースのAPIを開発しています。トップレベルのコンポーネントは、それぞれ約12のインターフェイスを実装します。
したがって、ストックのトップレベルコンポーネントは、複数のミックスイン実装を含み、複数のミックスインインターフェイスを実装する抽象実装のスタックの上に配置されます。
これまでのところ、とても良いです(私は願っています)。
問題は、基本機能の実装が非常に複雑であるため(5層の基本クラスに1,000行)、コンポーネントライターがインターフェイス自体を実装するのではなく、基本クラス(すべてのボイラーが存在する場所)を拡張することを望んでいることです。プレートコードはすでに書かれています)。
したがって、APIが、コンポーネントライターに拡張してほしい抽象実装への参照ではなくインターフェイスを受け入れる場合、実装者が他のコード領域で必要とされる検証を実行しないリスクがあります。
したがって、私の質問は、APIメソッドが実装するインターフェイスへの参照ではなく、抽象的な実装参照を使用してAPIメソッドをパラメーター化することが有効な場合があるということです。
この手法を使用する適切に設計されたAPIの例がありますか、それとも私は自分自身を悪い習慣に話そうとしていますか?
c++ - いくつかの変更を加えて、例外のアンチパターンを危険にさらす..
特定のマシンで 24 時間年中無休で実行されるライブラリがあるとします。コードがしっかりしていても、遅かれ早かれハードウェア障害によって例外が発生する可能性があります。このようなイベントに備えて、何らかのフェールセーフを配置したいと考えています。1 つのアプローチは、各 API をカプセル化するラッパー関数を作成することです。
次に、ライブラリの呼び出し元がスレッド全体を再起動し、returnCode が正しくない場合はモジュールを再初期化します。
物事はひどくうまくいかない可能性があります。例えば
try ブロック (または libraryAPI1()) が次の場合:
func2() が例外をスローすると、x は決して解放されません。同様に、ファイルの破損も考えられる結果です。
このシナリオで他に何が問題になる可能性があるか教えてください。
anti-patterns - 同じクラスの他のメソッドを呼び出すメソッド
クラス設計では、あるメソッドが同じクラスの別のメソッドを呼び出すのは悪い習慣ですか(たとえば、3つのメソッドが同じクラスの1つのメソッドを呼び出す)。
ありがとう
naming - アルゴリズムのアンチパターンの命名
線形的に解ける場合、二次複雑さで何かを行うことの名前を思い出すのに問題があります。
たとえば、get-by-index
単に a を使用する代わりに関数を使用してリンク リストを反復処理することnext-element
は、このアンチパターンの典型的なケースです。
道路を塗装しているが、ペンキのバケツを持ち運ばず、ブラシを補充する必要があるたびに出発点に戻らなければならない男の比喩として、それは「何かの画家」だったと思います。
乾杯。
php - PHP でのシングルトンの拡張
私は Web アプリ フレームワークで作業しており、その一部は多数のサービスで構成されており、すべてシングルトンとして実装されています。それらはすべて、シングルトンの動作が実装されている Service クラスを拡張し、次のようになります。
さて、次のように実装された FileService というクラスがあるとします。
... FileService::getInstance() を呼び出しても、必要なように FileService インスタンスは生成されませんが、Service インスタンスが生成されます。ここでの問題は、Service コンストラクターで使用される「self」キーワードにあると思います。
ここで私が望むものを達成する他の方法はありますか? シングルトン コードは数行しかありませんが、できる限りコードの冗長性を避けたいと考えています。
c# - variable = null の「オブジェクト破壊」はどこから来たのですか?
さまざまなバージョンの .NET で記述された多くのレガシー システムに取り組んでいて、さまざまな企業にまたがって、次のパターンの例を見つけ続けています。
.NET でメモリ管理がどのように機能するかを知っている人にとって、この種のコードは非常に不要です。null
ガベージ コレクターは、古いオブジェクトを収集できることを伝えるために手動で割り当てる必要はありません。割り当てnull
によって、オブジェクトをすぐに収集するように GC に指示することもありません。
このパターンは単なるノイズであり、コードが何を達成しようとしているのかを理解するのが難しくなります。
では、なぜ私はこのパターンを見つけ続けるのでしょうか? この習慣を教えている学校はありますか?null
メモリを正しく管理するために、ローカル スコープの変数に値を割り当てる必要がある言語はありますか? null
私が認識していない明示的な割り当てに追加の価値はありますか?
xml - これはハードコーディングですか?どうすればそれを回避できますか?
特定のXML構造のパーサーを作成していますが、ハードコーディングの問題が発生している可能性があります。ここ:
リテラルの「デフォルト」はXml構造の有効なタグですが、これはハードコーディングですか?別の手法を使用してデフォルトタグを検索できますか?
Doctypeの使用を検討しましたが、デフォルト値のタグが「default」よりも指定するにはどうすればよいですか?
このタグが私の標準であるため、ハードコーディングされていない可能性があります。
ご協力ありがとうございました。
.net - カスタム イベントの作成 - Object Sender または Typed Sender?
アーカイブを検索したところ、送信者とは何か、パターンを使用する理由について多くの質問が見つかりましたが、カスタム イベントと送信者のタイプについては何も見当たりませんでした。
Subscription というカスタム クラスを作成していて、ISubscription を実装していて、SubscriptionEventArgs というイベント引数がいくつかあるとします。サブスクリプションに Changed というイベントがあった場合、イベント シグネチャ Changed(ISubscription sender, SubscriptionEventArgs e) の何が問題になっていますか?
質問を推進するのに役立つ小さなコード:
「EventHandler」の代わりにアクションを使用することを軽蔑する場合は、カスタムの汎用「EventHandler」を使用して同じことを行うことができます。
Hans のサンプル イベント ハンドラーのリクエストに応じて:
リスト内のサブスクリプションの検索は些細なことのように思えるかもしれませんが、非常に大きなデータ セットを扱っていて、新しいボリュームのデータがリアルタイム ストリームを通じてアプリケーションに送られてくる場合はどうなるでしょうか。停止してリストから参照を取得したり、キャストの手順を実行したりするコストは意味がありません。彼らはその問題を解決するために 2.0 でジェネリックを提供してくれたので、ジェネリック イベント ハンドラーも取得しなかった理由がわかりません。これにより、ジェネリック イベント ハンドラーの何が問題なのか疑問に思いました。