アンチパターンにはどのような名前が付けられていますか?[閉まっている]


35

いくつかの名前があります。それらの名前に手を伸ばせば、すでに何かを台無しにしていることがわかります。

例えば:

XxxManager
クラスはクラスが何をするのかを記述する必要があるため、これは良くありません。クラスが行うことに対して思いつく最も具体的な単語が「管理」である場合、クラスは大きすぎます。

他にどのようなアンチパターンが存在しますか?

明確にするために、私は「どのような名前が悪いのか」とは問いません。その質問は完全に主観的なものであり、それに答える方法はありません。「システムの全体的な設計上の問題を示す名前は何ですか」と私は尋ねています。つまり、コンポーネントXyzを呼び出したい場合は、おそらくコンポーネントが不十分であることを示しています。また、すべてのルールには例外があることに注意してください-私は本当にデザインを停止して再考する必要がある場合の警告フラグを探しています。



4
「建設的ではない」として閉会する投票者に、その理由を喜んで説明してもらえますか?唯一の答えは短くすることができるということですが、それは確かに...他の5つのガイドラインを満たしていると、これはあまりうまく行っていない1
ビリーONeal


2
@Aaronaught:何か提案はありますか?私は編集でできていますように私は....だけでなく、これを連結式ました
ビリーONeal

1
@jhocking-私はそのリンクのいくつかに同意します-特に「マネージャー」と「ハンドラー」が手放すにはあまりにも貴重であるという点。そして、私は多くの場合、少なくとも漠然としたように見えるデザインパターンベースおよび他の選択肢で売れません。時々、「キュー」または適切なものは何でも、多くの場合、マネージャーがアイテムをキューに保持(または参照)するという事実は、それらのアイテムを管理する1つの側面にすぎません。有用なものが役職として「マネージャー」によって表されるように、IMOもOOPに適用されます。
Steve314

回答:


22

次のアンチパターンの命名は、.NET、特にC#に関連しています。

  • 矛盾。すべてのフィールド名を先頭にアンダースコアを付けて開始することにした場合は、それ固執します
  • 母音が欠落している曖昧な略語。のようなフィールド名を真剣に見ましたcxtCtrlMngr。それが何を意味するのか、ほとんど推測できません。
  • 長くて冗長な変数名ILoginAttemptRepositoryうまく説明的です— ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMapping説明的ですが、間違いなくうまくありません。

7
Iを意味することを意図しinterface、ここではimplementer単数、または最初の人?ほとんどのクラスはインターフェースを実装しているため、大文字で始まるクラス/インターフェースが多すぎると困惑し、I読みやすさが妨げられ、コード自体が臭いがします。
ユーザー不明

3
「母音が欠けているアンビグオスの略語」の+1は、私を夢中にさせます!
FrustratedWithFormsDesigner

6
@Billy ONeal:C ++にはインターフェースがあります。クラスから人為的に分離されていないだけです。;)
ジョンパーディ

4
@ビリーONeal:それは私のポイントでした。
ジョンパーディ

2
@MariusSchulz:そうそう、私はあなたに同意する:)それはそんなにひどく不透明な略語ではないと思った。
アマラ

9

私がよく遭遇するのは、単純に命名パターンをまったく使用しないことです。通常、開発者の無知(ネーミングパターンは良いこと)を示し、このアンチパターンは、クラスに関連するあらゆる種類のメソッドをそのクラス自体に詰め込むことにより、SRPに大きく違反する傾向があります。クラスには、プロパティ、CRUDメソッド、アプリケーションの一部が必要とする顧客にリモートで関連するものがあります。

また、接尾辞として「エンジン」を使用することは、「マネージャー」を使用することとほぼ同じであることを追加します。それは非常に曖昧で、クラスと呼ばれるクラスはXxxEngine多くのメソッドを含むVBスタイルのモジュールになる傾向があるため、オブジェクト指向プログラミングの知識やアイデアがなくても、「使いやすい」スポットにあります。


7

まず、簡単な答えを最初に入力してください:hungarianと入力します(http://mindprod.com/jgloss/unmainnaming.html、他にも素晴らしいアイデアがあり ます。 /articles/Wrong.html


7
ハンガリー記法は常に悪:)
ウェインモリナ

12
@ウェイン:実際、それは常に悪とは限りませ。私は70年代後半にゼロックスでチャールズに勤務し、元の命名システムは命の恩人でした。整数型のBCPLで作業していました。型に関する他のすべては、使用と命名規則によって伝えられました。私たちには7人のプログラマとCharlesがいましたが、だれでも他の人のコードを調べてすぐに生産性を上げることができました。これは、(チャールズによってさえ)恐ろしいほどねじれたり誤用されたりすることができないと言うことではなく、正しい文脈でそれが正しい解決策だったというだけです。
ピーターローウェル

