我目前正在嘗試學習SOLID設計原則以及行爲驅動開發,但是我很難將我的頭腦置於單一責任原則的範圍內。我試着爲使用測試驅動開發的c#找到一個很好的教程,但一直沒能找到有價值的東西。無論如何,花了幾天的時間閱讀後,我決定最好的學習方式是經驗,所以我開始創建一個小應用程序,盡我所能使用這些原則。瞭解SOLID設計的單一責任原則
這是一個簡單的保齡球比分計算器。我認爲最好的辦法是從最簡單的部分開始工作,所以我開始在球(或投)水平。現在我已經創建了測試和一個接口和類來處理球(投)分數,這確保它們不是無效的,即。 <10
或>0
。在實現這個之後,我意識到球類基本上只是一個可空的整數,所以也許我甚至不需要它......但現在它在那裏。
接下來的球,我決定接下來要添加的邏輯是一個幀接口和類。這是我陷入困境的地方。這裏是我所在的地方:
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的方式實現這一點。我正在考慮在課堂上增加邏輯,但這似乎違背了單一責任原則。然後我想將它作爲一個單獨的接口/類添加,然後在每個幀的分數更新時調用該類。我也想過創建一個單獨的界面,或者類似的東西,並在Frame類中實現它。不幸的是,我不知道這些中的哪一個是最好/最可靠的做事方式。
那麼,實現一種驗證幀分數的方法是一種很好的SOLID方法嗎?
注:任何批評我的代碼是非常受歡迎的。學習創建更好的代碼讓我非常興奮,並樂於接受任何幫助。
哇,謝謝!這真的有很多好的建議,特別是關於使用基本框架類並從中繼承來創建正常框架和框架類。這是很好的建議。 –
相關的,對於框架驗證,你是完全正確的,根本不需要幀數,我絕對是在想它。 –
至於抽象抽象。我很抱歉,我意識到我的球類是不恰當的命名。它應該被稱爲投擲或滾球,因爲它的目的是跟蹤投擲信息,而不是球信息。所以它實際上就是你正在談論的抽象。 –