2016-08-10 14 views
4

ロバートC.マーティンの書籍「クリーンコード」は、というメソッドは、1つのことを行うべきだと言います。例えば、私はinitialize()とplay()の2つのメソッドを持っています。メソッドを書くための適切な方法

initialize()は、play()が呼び出される直前に呼び出される必要があります。

play()メソッドは、自分のコードで何百回も呼び出されます。

アプローチ-1:私は3つのアプローチ見ることができ、プレイ前に

コール初期化を()()、これは数百回にわたり繰り返すことができます。

initialize(); 
play(); 

... 

initialize(); 
play(); 

... 

アプローチ-2:play()メソッドの内部

入れの初期化()。しかし、これは "一つのことをする"アプローチに反するだろう。

void play() { 
    initialize(); 
    ... 
} 

アプローチ-3:

私はinitializeAndPlay(と呼ばれる別のメソッドを記述する必要があります)。

void initializeAndPlay() { 
    initialize(); 
    play(); 
} 

これを行うには、他のより良いとクリーンな方法はありますか?

+2

となるだろうクラスを正しく使用するために再生する前に初期化を呼び出すには、確実に1ではありません。 –

+1

@AndyTurner、true。これは時間的結合と呼ばれます。 :) –

+0

'play'を正しく実行するために' initialize'が必要な場合は、正しく第2の方法を使います。 – Blobonat

答えて

4

再生がの場合、通常はが初期化後に呼び出される場合、最も明瞭なので、3番目を選択します。

初期化せずに再生できない場合は、2番目のものを選択します。

一方、私はメソッドを提供するクラスの設計について考えるでしょう。ほとんどの場合、初期化はコンストラクタで行われます。

+0

メソッドを再生する前にinitializeを呼び出す必要があります。そして、2番目のものを使うと、これはきれいな方法でしょうか? 1つのことをしていないからです。また、内部で隠しジョブ 'initialize'を行っています。 – Shahid

+0

プロセスがいくつかのステップ(initialize、play、cleanUp、...)で構成されている場合、これらのステップを実行するメソッドが必要です。プレーをしてプライベートに初期化すると、別々に呼び出されるのを避けることができます。しかし、どのような場合でも、私はあなたの構造とコンストラクタに初期化する必要があるかどうかを考えます。 –

0

これは、これがあなたが初期化する方法に強く依存すると思います。それが現在のオブジェクトを初期化した場合、私は、オプション番号2のために行くと、それを守るでしょう:

void play() { 
if (!initialized) { 
    initialize(); 
} 
... 
} 

それは、システム全体/ UIを初期化した場合、クライアントは常に必要がある場合、私はオプション番号3

関連する問題