Việc mua lại từ đây là Thất bại nhanh .
Chúng tôi không có mã, chúng tôi cũng không có nhiều ví dụ về các tiền tố đang hoặc không phải là tiền tố nhánh thử nghiệm theo mã. Tất cả chúng ta có là đây:
- 089 - 100 => chi nhánh kiểm tra
- 10B, 10C => nhánh thử nghiệm
- <088 => có lẽ là các chi nhánh thực
- > 100 => có lẽ là chi nhánh thực
Thực tế là mã cho phép số và chuỗi nhiều hơn một chút lạ. Tất nhiên, 10B và 10C có thể được coi là số hex, nhưng nếu tất cả các tiền tố được coi là số hex, 10B và 10C nằm ngoài phạm vi thử nghiệm và sẽ được coi là các nhánh thực.
Điều này có thể có nghĩa là tiền tố được lưu trữ dưới dạng một chuỗi nhưng được coi là một số trong một số trường hợp. Đây là mã đơn giản nhất tôi có thể nghĩ ra để sao chép hành vi này (sử dụng C # cho mục đích minh họa):
bool IsTest(string strPrefix) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix))
return iPrefix >= 89 && iPrefix <= 100;
return true; //here is the problem
}
Trong tiếng Anh, nếu chuỗi là một số và nằm trong khoảng từ 89 đến 100, thì đó là một bài kiểm tra. Nếu nó không phải là một con số, nó là một bài kiểm tra. Nếu không, nó không phải là một bài kiểm tra.
Nếu mã theo mẫu này, sẽ không có thử nghiệm đơn vị nào bắt được điều này tại thời điểm mã được triển khai. Dưới đây là một số ví dụ kiểm tra đơn vị:
assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change
Thử nghiệm đơn vị cho thấy "10B" nên được coi là một nhánh thử nghiệm. Người dùng @ gnasher729 ở trên nói rằng các quy tắc kinh doanh đã thay đổi và đó là những gì khẳng định cuối cùng ở trên cho thấy. Tại một số điểm mà khẳng định lẽ ra đã chuyển sang một isFalse
, nhưng điều đó đã không xảy ra. Các bài kiểm tra đơn vị được chạy ở thời điểm phát triển và xây dựng nhưng sau đó không có điểm nào sau đó.
Bài học ở đây là gì? Mã cần một số cách để báo hiệu rằng nó đã nhận được đầu vào bất ngờ. Đây là một cách khác để viết mã này nhấn mạnh rằng nó hy vọng tiền tố là một số:
// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix)) {
isTest = iPrefix >= 89 && iPrefix <= 100;
return true;
}
isTest = true; //this is just some value that won't be read
return false;
}
Đối với những người không biết C #, giá trị trả về cho biết mã có thể phân tích tiền tố từ chuỗi đã cho hay không. Nếu giá trị trả về là true, mã gọi có thể sử dụng biến isTest out để kiểm tra xem tiền tố nhánh có phải là tiền tố kiểm tra hay không. Nếu giá trị trả về là sai, mã gọi sẽ báo cáo rằng tiền tố đã cho không được mong đợi và biến isTest out là vô nghĩa và nên được bỏ qua.
Nếu bạn ổn với ngoại lệ, bạn có thể làm điều này thay vào đó:
// Alternative B
bool IsTest(string strPrefix) {
int iPrefix = int.Parse(strPrefix);
return iPrefix >= 89 && iPrefix <= 100;
}
Sự thay thế này là đơn giản hơn. Trong trường hợp này, mã gọi cần phải bắt ngoại lệ. Trong cả hai trường hợp, mã nên có một số cách báo cáo cho người gọi rằng nó không mong đợi một strPrefix không thể được chuyển đổi thành một số nguyên. Bằng cách này, mã thất bại nhanh chóng và ngân hàng có thể nhanh chóng tìm ra vấn đề mà không có sự bối rối tốt của SEC.