<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                不會太深入這個話題(許多書和網站都討論),有一個稱作 TDD(測試驅動開發)的技術,主張一個好的實踐是在方法實現之前編寫測試。該過程分為以下幾個步驟: * 編寫一個測試 * 編譯器運行的最小化必須代碼添加到類的定義中,代碼不必在這個階段工作。編譯器只要產生一個輸出就夠了。 * 運行測試,將很可能失敗因為模型方法還沒有真的被實現。 * 修改代碼以提供最小需求使測試可以通過 * 運行測試并通過 * 代碼重構;如果修改引起了一個 bug ,一個測試將會報告故障 然后重復這個過程直到所有應用需要的功能都被實現。編寫最少的代碼來通過測試確保應用不會假裝比嚴格需求做更多的事情。這個概念是在兩個縮寫詞中重新獲得,KISS(keep it simple,stupid),和YAGNI(you ain't gonna need it,你不會需要它)。 雖然描述的每個步驟非常小,但它取決于現實的需要跟程序員的個人態度。 在下面的例子中,這個技術會被在第一個步驟采用,并具有一定程度的自由,不然讀者繁瑣。它將被在一個簡單的驗證框架基礎上實現。所需要的是一個非常簡單的對象,執行一個驗證并在驗證OK的時候返回true 反之返回false;后者的情況下,一個錯誤信息將被生成。 所以我們開始第一個測試類。 TestERegValidator 繼承 TestCase。通過測試類在以它們所要測試的類名稱來命名。第一個驗證類接受一個文本值和一個正則表達式模式來執行驗證。 ~~~ class TestERegValidator extends haxe.unit.TestCase { public function testValidateFalse() { var v = new ERegValidator(“test”, “x”, null); assertFalse(v.validate()); } } ~~~ 記住,正則表達式在 Flash 9 版本之前沒有出現。 在測試中,一個 ERegValidator 類的實例被初始化。第一個測試會檢查一個字符串值是否匹配模式 x;這通過 assertFalse 來描述,如果傳遞的參數為 true 則會失敗。測試類和第一個測試準備好了,但是明顯的,這段代碼本身不能被編譯,因為類 ERegValidator 還不存在。 ~~~ class ERegValidator { public function new(value : String, pattern : String, opt : String) {} public function validate() : Bool { return true; } } ~~~ 現在代碼準好被編譯了;但是一個最后的事情漏掉了,還需要一個入口類 和一個 main 方法來運行測試并查看結果。 ~~~ class Main { static function main() { var runner = new haxe.unit.TestRunner(); runner.add(new TestERegValidator()); runner.run(); } } ~~~ 要讓這段代碼在所有的三個平臺工作,下面的 .hxml 文件用來編譯。在編譯單元測試時打開 -debug 開關尤為重要,因為在失敗的情況下更容易發現和糾正錯誤。 ~~~ # Neko -neko main.n -main Main -debug --next # Flash9 -swf main.swf -swf-version 9 -main Main -debug --next # Javascript -js main.js -main Main -debug ~~~ 編譯結束會在每個平臺產生同樣的結果。 ~~~ Class: TestERegValidator F * TestERegValidator::testValidateFalse() ERR: Main.hx:12(TestERegValidator.testValidate) - expected false but was true // here are omitted some lines of debugging information // that vary with the different platforms FAILED 1 tests, 1 failed, 0 success ~~~ 這是預期的結果;代碼編譯但是并沒有工作,因為驗證函數總是返回 true ,而斷言期待一個 false 參數。因此,只有測試需要的代碼被引入: ~~~ class ERegValidator { public function new(value:String, pattern:String, ?opt:String) {} public function validate() : Bool { return false; } } ~~~ 現在執行代碼會報告: ~~~ Class: TestERegValidator . OK 1 tests, 0 failed, 1 success ~~~ 一個新的失敗的測試被引入: ~~~ public function testValidateTrue() { var v = new ERegValidator(“test”, “t”, null); assertTrue(v.validate()); } ~~~ 這次測試運行兩個,其中一個會失敗。是時候調整代碼來使兩個測試驗證可能會通過。 ~~~ class ERegValidator { private var value : String; private var pattern : String; private var opt : String; public function new(value : String, pattern : String, ?opt : String) { this.value = value; this.pattern = pattern; this.opt = if(opt == null) “” else opt; } public function validate() : Bool { var er = new EReg(pattern, opt); return er.match(value); } } ~~~ 構造器參數現在保存在實例,可以有效的用于驗證。現在,失敗的情況下,一個錯誤需要提供來通知用戶,一些故障阻止了驗證過程成功完成。新的測試被添加: ~~~ public function testEmptyError() { var v = new ERegValidator(“test”, “t”); v.validate(); assertEquals(v.error, null); } ~~~ 需要類中一個新的變量 error,在成功驗證的情況下,它必須有一個 null 值。 ~~~ public var error(default, null) : String; ~~~ 然后開始另一個測試。 創建測試和實現代碼的過程會被重復很多次直到所有所需功能都被實現。所有這些迭代的結果是類ERegValidator的完成;一個新的類 EmailValidator 也被引入,通過它的對應的測試類 TestEmailValidator。 ~~~ class TestEmailValidator extends haxe.unit.TestCase { public function testConventional() { var v = new EmailValidator(“john@example.com”); assertTrue(v.validate()); } public function testDirty() { var v = new EmailValidator(“john @example.com”); // spaces are not allowed assertFalse(v.validate()); } public function testIncomplete() { var v = new EmailValidator(“john”); assertFalse(v.validate()); } public function testDoubleDotted() { var v = new EmailValidator(“john@example..com”); assertFalse(v.validate()); } } class TestERegValidator extends haxe.unit.TestCase { public function testValidateTrue() { var v = new ERegValidator(“test”, “t”); assertTrue(v.validate()); } public function testValidateFalse() { var v = new ERegValidator(“test”, “x”); assertFalse(v.validate()); } public function testEmptyError() { var v = new ERegValidator(“test”, “t”); v.validate(); assertTrue(v.error == null); } public function testNotEmptyError() { var v = new ERegValidator(“test”, “x”); v.validate(); assertTrue(v.error != null); } public function testErrorContent() { var value = “test”; var pattern = “x”; var v = new ERegValidator(value, pattern); v.validate(); assertTrue(v.error.indexOf(value) > = 0); assertTrue(v.error.indexOf(pattern) > = 0); } } class EmailValidator extends ERegValidator { public function new (email : String) { super(email, “^([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})$”, “i”); } } class ERegValidator { public var error(default, null) : String; private var value : String; private var pattern : String; private var opt : String; public function new(value : String, pattern : String, ?opt : String) { this.value = value; this.pattern = pattern; this.opt = if(opt == null) “” else opt; } public function validate() : Bool { var er = new EReg(pattern, opt); if(er.match(value)) return true; else { error = “’”+value+”’ does not match the expression /”+pattern+”/”; return false; } } } ~~~ 框架可以被繼承,和添加新的數值范圍,信用卡號碼,電話號碼等等的驗證類。一個公共的接口 Validator 可以被引入來使這些類交換,可能改變 error 變量類型從 String 為 List<String>是一個好主意。這個方式一個 獨立的 Validator 可以通知更多的錯誤信息。一個一般的 ValidatorGroup 類可以引入來一次性執行許多鏈式驗證。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看