2011-09-15 7 views
4

良いスタイル(クリーンコードブック)では、メソッドの名前がメソッドの機能を記述する必要があることを示しています。だから、例えば私は名前が何かする必要があり、そのデータベースに格納し、アドレスを確認する方法があり、電子メールを送信する場合などverifyAddressAndStoreToDatabaseAndSendEmail(address);長いメソッドのメソッド名

または

verifyAddress_StoreToDatabase_SendEmail(address);

私は分割することができますが、その3つのメソッドの機能は、私はまだこれらの3つのメソッドを呼び出すメソッドが必要です。したがって、大きなメソッド名は避けられません。

名前付きのメソッドは確かにそのメソッドが何をしているのかを記述しますが、IMOは名前が非常に大きくなる可能性があるためあまり読み込めません。どのようにそれを解決しますか?

編集:たぶん私のようなメソッド名を分解するために流暢なスタイルを使用することができます。

verifyAddress(address).storeToDatabase().sendEmail();

が、私は、呼び出しの順序を確保するための方法が必要です。たぶん、状態パターンを使用して、しかし、これはコードが成長する原因となります。

+3

あなたは3つのことを行います。さて、これらの3つのステップを呼び出すことによって何をしているのかを説明する名前について考えてみましょう。名前はありますか?メソッド名はokです。 –

+0

私はHernanに同意します。私が何かをする際に複数のステップがある場合、常に全体的な目標があります。具体的でない場合は、処理などの一般的な目標が常に存在します。 場合によっては、processAddress(address)メソッドはそれぞれのメソッドで3つの別々のステップを呼び出すことができます。 –

+0

であるが、 'processAddress'は非常に一般的であるため、IMOはメソッドの目的について読者に何も言わない。 – ejaenv

答えて

2

3つの方法で1つの方法ではいけません。

  1. verifyAddress
  2. 私は、これはあなたが言及し、その高い方法のように3つの小さなメソッドを作ることですアプローチ方法
  3. storeAddress
  4. のsendEmail
+1

しかし、私が言ったように、ある時点であなたはこれらの3つのことを強く呼び出す必要があります。 (単一責任の原則は、メソッドが1つのことを行うべきだということですが、この1つは抽象レベルを指しています) – ejaenv

6

:このように3つの方法の中に作業を分割私は3つの小さなものを呼び出し、私は "なぜ"私はそれらの3つのことを行う必要がある後に名前を付けます。

これらの手順を実行する必要がある理由を定義し、それをメソッド名の基礎として使用してください。

+0

この提案を逃して、私は3つのプライベートメソッドを呼び出すpublicメソッド 'SaveAddress' : 'verifyAddress'、' insertAddress'、 'sendEmail'です。 –

+0

@Rickだが、それを 'SaveAdress'と命名すると、電子メールを送信する副作用については何も言わない。 – ejaenv

+1

@ejaenvそれを見るための一方法は、 'HandleSaveAddressRequest'かそれに類するものに名前を付けることです。なぜ理にかなっていない場合は、イベントを扱っているかのような目的や行動を時々説明することが代替解決策になることがあります。 – JamesEggers

2

私は以前のコメントをフォローアップしていますが、コメントに合っているというよりも私はここにいます。私は答えています。

詳細はメソッドの名前ではなくドキュメントに記載されています(私の意見では)。このように考える... SendEmailをメソッドの名前に入れると、実装の詳細がメソッド名にコミットされます。電子メールではなくSMSやTwitterなどで通知を送信するという決定が下された場合、どうなりますか?メソッドの名前を変更してAPIを壊すか、APIのコンシューマーを誤解させるメソッド名がありますか?考慮すべき何か。

名前にメソッドの機能を維持することを強くお勧めする場合は、より一般的なものを見つけることをお勧めします。おそらくVerifySaveAndNotify(Address address)の行に沿った何か。このように、メソッド名は、を指定することなく、何をしているのかを示します。それを行います。 Addressのパラメータはをご存知でしょうかが確認されており、保存されています。そのすべてが協力して、メソッド名を有益で柔軟性があり、簡潔にします。

0

EDIT:

verifyAddress(アドレス).storeToDatabase():たぶん私のようなメソッド名を分解するために流暢なスタイルを使用することができます。メールを送る();

しかし、私は呼び出しの順序を保証する方法が必要です。たぶん、状態パターンを使用して、しかし、これはコードが成長する原因となります。

流暢なスタイルのコマンドの順序を保証するために、各結果は次のステップで必要な機能だけを公開するオブジェクトになります。たとえば:

public class Verifier 
{ 
    public DataStorer VerifyAddress(string address) 
    { 
     ... 
     return new DataStorer(address); 
    } 
} 

public class DataStorer 
{ 
    public Emailer StoreToDataBase() 
    { 
     ... 
     return new Emailer(...); 
    } 
} 

public class Emailer 
{ 
    public void SendEmail() 
    { 
     ... 
    } 
} 

これは非常に顆粒状のデザインを作成する必要があるとreuseabilityのためにあなたのクラスを最適化したい場合に便利ですが、ほとんどの状況下で設計やり過ぎである可能性が高いです。おそらく他の人が、プロセス全体が何を表しているのかを表す名前を選んだと言われています。単に「StoreAndEmail」と呼ぶことができます。これは、データがどの宛先にもコミットされる前に定期的に確認が行われていることを前提にしています。あなたが長い名前を気にしないならば、それを単に完全に記述し、長い名前が必要であることを受け入れることです。結局のところ、実際には何もコストはかかりませんが、確かにあなたのコードをより具体的なものにすることができます。

関連する問題