問題タブ [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 - このアンチパターン/コードの臭いの名前はありますか?
私はこのアプローチを支持していませんが、最近それを見て、有罪の当事者を指すために使用できる名前があるかどうか疑問に思いました。だからここに行きます。
これでメソッドができたので、値を返したいと思います。また、エラーコードを返したいと思います。もちろん、例外の方がはるかに良い選択ですが、何らかの理由で代わりにエラーコードが必要です。ここで悪魔の代弁者を演じていることを忘れないでください。したがって、次のようなジェネリッククラスを作成します。
そして、次のように関数を宣言します。
このパターンのバリエーションの1つは、文字列の代わりにエラーコードに列挙型を使用することです。さて、私の質問に戻りましょう。これには名前がありますか?もしそうなら、それは何ですか?
if-statement - Arrow Anti-Pattern のリファクタリングのアイデアが必要
モンスターを受け継いだ。
これは、.NET 1.1 アプリケーションが Healthcare Claim Payment (ANSI 835) 標準に準拠するテキスト ファイルを処理するように見せかけていますが、怪物です。処理される情報は、医療請求、EOB、および償還に関連しています。これらのファイルは、最初の数桁に識別子を持つレコードと、そのタイプのレコードの仕様に従ってフォーマットされたデータ フィールドで構成されます。一部のレコード ID は、特定のタイプのトランザクションに関連するレコードのグループを区切る制御セグメント ID です。
ファイルを処理するために、私の小さな怪物は最初のレコードを読み取り、これから行われるトランザクションの種類を判断し、現在処理しているトランザクションの種類に基づいて他のレコードの処理を開始します。これを行うには、ネストされた if を使用します。多数のレコード タイプがあるため、いくつかの決定を下す必要があります。各決定には、いくつかの処理と、以前の決定に基づいて行う必要がある 2 ~ 3 のその他の決定が含まれます。つまり、ネストされた if には多くのネストがあります。そこに私の問題があります。
この入れ子になった if の長さは 715 行です。はい、そうです。七百五十行。私はコード分析の専門家ではないので、フリーウェアの分析ツールをいくつかダウンロードし、McCabe の Cyclomatic Complexity 評価で 49 という結果になりました。彼らは、これはかなり高い数値だと言っています。100 が高い基準であるアトランタ地域の花粉数のように高く、ニュースは「今日の花粉数は 1,523 です」と言っています。これは、私が今までに見た中で最高の矢印アンチパターンの例の 1 つです。インデントは最大で 15 タブの深さになります。
私の質問は、そのようなものをリファクタリングまたは再構築するためにどのような方法を提案しますか?
アイデアを探すのにしばらく時間を費やしましたが、良い足がかりが得られませんでした。たとえば、レベルをガード条件に置き換えることも方法の 1 つです。私はそれらのうちの1つだけを持っています。巣が 1 つ落ちて、残りは 14 です。
参考になるデザインパターンがあるかもしれません。コマンド チェーンはこれにアプローチする方法でしょうか? .NET 1.1 のままにしておく必要があることに注意してください。
ありとあらゆるアイデアをありがとう。
terminology - スパゲッティコードとは?
実際のやり過ぎたスパゲッティ コードの短い例を投稿していただけますか? デバッガーの悪夢を少し見せてもらえますか?
IOCCCコードのことではありません。それは SF です。私はあなたに起こった実際の例を意味します...
アップデート
焦点は、「スパゲッティ コードを投稿する」から「スパゲッティ コードとは正確には何ですか?」に変わりました。歴史的な観点から、現在の選択肢は次のように思われます。
- 計算された goto を大量に使用する古い Fortran コード
- ALTER ステートメントを使用する古い COBOL コード
java - Struts ActionForm のプロパティはどの型にする必要がありますか?
Struts 1.2.4 を使用して、この巨大なレガシー Java Web アプリを継承しました。ActionForms に関して具体的な質問があります。それらのいくつかは文字列プロパティのみ (数値の場合でも) を持ち、一部は一見適切な型 (整数、日付、文字列など) を使用します。ここでのベストプラクティスは何ですか?
また、プロパティが Integer 型で、ユーザーが入力した値が整数値でない場合、Struts は黙ってこれを飲み込み、プロパティを設定しないようです。これどうしたの?
java - 巨大な Struts アクションにどう対処するか?
Struts 1.2.4 を使用して、この巨大なレガシー Java Web アプリを継承しました。アクションに関して具体的な質問があります。ほとんどのページにはアクションが 1 つだけあり、processExecute() メソッドは恐ろしい怪物です (非常に長く、要求パラメーターに基づいてネストされた多数の if ステートメント)。
アクションがコマンド パターンの実装であることを考えると、これらのアクションをユーザー ジェスチャごとに 1 つのアクションに分割することを考えています。ただし、これは大規模なリファクタリングになります。
- これは正しい方向ですか?
- モノリシックなアクション内の混乱を処理するパターンなど、私が取ることができる中間ステップはありますか? アクション内の別のコマンド パターンでしょうか。
anti-patterns - あなたが維持しなければならなかった最も不健全なプログラムは何ですか?
私は定期的に、実際のロケット外科医によって構築されたシステムの保守作業を行うよう求められます。どこから始めればよいか分からないほど、多くの間違いがあります。
いいえ、待ってください。最初から始めましょう。プロジェクトの初期の段階で、設計者はシステムをスケーリングする必要があると言われており、スケーラビリティの問題の原因はアプリケーションとデータベース間のトラフィックであると読みました。このトラフィックを最小限に抑えるようにしました。どのように?すべてのアプリケーション ロジックを SQL Server ストアド プロシージャに配置します。
真剣に。アプリケーションの大部分は、XML メッセージを作成する HTML フロント エンドによって機能します。中間層が XML メッセージを受信すると、ドキュメント要素のタグ名を呼び出すストアド プロシージャの名前として使用し、SP を呼び出して、XML メッセージ全体をパラメータとして渡します。SP が返す XML メッセージを受け取り、フロントエンドに直接返します。 アプリケーション層には他のロジックはありません。
(スキーマのライブラリに対して受信 XML メッセージを検証するためのコードが中間層にいくつかありました。しかし、1) 少数のメッセージのみが対応するスキーマを持っていること、2) メッセージが実際には準拠していないことを確認した後、それを削除しました。 3) メッセージを検証した後、エラーが発生した場合、メソッドはメッセージを破棄しました。「このヒューズボックスは本当に時間の節約になります - 工場でペニーがプリインストールされています!」)
以前、間違ったことをするソフトウェアを見たことがあります。たくさん。かなり書いてきました。しかし、このシステムの設計とプログラミングに具現化されている、あらゆる可能なターンで間違ったことをするという冷徹な決意のようなものを見たことがありません。
まあ、少なくとも彼は自分が知っていることで行きましたよね?うーん。どうやら、彼が知っていたのはアクセスだったようだ。そして、彼はAccessを本当に理解していませんでした。またはデータベース。
このコードの一般的なパターンは次のとおりです。
じゃ、いいよ。クエリオプティマイザーも信頼していません。しかし、これはどうですか?(もともと、これは「これまでに遭遇したソース コードで最高のコメントは何ですか?」に投稿する予定でしたが、この 1 つのコメントだけでなく、書くべきことがたくさんあることに気付き、事態は手に負えなくなりました。)多くのユーティリティ ストアド プロシージャの最後に、次のようなコードが表示されます。
はい、そのコードは、あなたが気が狂わないように、それが行っているとは信じられないことを正確に行っています。変数に NULL が含まれている場合は、その値を -9999 に変更して呼び出し元に警告しています。この番号が一般的にどのように使用されるかを次に示します。
本当。
このシステムの別の側面については、thedailywtf.com のI Think I'll Call Them "Transactions"というタイトルの記事を参照してください。私はこれを作り上げているわけではありません。私は誓います。
このシステムに取り組んでいると、ある学生に対する Wolfgang Pauli の有名な応答をよく思い出します。
これは、これまでで最悪のプログラムではありません。これは間違いなく、私の 30 年間のキャリア全体で取り組んできた中で最悪のものです。しかし、私はすべてを見たわけではありません。何を見た?
linq - LINQ 構文で見た最悪の悪用は何ですか?
最近のDot Net Rocks ポッドキャストで、Jon Skeet は LINQ 構文の乱用の可能性について言及しました。LINQ を使用してクレイジーなことが行われている例は何ですか?
embedded - 組み込みシステムのワースト プラクティスは?
組み込みシステムを開発する際に従うべき「ワースト プラクティス」は何だと思いますか?
してはいけないことについての私の考えのいくつかは次のとおりです。
何をしてはいけないかについては、たくさんの良いアイデアがあると思います。それらを聞いてみましょう!
design-patterns - 誤用された設計パターン
正統なギャング・オブ・フォーのリストに、誤用、誤解、または使いすぎによく見られる設計パターンはありますか (非常に議論されているシングルトンを除く)。言い換えれば、使用する前によく考えるようアドバイスする設計パターンはありますか? (なぜ?)
c# - 単一パラダイム OOP は抽象化の逆転につながりますか?
この概念に慣れていない人のために説明すると、抽象化の反転は、高レベルの構造の上に低レベルの構造を実装することであり、不必要な複雑さと不必要なオーバーヘッドの両方が追加されるため、一般的に悪いことと見なされています。もちろん、これはやや不正確で主観的な定義です。
あなたの意見では、Java や C# など、すべてがクラスの一部である必要があり、ポインターのようなものが公開されていない単一パラダイムの OOP 言語でのプログラミングは、必然的に抽象化の逆転につながりますか? もしそうなら、どのような場合に?