2011-10-25 8 views
4

Lexerオブジェクトのモッククラスを作成していますが、リファクタリングが必要な場合があります。Javaのinterface/class/mockClassの命名規則?

  1. インタフェースLexerを作成し、RealLexerのようなものに現在のLexerの名前を変更します。私は2つのオプションがあります。 MockLexerLexerを実装し、メソッド呼び出しはLexerのいずれかをとります。私はあなたの貴重なLexerクラスがモッククラスがないとわからないと意味がないものに改名されることを嫌います。
  2. インタフェースLexerInterfaceを作成してください(私はそれがInterfaceという名前になっていますので、私はすでに嫌いですが)自分自身が現状のままであることを可能にします。LexerMockLexerLexerInterfaceを実装します。別の欠点は、メソッドコールがLexerInterfaceをparamsとして取ることです。

どちらのオプションも私には悪い匂いがするので、基準を私に決めさせるように思った。誰もこれを経験していますか?

+2

「RealLexer」はなぜですか? 'MockLexer'の名前は、テストのためだけに使用されるので、あなたが望むものであれば名前を付けてください。おそらく 'Lexer'インターフェースとデフォルトインプラントの' DefaultLexer' –

+0

私はMockLexerがすぐにメンテナに通知するので、MockLexerはMockテストにしか使われないと言います。しかし、私は「リアル」ではなく「デフォルト」が好きです。 – munchybunch

+1

実際、モックオブジェクトに 'モック 'を追加することをお勧めします。 –

答えて

6

私は間違いなくあなたのインターフェイス名としてLexerを使用して投票します。 に関する情報を追加するにはどうすればよいですかまたはなぜあなたの実装は名前の一部としてそのことを行いますか? は、例えば:

  • StringParsingLexer
  • TokenizingLexer
  • SingleThreadedLexer
  • {ThirdPartyLibraryName}DelegatingLexer

また、あなたが本当に明示的MockLexerを構築する必要があるのですか? Mockitoのようなフレームワークを使うと、テストをかなり簡単かつ迅速に行うことができます。

Lexer mockLexer = Mockito.mock(Lexer.class); 

Mockito.when(mockLexer.doFoo()).thenReturn("bar"); 
1

コメントに記載されているように、お使いのインターフェイスにはLexer、デフォルトの実装にはDefaultLexerを使用することをお勧めします。このパターンは非常に頻繁に使用されるため、コードを管理する人にとっては非常に理解しやすいものです。モックオブジェクトについては、MockLexerのような名前を付けることもできます。 Javaが使用する命名規則の例として

javax.swing.table.TableModelインターフェイス
javax.swing.table.AbstractTableModelではTableModel
javax.swing.table.DefaultTableModelAbstractTableModelの実装です実装する抽象クラスです。

があり、大文字、名詞を使用してのJava Codding Conventions外ではありません勧告など

0

私は通常、オプション1を使用 - Lexerと呼ばれるインタフェース、DefaultLexerまたはLexerImplどちらかと呼ばれるデフォルトの実装では。私はこれが好きです。なぜなら、クラスについて簡単に話すことができると思うからです。Lexerの実装が複数ある場合は、具体的な名前で実装タイプを記述できます。たとえば、NativeLexerまたはTreeBasedLexerなどです。コメント欄に記載されているように、モッククラス(ある場合)はMockLexerのような名前でこのパターンに従うことができます。

しかし、模擬ライブラリsuch as the excellent Mockitoを使用すると、具体的なクラスを模擬することができます。そのため、簡単にテストするためにどこでもインターフェイスを使用する必要はありません。ここで彼らはin their documentation与える例です。

その後、 Lexerを使用する事が実装に縛られる必要はありませんので、私はまだ、インターフェースを使用しての代わりに、具体的なクラスにメソッドのシグネチャを結ぶ推薦すると述べ
//You can mock concrete classes, not only interfaces 
LinkedList mockedList = mock(LinkedList.class); 

- これは、メンテナンス性が大幅に向上する可能性があります(たとえば、後で複数の実装が必要な場合)。

1

私の経験では2つの基準があります。

  1. 「あなたのインターフェイスにタグを付ける」。 (ILexer,LexerInterfaceなど)
  2. インターフェイスの名前を使用し、具体的な実装には別の名前を使用します。

私はこれらが既にあなたが提示したオプションであることを知っています。問題は、そのうちの1つがしっかりと「標準」ではないということです。

強くはオプション2)を優先します。オブジェクトのクラス名は、 "is-a"文の文脈内に収まる名詞になる傾向があります。オブジェクトが「is-a」LexerInterfaceであるのに対して、「is-a」というオブジェクトは「DefaultLexer」と言うのが自然だと言うのは変です。

最終的に私のクラスまたはインターフェイス名は型を表しているので、私はクラス名またはインターフェイス名の "meta"情報から逸脱しています。