2016-04-05 8 views
1

最初に、私はリファクタリングの条件付きロジックを読む方法を探しました - 3つの主なアプローチが提案されているようです:多態性(試したことはありませんが、 )、Enums(使用済み)、The Strategy Pattern(私は数回使用しており、それを好きです。複数の条件付きロジックを実装するための最良のパターン

しかし、私がチェックする程度6-7ブール条件があり、それぞれが偽/真であるかどうかによって、私は別の何かをしたい、すなわち

true, false, false, true 

false, false, true, false 

true, true, ... you get the picture.. 

ブール値が異なる好みで設定されている、であることすべてが関係していますが、どちらが真か偽かによって違った扱いをする必要があります。設定の量も同様に増加する可能性があるので、スケーラビリティとメンテナンス可能なものは、私が後にしているものです。

私はここで戦略パターンを使うことができますが、最初に多くの条件付きのチェックがなくても(これは避けようとしています)

例の状況、音楽アプリの周りのプロジェクトセンター、具体的には、トラックが終了したときに何をすべきか、そしてどのようなオプションは、すなわち次に何が起こるかを指示:

SHUFFLE

REPEAT

PLAY_FROM_ALBUM_SONGS

PLAY_FROM_ARTIST

PLAY_FROM_GENRE

PLAY_FROM_ALL_SONGS

だから、基本的な例は、最初と最後の真(すべての曲から&プレイをシャッフル)、残りは偽されているだろう。場合によってはアルバムが再生されている場合にライブラリからすべての曲を再生できないため、いくつかのオプションが選択されると自動的に他の曲に影響します。

複数の条件(6/7 +)に基づくこのような条件付きロジックをどのようにリファクタリングして、醜いコードの巨獣のように見せかけることができないかのご提案です。

+0

"アレンジメント"の意味によって異なります。単純な解決法はブール値を 'int'として再構築し、可能な' int'を特定のアクションにマッチさせることです。 – Paul

+0

キャプチャしたい具体的な配置がありますか?その数はどれくらいですか? –

+0

@Paul私は自分自身を少しはっきりと説明しようとしました。ブール値をint型にすることを意味するとき、それらをint型(1または0)にキャストすることを意味しますか? –

答えて

2

例では、条件を分類して開始する必要があります。いくつかは排他的なもので、一部のものはは相互に影響し、それらは指定された振る舞いのどの部分に基づいてグループ化できます。

分類は次のようになりますあなたの例では:

  • ソング選択:FROM_ALBUM、FROM_ARTIST、FROM_GENRE、FROM_ALL_SONGS
  • 繰り返し:
  • 注文を繰り返します

反復をシャッフルし、順序はそれぞれ1つの要素のみを含み、ソングの選択は左から右への階層に基づいています。 FROM_ARTISTがtrueの場合、FROM_ALBUMも暗黙のうちにtrueになります。これは、アルバムがアーティストによって制作されたトラックのサブセットであるためです(ただし、機能を数えない限り、ここでは無視します)。だから、分類の後、物事はすでにかなり簡単に見える。

REPEATとSHUFFLEは他のフラグの影響を受けることなく独自の動作を処理するため、簡単なif節で処理できます。また、各プロパティを特定のアクションにマップする回避策もあります。他のフラグについては、最も単純なのは、階層を利用して最大の曲をカバーするフラグを検索し、フィルタとして設定することです。

ここでの主眼は、デザインパターンを適用することではなく、実際にはその意味に基づいてフラグを分類することです。

関連する問題