私は現在、SOLID の設計原則とビヘイビア駆動型の開発を学ぼうとしていますが、単一責任の原則について理解するのにかなり苦労しています。テスト駆動開発を使用する c# の優れたチュートリアルを見つけようとしましたが、その意味で価値のあるものを見つけることができませんでした。とにかく、数日かけてそれについて読んだ後、私は経験から学ぶのが最善の方法であると判断したので、できる限りそれらの原則を使用して小さなアプリの作成を開始しました.
シンプルなボウリングスコア計算機です。一番簡単なところからやっていくのが一番いいと思ったので、ボール(投げ)レベルから始めました。現在、ボール (スロー) スコアを処理するためのテストとインターフェイスとクラスを作成しました。<10
または>0
。これを実装した後、ball クラスは基本的に null 可能な整数にすぎないことに気付きました。そのため、必要ないかもしれませんが、今のところはあります。
ボールに続いて、次に追加する論理的なものはフレーム インターフェイスとクラスであると判断しました。これは私が行き詰まったところです。これが私がいる場所です:
namespace BowlingCalc.Frames
{
public interface IFrame : BowlingCalc.Generic.ICheckValid
{
void AddThrow(int? score);
int? GetThrow(int throw_number);
}
}
namespace BowlingCalc.Frames
{
public class Frame : IFrame
{
private List<Balls.IBall> balls;
private Balls.IBall ball;
private int frame_number;
public Frame(Balls.IBall ball, int frame_number)
{
this.ball = ball;
this.frame_number = frame_number;
balls = new List<Balls.IBall>();
check_valid();
}
public void AddThrow(int? score)
{
var current_ball = ball;
current_ball.Score = score;
balls.Add(current_ball);
}
public int? GetThrow(int throw_number)
{
return balls[throw_number].Score;
}
public void check_valid()
{
if (frame_number < 0 || frame_number > 10)
{
throw (new Exception("InvalidFrameNumberException"));
}
}
}
}
フレームは、以前に実装したボール クラスを依存性注入によって使用して、フレームにボール スコアを追加します。また、フレーム内の特定のボールのスコアを返す方法も実装しています。
私がやりたいこと、そして行き詰まっているところは、フレームスコアが有効であることを確認する方法を追加したいということです。(今のところ、フレーム 1 ~ 9 の単純なケースで、両方のボールの合計スコアが 10 以下でなければなりません。後で、より複雑なフレーム 10 のケースに移ります。)
問題は、これを SOLID の方法で実装する方法がわからないことです。クラスにロジックを追加することを考えていましたが、それは単一責任の原則に反しているようです。次に、それを別のインターフェイス/クラスとして追加し、スコアが更新されたときに各フレームでそのクラスを呼び出すことを考えました。別のインターフェイスなどを作成して、IValidator
それを Frame クラスに実装することも考えました。残念ながら、これらのうちどれが最善の/堅実な方法であるかはわかりません。
では、フレームのスコアを検証するメソッドを実装するための適切で堅実な方法は何でしょうか?
注: 私のコードに対する批判は大歓迎です。より良いコードを作成する方法を学ぶことにとても興奮しています。