private void buttonExe_Click(object sender, EventArgs e) { LotteryFormInputData inputData = GenerateInputData(); LotteryFormOutputData outputData = _lotteryController.GenerateLotteryNumber(inputData); String outputTextString = ""; if (outputData.IsSuccess) { outputTextString += "產生成功\r\n"; outputTextString += "抽出號碼為:\r\n"; List <int> numbers = outputData.LotteryNumbers; for (int i = 0; i < numbers.Count - 1; i++) { outputTextString += numbers[i] + ","; } outputTextString += numbers.Last() + "\r\n"; if (outputData.HasSpecialNumber) { outputTextString += "特別號碼為:" + outputData.SpecialNumber + "\r\n"; } } else { outputTextString += "產生失敗\r\n"; foreach (String message in outputData.ErrorMessageList) { outputTextString += message + "\r\n"; } } textBoxResult.Text = outputTextString; }
private bool CheckLogic(LotteryFormInputData lotteryFormData) { if (_tempGettingNumberCount < _minGettingNumberCount) { CommonWriteMustGraterThan(lotteryFormData.GettingNumberCountTuple.Item1, _minGettingNumberCount); return(false); } if (_tempNumberSourceType == EnumNumberSourceType.Count) { return(CommonLogicValidate(_tempSourceNumberCount, lotteryFormData.SourceNumberCountTuple.Item1, lotteryFormData.GettingNumberCountTuple.Item1)); } if (_tempNumberSourceType == EnumNumberSourceType.NumberRange) { if (_tempStartNumber > _tempEndNumber) { CommonWriteMustGraterEqual(lotteryFormData.StartNumberTuple.Item1, lotteryFormData.EndNumberTuple.Item1); } return(CommonLogicValidate(_tempEndNumber - _tempStartNumber + 1, _validatorMessage.SourceNumberConut, lotteryFormData.GettingNumberCountTuple.Item1)); } _errorMessages.Add(_validatorMessage.Field + " " + lotteryFormData.NumberSourceTypeTuple.Item1 + " " + _validatorMessage.InputDataAbnormal); return(false); }
private bool CheckFormat(LotteryFormInputData lotteryFormData) { //^[0-9]+$ //直接把數字轉出來,存入實體變數 _tempNumberSourceType = lotteryFormData.NumberSourceTypeTuple.Item2; if (_tempNumberSourceType == EnumNumberSourceType.Count) { if (!VerifyTupleAndGetNumber(lotteryFormData.SourceNumberCountTuple, ref _tempSourceNumberCount)) { return(false); } } else if (_tempNumberSourceType == EnumNumberSourceType.NumberRange) { if (!(VerifyTupleAndGetNumber(lotteryFormData.StartNumberTuple, ref _tempStartNumber) && VerifyTupleAndGetNumber(lotteryFormData.EndNumberTuple, ref _tempEndNumber))) { return(false); } } else { //除非程式異常,否則不可能出現的錯誤 _errorMessages.Add(_validatorMessage.Field + " " + lotteryFormData.NumberSourceTypeTuple.Item1 + " " + _validatorMessage.InputDataAbnormal); return(false); } if (!VerifyTupleAndGetNumber(lotteryFormData.GettingNumberCountTuple, ref _tempGettingNumberCount)) { return(false); } //此項目沒有格式的驗證 _tempHasSpecialNumber = lotteryFormData.HasSpecialNumberTuple.Item2; return(true); }
/// <summary> /// /// </summary> /// <param name="lotteryFormData"></param> ///<param name="errorMessages">輸出的錯誤訊息</param> ///<returns>true Pass,false Fail</returns> public virtual bool Validate(LotteryFormInputData lotteryFormData, out IList <String> errorMessages) { //1.驗證格式 //2.驗證業務邏輯 _errorMessages.Clear(); errorMessages = _errorMessages; if (!CheckFormat(lotteryFormData)) { //如果驗證失敗,進行業務邏輯的驗證會發生異常 return(false); } return(CheckLogic(lotteryFormData)); }
/// <summary> /// 產生存放輸入資料的物件 /// </summary> /// <returns></returns> private LotteryFormInputData GenerateInputData() { //LotteryFormInputData是共用同一個還是用完就丟,由此method決定 LotteryFormInputData lotteryFormInputData = new LotteryFormInputData(); EnumNumberSourceType inputType = radioButtonCount.Checked ? EnumNumberSourceType.Count : EnumNumberSourceType.NumberRange; lotteryFormInputData.NumberSourceTypeTuple = new Tuple <string, EnumNumberSourceType>(grpgroupBoxSource.Text + grpgroupBoxSourceType.Text, inputType); lotteryFormInputData.SourceNumberCountTuple = new Tuple <string, string>(grpgroupBoxSource.Text + LabelNumberCount.Text, textBoxNumberCount.Text); lotteryFormInputData.StartNumberTuple = new Tuple <string, string>(grpgroupBoxSource.Text + LabelStartNumber.Text, textBoxStartNumber.Text); lotteryFormInputData.EndNumberTuple = new Tuple <string, string>(grpgroupBoxSource.Text + LabelEndNumber.Text, textBoxEndNumber.Text); lotteryFormInputData.HasSpecialNumberTuple = new Tuple <string, bool>(CheckBoxSpecialNumber.Text, CheckBoxSpecialNumber.Checked); lotteryFormInputData.GettingNumberCountTuple = new Tuple <string, string>(grpgroupBoxNumberGet.Text + LabelGettingCount.Text, textBoxGetCount.Text); return(lotteryFormInputData); }
public LotteryFormOutputData GenerateLotteryNumber(LotteryFormInputData lotteryFormData) { var outputData = new LotteryFormOutputData(); IList <String> errorList; if (!_inputDataValidator.Validate(lotteryFormData, out errorList)) { outputData.ErrorMessageList = errorList; outputData.IsSuccess = false; //做失敗處理 } else { //因為已經對資料做過驗證,所以不做資料異常的判斷與錯誤處理 IEnumerable <int> gettingNumbers; EnumNumberSourceType numberSourceType = lotteryFormData.NumberSourceTypeTuple.Item2; int gettingNumberCount = int.Parse(lotteryFormData.GettingNumberCountTuple.Item2); bool hasSpecialNumber = lotteryFormData.HasSpecialNumberTuple.Item2; gettingNumberCount = hasSpecialNumber ? gettingNumberCount + 1 : gettingNumberCount; if (numberSourceType == EnumNumberSourceType.Count) { int sourceNumberCount = int.Parse(lotteryFormData.SourceNumberCountTuple.Item2); gettingNumbers = _generateNumbersService.GenerateRandomsNumbersByCount(sourceNumberCount, gettingNumberCount); } else { int startNumber = int.Parse(lotteryFormData.StartNumberTuple.Item2); int endNumber = int.Parse(lotteryFormData.EndNumberTuple.Item2); gettingNumbers = _generateNumbersService.GenerateRandomNumbersByNumberRange(startNumber, endNumber, gettingNumberCount); } List <int> randomList = gettingNumbers.ToList(); if (hasSpecialNumber) { //取出亂數一開始的寫法是 //取出的亂數結果本身是沒有經過排序的 //所以隨便取固定位置(如第一個)就可以了 //但是取出亂數的實作方式應該要是可以改變的 //不該假定結果一定沒有排序過 //所以這裡還是用比較麻煩的方式:使用亂數抽一個數出來當特別號 int removeIndex = _random.Next(randomList.Count); int specialNumber = randomList[removeIndex]; //這裡不驗證是否移除成功 randomList.RemoveAt(removeIndex); outputData.HasSpecialNumber = true; outputData.SpecialNumber = specialNumber; } else { outputData.HasSpecialNumber = false; } randomList.Sort(); outputData.LotteryNumbers = randomList; //計算結果 outputData.IsSuccess = true; } return(outputData); }