3
@Marius:Joelの記事を読んでください。型システムは、変数間のすべての意味の違いを常に強制できるとは限りません。Intellisenseは、そのような場合にも役立ちません。
ビリーONeal

4
タイプは、使用よりも推測しやすい、特に。最新のエディターで。ただし、規律が必要です。すべてのプレフィックスを付ける必要はありません。私はJavaで働いており、ほとんどの場合ハンガリー語のアプリは必要ありませんが、座標系で同じタイプの変数(fromXやtoXなど)を必要とするものを何でもしているときは命の恩人です。
マイケルK

3
良いのは、新しい型を簡単に作成できる一般的な能力です。「これはintに似ていますが、行番号に適用される点が異なります。」
デビッドソーンリー

6

インターフェイスの名前に「I」を、または抽象クラスの名前に「Abstract」を付ける。これ、抽象クラスの概念を持たない言語や、インターフェースと抽象クラスを区別しない言語では許されるかもしれませんが、たとえばJavaでは常に悪い考えです。

また、私はマネージャーの事についてあなたに同意しません。私は時々このパターンを使用しますが、それは単に別の名前を付けようとした場合、その名前はXxxxxManagerよりも記述的ではないことを意味します。いくつかのタスク(必ずしも複雑なタスクである必要はありません)がありますが、1つまたは2つの単語で簡単に要約することはできません。


@マイク:あなたの声明には完全に同意しません、ごめんなさい。私の意見でXxxxManagerは、クラスが持つことができる最悪の名前です。もちろん、それは何かを管理します!それが書かれた理由です。Managerクラスが何を担当しているのかを、その名前で理解することに価値を加えない無意味なフィラー語です。
マリウスシュルツ

1
たとえば、TabManagerどうですか?JSPタブメカニズムを制御するクラスのより良い名前を取得しましたか?または、息をのむ TabController ...で始まる限りAbstract、私はそれが使い古されていると感じますが、しばしば有効です(例についてはJavaライブラリを参照してください)。私はI、誰かがそこにいるべきではないインターフェイスに対してプログラミングしようとしていない場所で、インターフェイスを見たことがないと安全に言えると思います。同様に、インターフェースを実装するクラスは1つだけです。
マイケルK

1
@Darien(およびその他):いずれにしても、それは問題ではありません。これらの名前はいずれもアンチパターンではありません(したがって、この質問のトピックから外れています)。私はあなたが彼らが使用するかどうかから、システムの設計については何も言うことができるとは思わないIXxxかをXxxImpl
ビリーONeal

2
これはまったくまったく間違っています。インターフェイスをクラスと視覚的に区別する非常に良い理由があります:(a)インスタンス化できない、(b)解放/破棄できない、(c)シリアル化できない、(d)できことプロキシ/あなただけせずにアンチパターンの例として、あなたは個人的に(いくつかの奇妙な原因不明の理由で)嫌いなものを投げてきたなど、など、など、傍受任意のすべての正当化。
アーロンノート

1
可能な限り、引数の型と戻り値の型の具体的なクラスよりもインターフェイスを優先する必要があります。したがって、インターフェイスが「クリーン」な名前を取得し、具体的な実装(呼び出し側が実際の型さえ知らないか気にしないかもしれない)がイボを取得するのは理にかなっています。
ケビンクルムウィーデ16

6

剥離:

私は傾いた障害を抱えており、綴ることができません。スペルチェッカーがないと、作成するすべての名前を検証のためにワードプロセッサにコピーしようとしますが、いくつかは常に見逃しています。私の最後のプロジェクトでは、APIの大部分を書きましたが、「レスポンス」という単語を初めて使用したときにスペルチェックをしなかったと思います。少なくとも50の機能があり、応答がありました。新しい人がチームに来て、なぜ私が本当に愚かだと感じたのかを尋ねました。


2
パラメーターの1つがaffect(効果ではなく)ある場所で、jQueryプラグインを簡単に使用しました。それは私を夢中にさせ、同じことをする別のプラグインをすぐに見つけました。
zzzzBov

4
最悪の問題は、名前のつづりを間違えると、名前が何であるかを思い出せないことです。
デビッドソーンリー

1
コードの異なる部分で同じものの綴りが異なると、さらに悪化します。メソッドgetStrenth()によってアクセスされるクラスSrtengthのフィールド強度がある場合のように。
エヴァ

5

まあ、私の意見は少し物議をかもしていると思う。しかし、試してみましょう...

XxxController、XxxHandlerなどの名前のMike Baranczakは、よく使用するものです。コントローラーは、トランザクションの管理、予期しないエラーの処理、実際の作業を行うためのXxxHandlerの呼び出しなど、「カプセル化された」何かのエントリポイントのようなものです。XxxManagerはコントローラーの同義語だと思います。あるケースではManagerを使用し、別のケースではControllerを使用しないことが重要だと思います。チームで作業する場合、一貫性を保つことは非常に重要です。

