原代碼給了我很好的起點,是的,這些代碼都是玉,我在這只是再琢磨琢磨。
即使如此,重構的過程依然很繁瑣,文章也許會很長,每一次的重構都需要把全部代碼顯示一遍。
知易行難, 重構是個動態過程, 不那麼容易呈現出來,需要點耐心,慢慢看啊。
1 - 轉化為C#代碼,增加第一個測試
是的,這不是必須的,可以說是我自己的原因,不會Java。但是,你也可以看作是一種重構的場景,不是嗎?
更改的代碼就不再放了,比較簡單,與C#和Java的區別有關,留個連接 SocialID.cs。可是,我的測試代碼卻很重要。可能很多人會诟病我的測試框架(Machine.Specification)和代碼風格。前者,我想以後會多介紹MSpec和BDD讓大家根熟悉,後者,只能是希望大家適應了。
==>寫測試 www.2cto.com
第一個測試代碼:當用正確的輸入創建身份證時,應該能夠得到正確的生日。
[c#]
namespace Skight.eLiteWeb.Domain.Specs
{
public class when_create_social_id_with_proper_input
{
private Because of = () => subject = new SocialID("43010319801120753");
private It should_get_birth_date_correctly =
() => subject.getBirthDate().ShouldEqual(new DateTime(1980, 11, 20));
private static SocialID subject;
}
}
==>運行第一個測試,失敗 :)
有意思的是,解決C#語法翻譯之後,我的第一個測試就失敗了。
==>重構
原來,看似相同的語法Substring,第二個參數卻有不同的含義。再經典不過的場景了,測試可以理順這個過程。
[java]
private String getBirthDayPart() {
return this.cardNumber.substring(6, 14);
}
改為
[c#]
private String getBirthDayPart()
{
return this.cardNumber.Substring(6, 8);
}
==>再測試
==>第一個迭代結束,休息.
好了,階段性的成果,一個測試/行為就可以標示為一個裡程碑,今天就到這裡了,你的支持,讓我明天繼續。
哦,少等. 最後一步,確實最重要的一步. 給我們客戶(這中情況下,我的客戶是其他開發人員,是的,高級程序員的客戶就是其他中級,初級程序員,換一下思想吧)的測試/功能報告,如下: