タグ付けされた質問 「anti-patterns」

アンチパターンは、効果がないか逆効果であるにもかかわらず一般的な行動または慣行です。

4
パターンベースのプログラミングとは何ですか?
プログラミングのパターンとアンチパターンに対する強迫観念を誰かが説明できますか?どんなパターンが何を意味するのか全くわからないからです。プログラミングタスクに直面したとき、問題について少し考え、関連すると思われるデータ構造を書き留め、ソリューションのプロトタイプを作成し、いくつかのモジュールを分離して繰り返します。プロセスのどこにも「ああ、ここにFunkyLookyTasticパターンが必要」とは思いません。

2
「ユーティリティ関数」クラスを使いこなす
Javaコードベースでは、次のパターンを見続けています。 /** This is a stateless utility class that groups useful foo-related operations, often with side effects. */ public class FooUtil { public int foo(...) {...} public void bar(...) {...} } /** This class does applied foo-related things. */ class FooSomething { int DoBusinessWithFoo(FooUtil fooUtil, ...) { if (fooUtil.foo(...)) fooUtil.bar(...); …

7
ほとんどが1つの正規表現で構成される大きな関数をリファクタリングする必要がありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 約100行にわたる関数を作成しました。それを聞いて、あなたはおそらく私に単一の責任について教えて、私にリファクタリングを促すように誘惑されるでしょう。これは私の本能でもありますが、問題は次のとおりです。関数は 1つのことを行います。複雑な文字列操作を実行し、関数の本体は主に1つの冗長な正規表現で構成され、文書化された多くの行に分割されます。正規表現を複数の関数に分割すると、実際に言語を切り替えているため、実際に読みやすさが失われ、正規表現が提供する一部の機能を利用できなくなるためです。ここに私の質問があります: 正規表現を使用した文字列操作に関しては、大きな関数本体は依然としてアンチパターンですか?名前付きキャプチャグループは、機能と非常に似た目的を果たしているようです。ところで、正規表現を通るすべてのフローのテストがあります。


12
条件文のこの使用はアンチパターンですか?
作業中のレガシーシステムでこれをよく見ました。次のような機能があります。 bool todo = false; if(cond1) { ... // lots of code here if(cond2) todo = true; ... // some other code here } if(todo) { ... } つまり、関数には2つの部分があります。最初の部分は何らかの処理(ループ、副作用などを含む可能性があります)を実行し、その途中で「todo」フラグを設定します。2番目の部分は、「todo」フラグが設定されている場合にのみ実行されます。 物事を行うのはかなりlyい方法のように思えます。実際に時間をかけて理解したほとんどのケースは、フラグの使用を避けるためにリファクタリングできると思います。しかし、これは実際のアンチパターンであるか、悪いアイデアであるか、それとも完全に受け入れられるものですか? 最初の明らかなリファクタリングは、2つの方法に分割することです。ただし、私の質問は、ローカルフラグ変数を作成し、複数の場所に潜在的に設定し、後でそれを使用して次のコードブロックを実行するかどうかを決定する必要があるかどうか(現代のOO言語)についてです。

12
ベストプラクティスと常識の違いは?
ソフトウェア開発のベストプラクティス1に関する多くの会話があります。私は少なくとも3つの主要なポイントがSEと他の場所の両方で多くの議論を得るのを見ました: ベストプラクティスとして適格なものとその理由は何ですか? ベストプラクティスはそもそも議論する価値さえあります。プラクティスが「ベスト」プラクティスではないと断言するのが妥当だからです。 適用できないように思われる場合、またはトレードオフを非現実的にする外部の制約(時間、お金など)のために、いつベストプラクティス(またはおそらくベストプラクティス)を放棄する必要がありますか? ソフトウェア開発の常識の概念は、はるかに少ない頻度で登場するように思われますが、決してないことではありません。最近の経験により、この概念が再び頭に浮かびました。 私の最初の印象は、それがベストプラクティスとは異なる議論であるが、おそらく他の受粉を伴うということです。 一般的に常識を考えるとき、あなたが選んだか教えられたルールのセットを考えて、それがあなたに判断と判断を下すためのベースラインを与える。常識に従うことは、足全体を撃ち落とさないようにする良い方法です。しかし、かなり低いベースラインを超えて、常識は教育された決定を下す必要性に道を譲り、教育された決定は、証拠が十分に説得力があるように見えるときでも常識を無効にすることができます。私はここで定義を少し緩めているかもしれませんが、私の例を先導するのに十分だと思います。 ソフトウェア開発の常識を考えるとき、コードベースが急速に不可解な混乱に陥ることを防ぐための基本的な衛生のすべてのルールを考えます。例として、次のようなものがあります。単一のグローバル構造を使用して、重要なプログラム内で状態を維持および伝達しない。ランダムで意味不明な変数/メソッド/クラス名を使用しない。おそらく、アンチパターンと呼ばれるようになったものに非常に近いものです。ベストプラクティスを実践パターンと学習パターンに適用する場合、常識を適用することはアンチパターン学習の実践アナログと見なすことができます。 これを念頭に置いて、私は他の人の答えを見ることが私がこれを介して私の道を推論するのに役立つかもしれないいくつかの質問を提起したいと思います。 他の人は、ソフトウェア開発に常識の概念があると信じていますか?いずれにせよ、推論を知ることに興味があるでしょう。 もしそうなら、それは議論する価値がある概念ですか?時々ベストプラクティスを実行するのと同じくらい、プッシュする必要があるものですか?それをさらに難しくする価値はありますか? アンチパターンの類推が合理的であると思われる場合、一般的なルールは、アンチパターンは他の方法がない場合にのみ採用され、それでも非常に限られた状況下でのみ採用されるというものです。コードベースが常識から逸脱することを許容する上で、どれほど柔軟にすべきでしょうか?答えが「まったくない」のは不合理に思えます。なぜなら、便宜のために逸脱が必要になる場合があるからです。しかし、「ベストプラクティス」を採用する場合とは異なる種類の議論のようです。たぶんそうではありません。そう思わないなら、理由を知りたい。 これははるかに開かれた終わりであり、おそらくそれ自体の後続の質問に値する可能性がありますが、それはどのような種類の推奨事項を常識の問題のように思われますか? 他の考えも歓迎します。 1おそらく私はそれらを「一般的に繰り返されるドメインパターン」と呼ぶ方が良いでしょうが、「ベストプラクティス」という名前は、彼らがそうであることに同意しなくても、誰でも彼らが何であるかを知っているほど十分に一般的です。「最高の」部分が気になる場合は、「ベストプラクティス」を信頼性の低いサウンドに置き換えたと想像してください。

3
グローバルリクエストコンテキスト-アンチパターン?
今日、私の同僚とPython Webフレームワークとそれらについての印象について話していました。私は、Flaskがグローバルなリクエストを持っているのはひどく臭いで、アンチパターンだと彼に言った。 ドキュメントは、要求コンテキストについて言います: 対照的に、リクエストの処理中には、他にもいくつかのルールがあります。 要求がアクティブな間、コンテキストローカルオブジェクト(flask.requestなど)は現在の要求を指します。 コードはいつでもこれらのオブジェクトを保持できます。 アプリケーションをよりシンプルにするという、この設計決定の背後にある考え方を理解していると思います。Thread Localsの場合のように、これは単なる妥協です。 はい、通常、スレッドローカルを使用することはそれほど賢明な考えではありません。これらは、スレッドの概念に基づいていないサーバーに問題を引き起こし、大規模なアプリケーションの保守を困難にします。ただし、Flaskは大規模なアプリケーションや非同期サーバー向けに設計されたものではありません。Flaskは、従来のWebアプリケーションをすばやく簡単に記述できるようにしたいと考えています。 グローバルオブジェクトに現在の要求情報をパッチすることはアンチパターンですか? 静的コードアナライザーの観点ではグローバルステートであるため、そうではないと考えています。そして、プログラマーとしての私は、ドキュメントを注意深く読むことなく、それがどのように機能するかを理解しません。そして、これはテストに結果をもたらします。 ビューへの引数としてリクエストを渡すことは良い習慣ではありませんか?読みやすく、明示的で、デバッグが簡単だと思います。そして、グローバルな状態を回避します。

8
日付に基づいてUI(または他の)機能をオンまたはオフにしますか?
ASP.NET 2.0で書かれたひどいシステムがあり、いくつかの機能を追加する必要があります。問題は、特定の製品には特定の日付以降に開始されたビジネスでオンにする必要がある(および他のサービスがオフになっている)UI機能があり、既存のビジネスではページが同じように表示される必要があることです。 私は本能的に日付ベースのJavaScript UIスイッチのアイデアと、古いビジネスと新しいビジネスのWebコントロールの混合が「だらしない」(より良い言葉が欲しいため) )。 時間ベースのUI機能を持つ慣行は広く受け入れられている慣行ですか?そうでない場合、その行動方針を追求する既知のリスクは何ですか?

3
TDDモックコール検証-アンチパターンですか?
私は1年前からTDDを行っていますが、TDDにはかなり満足しています。テストスイートなど、すべてが大好きです。しかし、最近私は多くの模擬通話検証を行っていることに気づきました。たとえば、リポジトリが挿入されるサービスがあります-単体テストでは、リポジトリのモックを渡し、テストしているメソッド内で呼び出されていることを確認します。次に、返された結果が正しいかどうかを確認します(別のテストで)。私の単体テストは実装の詳細に非常に結びついているので、これは間違いなく間違いだと感じています。「振る舞い」をテストするべきだと聞いたことがありますが、多くの状況では... emm-不可能ですか?あなたが持っている場合voidたとえば、通常は副作用をテストします。つまり、これを実証できる単純なコード型を簡単に示すことができますが、私見では、私たちが作成する実際のプログラムにはあまり反映されていません。私が間違っているのは何ですか?この種のテストは一種のアンチパターンですか?これについてのあなたの意見をいただければ幸いです。TDDに関しては、まだ初心者です。

3
DDD-貧血ドメインモデルはアンチパターンですか?リッチドメインモデルを使用しているのでしょうか。[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 貧血ドメインモデルは、明らかにオブジェクト指向の原則などに反するため、EvansとFowlerによって以前から批判されていました。DDDコミュニティは、この発言と明確に一致しています。 しかし、近年、これはアンチパターンではなく、SOLIDの原則に従う例であると主張する意見の相違があります。 私は長年、Spring Frameworkを使用して作業してきました。すべての会社のすべてのプロジェクトには、貧血モデル(JPAエンティティ)で動作するリポジトリを使用して、ビジネスロジックを含むサービスレイヤーが常にあります。さらに、ほとんどのサンプルは、Springの公式のサンプルでさえ、この作業方法を示しています。 私の質問は次のとおりです。貧血ドメインモデルは依然としてアンチパターンと見なされていますか?私たち全員が(DDDに関して)間違ったことをしたことがありますか?リッチドメインモデルを持つことはSOLIDの原則に違反すると思いませんか?

1
接着剤や管理のクラスが多すぎるのはいつですか?
デザイン内の他のクラスを管理する集中型クラスを作成する傾向があります。それ自体はすべて保存されませんが、ほとんどのデータ要求は最初に「マネージャー」に送信されます。この質問への答えを見ていると、「神のオブジェクト」という言葉に気づきました。ウィキペディアは、それを当然のことながらアンチパターンとしてリストしています。 データとメッセージを場所から場所へと渡す正当な接着剤クラスまたはモジュールと、やり過ぎているクラスとの間の境界はどこにありますか?

7
これは「アンチパターン」であり、使用を中止すべきですか、それともこの巧妙な設計ですか?
RESTサービスを作成するとき、私は基本的に次のことをするために凝視しました: HTMLが要求されています サービスは必要なWebページを返しますが、要求された「リソース」はありません。データ Webページには、同じサービス(異なるコンテンツタイプ)にAJAXリクエストを発行するJavaScriptが含まれています サービスが実際のデータ(JSON)を返し、ページに表示されます 一方では効率が悪いように見えます(2リクエスト)が、これを使用した場合、「パフォーマンスは問題ありません」、つまりトラフィックの少ない内部アプリとWebサイトはシンプルで高速にロードされます。 私がこれで終わった理由は、Webページがほとんど純粋なHtml + JavaScriptになる可能性があり、そのようなテーブルやものを作成するためにサーバー側のもの、特にループがほとんど必要ないことです(これは、 slickgridなど)、たとえばデータとビューの分離。 これを使用する前に、これは良いアイデアですか、それともやめるべきですか?

3
シナリオを説明する正式なアンチパターンはありますか?
一部のコードは、Excelスプレッドシート(​​Office Interop)を生成するために記述されています。 コードのパフォーマンスが非常に悪い。 サブシステムは、夜間にファイルを生成するように設計されています。夜間のパフォーマンスは気になりません。 選択したパラメーターのセットに応じて、利用可能な100の異なるファイルから正しいファイルを選択する関数が作成されます。 物理ファイルが存在するため、これらのファイルをバックアップするためにアーカイブシステムが追加されます(アーカイブする理由はありません。これらのファイルはオンザフライで生成する必要があります)。 このシステムには構成ファイルが含まれていません。代わりに、コードが実行されているサーバーを単に反映するハードコーディングされた「サーバーピッカー」関数があります。 このサービスをサポートして実行するには、スケジュールされたタスクが必要です。 これは、1つの問題に要約されます。元のコードは、実稼働環境で実行するにはパフォーマンスが低すぎます。 パフォーマンスの問題が解決されていれば、サブシステムとその後のアーカイブシステム、「ファイルピッカーファクトリー機能」、ハードコードされた障害ポイント、およびスケジュールされたタスクのメンテナンスと追加された障害ポイントが存在する必要はありません。 これは、「カスケードエラー」です。元の問題は、より多くの不良コード、より多くの不良ソリューション、および不要なオーバーヘッドにつながりました。それを説明する正式なアンチパターンまたは一般的な用語はありますか?

7
DRY原則の違反
このアンチパターンの名前はどこかにあると思います。しかし、私はそれを知るためのアンチパターン文学に十分に精通していません。 次のシナリオを検討してください。 or0クラスのメンバー関数です。良くも悪くも、それはクラスメンバー変数に大きく依存しています。プログラマAがやってきて、をor0呼び出すのor0ではなく、クラス全体をコピーして名前を変更するような機能が必要です。私がor0言うように、それはその機能のためにメンバー変数に大きく依存しているので、彼女が呼び出さないと思います。または、彼女はジュニアプログラマであり、他のコードから呼び出す方法を知りません。これでor0、c0(コピーの場合はc)が得られました。私はこのアプローチでプログラマーAを完全に責めることはできません。全員が厳しい納期に直面し、コードをハッキングして作業を完了させます。 何人かのプログラマーがメンテナンスしているor0ので、バージョンになりorNます。 c0現在バージョンcNです。残念ながら、クラスを含むクラスを維持しているほとんどのプログラマーはor0完全に気付いていないようでしたc0-これは、DRY原理の知恵について私が考えることができる最も強力な議論の1つです。また、のコードの独立した保守もあった可能性がありますc。いずれにせよ、と思われるor0とc0、互いに独立して維持しました。そして、喜びと幸せ、エラーはで発生しcNていないのに発生していますorN。 だから私はいくつかの質問があります: 1.)このアンチパターンの名前はありますか?私はこれが起こるのを見たので、これが名前付きのアンチパターンではないと信じるのは難しいことがよくあります。 2.)私はいくつかの選択肢を見ることができます: a。)orN必要なすべてのメンバー変数の値を指定するパラメーターを取るように修正。次に、必要なすべてのパラメーターを渡しcNて呼び出すように変更しますorN。 b。)からorNに修正を手動で移植してみてくださいcN。(私はこれをしたくありませんが、現実的な可能性があります。) c。)orN-- cNagain、yuckに再度コピーしますが、完全を期すためにリストします。 d。)どこcNが壊れているかを把握し、とは独立して修復しorNます。 代替aは長期的には最良の修正のように見えますが、お客様がそれを実装することを許可するかどうかは疑問です。物事を正しく修正するために時間やお金を費やすことはありませんが、同じ問題を40または50回修復するための時間とお金は常に必要ですか。 誰かが私が考慮しなかったかもしれない他のアプローチを提案できますか?

3
For-ifアンチパターン
for-ifアンチパターンについてこのブログ投稿を読んでいましたが、なぜそれがアンチパターンであるのか理解できません。 foreach (string filename in Directory.GetFiles(".")) { if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase)) { return new StreamReader(filename); } } 質問1: それが理由であるreturn new StreamReader(filename);内部for loop?または、forこの場合ループが必要ないという事実ですか? ブログの作者が指摘したように、これのクレイジーでないバージョンは次のとおりです: if (File.Exists("desktop.ini")) { return new StreamReader("desktop.ini"); } の作成前にファイルが削除されるとStreamReader、を取得するため、どちらも競合状態になりますFile­Not­Found­Exception。 質問2: 2番目の例を修正するには、ifステートメントなしで書き直し、代わりにをStreamReadertry-catchブロックで囲み、それがスローされるFile­Not­Found­Exception場合は、それにcatch応じてブロックで処理しますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.