このようなもののより良い名前を見つけることは本当に難しいか、あるいは不可能かもしれません。状況をより明確にするために、Xxxを適切に選択する必要があります。

個人的に嫌いなのは、get ...またはset ...というメソッドが単なるアクセサー以上のものである場合です。私は決定するのが好きです...

もう一つ、それは私の心に浮かびます:叔父ボブによると。メソッド名の「And」は、多くのことを行うサインです。しかし、人生は常に白黒だけではありません-私はそれが大丈夫だと思う状況があります-例えば。パフォーマンスの問題(データを処理しない理由を確認するために既にデータを持っている場合)のため...

個人的には、システムハンガリー記法の大ファンでもあります。ほとんどの場合、IDEでソースコードを扱っています。しかし、多くの場合、エディターだけを使用しているか、ブラウザーでリポジトリを参照しています。欠点の1つは、タイププレフィックスによるツールサポートです...

私は、最も重要なことは、賛成であるということです-準最適な慣習-私にとって-慣習を持たないよりも優れている...


1
「コントローラー」には「マネージャー」とは異なるセマンティクスがあります。個人的にはどちらも好きではありませんが、「コントローラー」は多くのパターン、特にMVCの一般的なコンポーネントであるため、うまくいきます。XxxHandlerも同様に悪いです。クラスが何かを「処理」するだけの場合は、クラスが大きすぎるか、単に「Xxx」部分と呼ぶ必要があります。
ビリーONeal

3
「このようなもののより良い名前を見つけるのは本当に難しいか、あるいは不可能かもしれません」 -明確に定義された依存関係と責任で型階層を適切に設計した場合ではありません。もちろん、MVCの一部として「コントローラー」を使用している場合、または汎用イベント/メッセージハンドラーの「ハンドラー」を使用している場合は異なります。これらは専門用語の例ですが、定義されたクラスの場合、それは大きな危険です。
アーロンノート

5

おそらく、最悪のネーミングアンチパターンはこれです。

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

[foo、bar]ペアの3要素リストがあります。4番目が必要な場合は、テーブルに新しい列を追加する必要があります。

このようなコードにつながる:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

foo列とbar列を含む別のテーブルを作成し、stuffテーブルにリンクする必要があります。

create table fubar(foo string, bar string, stuff_id long)

2番目に悪いのはこれです:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

ここでは、Addressクラスの2つのインスタンスの代わりに6つのフィールドがあります。

このアンチパターンは、[foo、bar] x [1,2,3]または[home、perm] x [street、city、state]などの2つのセットのすべての組み合わせをリストする一連の2部構成の名前でマークされます。


-1-これはネーミングにまったく言及していません。
ビリーONeal

命名アンチパターンには複数の名前を含めることはできませんか?
ケビンクライン

==アンチパターンを命名する引数が多すぎますか?よくわかりません。
ビリーONeal

1
私が彼を理解している限り、慣習は実際の名前が取られるべき番号を許可するものです。これらの数値は、アイテムが何らかの種類のリストまたは配列であるという誤った印象につながります
ケプラ

3
@Billy ONeal:はい、そうです。設計上の問題は正規化の欠如であり、数字のサフィックスはそれを指す命名パターンです。
reinierpost

3

トートロジーであるクラスまたはインターフェースの命名は、リンクが言及しているJavaだけでなく、どの言語でも悪いものです。

トートロジー(修辞学)、繰り返しが明確さを提供しない場合でも、同じことを言うために異なる単語を使用します。


2
面白い。例はありますか?
マイクバランチャック

2
リンクを読むと、「トートロジー」と書かれています...;)
Benjol

10
トートロジークラブの最初のルールは、トートロジークラブの最初のルールです。
セルセリラ

リンク(大丈夫、リンクの内容)を読みましたが、例は見つかりませんでした
barjak

そのリンクに従って、I <InterfaceName>の使用を停止する必要があります...正しい。
ダル

3

Libraryまたはなどの一般的な名前のソフトウェアライブラリに頻繁に遭遇しますCommon。それらは、次善の設計を示しています。開発者は、機能に基づいて分解された設計を作成しようとすることなく、コードの重複を避ける努力をします。


+1-常に「Common」が表示されます。
モーガンハーロッカー

1

命名に関するMicrosoftから、悪い名前については次のリストを提供できます。

  1. セマンティックではありません。つまり、名前を持っているため、その機能を強調する代わりに、使用するテクノロジまたはそのベースのパターンを強調しています
  2. それらは構文上の一貫性に従っていません。たとえば、名前の一部はキャメルケース、その他の部分はパスカルケースです。
  3. CanScrollHorizo​​ntallyの代わりにScrollableXのように、それらは理解しにくい略語です
  4. それらは、その環境のキーワードを台無しにするように選択されています。

2
実際、少なくとも「CanScrollHorizo​​ntally」と同じくらい「ScrollableX」が好きです。「X」は実際には略語ではありません。
user1172763
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.