Vào mùa đông năm 1943, và mùa hè năm 1944 vệ tinh do thám của Mỹ quan sát sức mạnh của phe Trục tập trung thành một hạm đội bên bờ tây của châu Phi. Phe Mỹ để ý sát sao quá trình tạo dựng này, và những nhiệm vụ do thám liên quan tới nó. Quân do thám phe Trục tập trung vào bán đảo Yucatan. Mục đích của họ quá rõ ràng. Phe Trục lúc đó đang lên kế hoạch cho một cuộc xâm lược lớn vào Mexico; giường như hi vọng vào việc thành lập một căn cứ có thể tấn công trực tiếp vào trung tâm nước Mỹ.
Tướng quân MacArthur cười khi xem những bức ảnh vệ tinh và báo cáo tình báo tưởng như vô tận. Những hành động đơn giản của quân địch cho ông biết rằng chúng không biết về việc đang bị theo dõi từ trên cao. Và nếu chúng không biết về những máy quay trên quỹ đạo, thì chúng chắc chắn không biết rằng tên lửa của Von Braun có thể bắn đạn hạt nhân đến bất kỳ đâu trên thế giới. Nụ cười của MacArthur càng nở to. Có vô vàn sự lựa chọn! Ông không biết nên làm gì tiếp nhưng ông sẽ nghĩ ra thứ gì đó.
“Làm cho bài này đạt chắc không khó.” Tôi nói. “Thử xem lỗi đầu tiên nào.” Tôi kéo bài kiểm thử lên màn hình.
(tô màu bảng, màu đỏ và màu xanh)
Do Fixture | |||
start | start dtrack.fixtures.DTrackFixture | ||
đặt đồ | 314159 | đã đăng ký | |
kiểm tra | đồ đăng ký | 314159 | muốn trả về false |
trả về true | |||
kiểm tra | có tin nhắn sang sản xuất | muốn trả về false | |
trả về true | |||
kiểm tra | số lượng đồ đã đăng ký | 1 (màu xanh) | (màu xanh) |
kiểm tra | thông báo lỗi | Bộ 314159 đã được đăng ký | muốn trả về true |
trả về false |
“Được rồi, dòng đầu tiên không đạt là dòng kiểm tra đồ đăng ký. Việc đăng ký thất bại là do 314159 là bộ đồ bị lặp. Vậy ta cần phải đặt phần kiểm tra lặp vào trong chức năng fixture gọi đến.”
Jasper gật đầu thông thái, và thêm cái mới là không nói gì. Tôi kéo DTrackFixture lên và xem phương thức registerSuit.
Tôi nhìn vào chức năng trong vài giây, cố hiểu xem nó ám chỉ điều gì. Cuối cùng tôi nói: “Được rồi, Utilities.manufacturing.registerSuit là chức năng gửi tin nhắn đến bên Sản Xuất để kiểm tra xem bộ đồ có phải thật không, và có phải nó được duyệt sang bảo trì bên ngoài.”
“Có vẻ tên nó không đúng, phải không?” Jasper hỏi.
“Không. không đúng. Nó có lẽ nên được đặt tên đại loại kiểu requestApprovalForRegistration. Để tao sửa.” Rồi tôi nhanh chóng sửa tên của chức năng.
“Thử xem tiếp chức năng đó xem có cần đổi tên chỗ nào không.” Jasper gợi ý. Tôi đồng ý và mở lớp Manufacturing.
Jasper chỉ vào màn hình. “Ừ, chỗ SuitRegistrationMessage chắc phải để là SuitRegistrationApprovalRequest, đúng không?”
“Tao đồng ý.” Và tôi sửa nhanh. “Trời, ta chọn tên không hay lắm nhỉ?”
Nụ cười to kéo dài trên mặt Jasper. “Thôi, Alphonse, không phải lo! Mày mới làm việc với đống mã này trong một ngày. Nhìn xem có phải ta đã nhanh chóng tìm ra vấn đề đặt tên, và giải quyết chúng dễ như nào.”
“Ừ nhưng mà nếu ta nghĩ thêm trước lúc đặt tên…”
“Như thế thì ta sẽ không đạt nhiều bài kiểm thử như bây giờ! Và ta cũng sẽ không chắc về mấy cái tên như bây giờ! Thôi nào Al! Mày biết mà!”
Nụ cười của Jasper càng to hơn bao giờ hết. Mắt hắn lấp lánh. Tôi giơ tay lên và nói: “Được rồi, được rồi, mày đúng. Bình tĩnh đi Jasper! Và nhớ là, tên tao là Alphonse.”
Jasper quay trở lại, gật đầu, và quay lại về phía màn hình. “Đúng. Xin lỗi. Được rồi, để xem lớp SuitRegistrationApprovalRequest.”
Tôi nhìn một lượt và nói: “Ừ, phần chuỗi ID đặt không hay lắm. Nó nên để là “Chấp thuận Đăng ký Đồ”.
Tôi đang định thay đổi thì Jasper cản. “Tao không chắc. Tao thậm chí không nghĩ nó là nó nên để là string.”
“Ý mày là sao? Nó nên để là gì?”
Jasper gãi đầu vài giây và nói. “Nó nên là interger độc nhất, hoặc là một enum, hoặc, tao nghĩ nó cũng có thể là string. Chỉ là nó không nên gắn với tên của lớp. Tao không muốn thay đổi mã ID chỉ vì ta quyết định thay đổi chữ ở trong chuỗi ký tự.”
“Ừ đúng, SRP!” tôi nói.
“Đúng! Single Responsibility Principle. Giỏi lắm Alphonse!”
Tôi ném cho hắn một cái nhìn, và hắn bỏ nụ cười trên mặt.
“Chúng ta vẫn có thể dùng string.” Tôi nói. “Thế này thì sao.” Và tôi lấy bàn phím.
Jasper nhìn một lúc và nói: “Hmmm. Thông minh. Nhưng nó vẫn sẽ bị đổi nếu như tên lớp thay đổi.”
“Ừ, nhưng ta không phải thay trực tiếp vào mã nguồn!” Tôi nói đầy nhiệt huyết.
“Đúng, nhưng do chuỗi ký tự thay đổi, nó sẽ là thay đổi vào mã nguồn và phá vỡ giao thức của Manufacturing. Hệ thống Manufacturing sẽ cần phải biên dịch và đưa vào hoạt động lại.”
“Hmmm. Ừ, nhưng nếu ta thay đổi mã, không phải là đằng nào Manufacturing cũng phải biên dịch lại hệ thống của họ?”
Jasper ngồi đơ trên ghế. Mặt hắn trông bối rối đến hài hước. “Đợi đã! Chúng ta không được gửi object sang hệ thống Manufacturing! Chúng ta phải gửi một gói tin XML hoặc cái gì đó!” Jasper bật khỏi ghế và gọi với sang Carole. “Carole, định dạng tin nhắn ta gửi sang và nhận từ Manufacturing là gì?”
Carole đang làm việc với Jean về cái gì đó. Cô ấy nhìn lên và nói “Nó là XML. Tôi mới thêm miêu tả cho phần tin nhắn vào trang wiki hôm qua. Xem ở đấy xem.” Và cô ấy quay lại làm việc với Jean.
Jerry và Avery lúc đó đang bận làm việc ở bàn đối diện bọn tôi. Có vẻ như Jerry nghe thấy câu hỏi của Jasper vì hắn ngẩng đầu lên và nói: “Ừ, tao mới đọc bài wiki của Carole. Tin nhắn XML đơn giản lắm Jasper. Không có thuộc tính hay gì cả, mỗi trường chỉ có một thẻ. Gói tin được gửi đi giữa hai hệ thống chỉ là chữ thuần thôi.”
Jasper gật đầu cảm ơn và ngồi xuống. “Được rồi, thế cũng tốt. Chúng ta tạm thời có thể quên nó đi.”
Tôi bối rối: “Sao ta lại được quên nó đi? Không phải là ta phải tạo chuỗi ký tự XML sao?”
“Ừ, nhưng không phải bây giờ. Chúng ta sẽ viết lớp phiên dịch nhận vào object tin nhắn và chuyển đổi sang XML sau.”
Tôi nghĩ vài giây và nói: “À, được, vậy ta sẽ viết phương thức trừu tượng send trong lớp Manufacturing để dịch yêu cầu sang XML.”
“Ừ, đại loại thế.”
Tôi gật đầu. Nó có lý. Phần sau của lớp Manufacturing có thể xử lý XML sau. Chúng tôi không phải lo về nó lúc này.
“Được rồi, giờ quay lại với vấn đề ban đầu. Làm sao để ta cho bài kiểm thử này đạt?”
Jasper nói: “Quay lại lớp DTrackFixture ban đầu và xem phương thức registerSuit.”
Jasper tiếp tục: “Phần fixture này không nên gọi requestApprovalForRegistration, đúng không? Chức năng đó đáng lẽ không được gọi bởi bất kỳ fixture nào. Xin chấp thuận là một phần của quá trình đăng ký. Chúng ta cần object xử lý cả quá trình đăng ký.”
“Avery và tao vừa tạo một object như thế chiều hôm qua! Bọn tao gọi là Registar.”
“Ừ, tao biết.” Jasper chen vào. “Jerry bảo tao lúc bữa tối hôm qua. Đó là lúc bọn tao quyết định hai ta nên làm việc cùng nhau hôm nay.”
Tôi không quan tâm nó nghe như nào. Mấy tên du mục này nói về Avery và tôi sau lưng bọn tôi, lên kế hoạch cho bọn tôi. Tôi đoán đây là một phần của công việc của bọn họ, nhưng tôi không thích như thế. Nếu họ lên kế hoạch liên quan đến tôi, họ nên tham khảo tôi!
Tôi quên ý nghĩ nó đi và giữ lại cho lúc sau. “Được rồi, tao có ý này.” Tôi lấy bàn phím và bắt đầu gõ.
Jasper cười nhưng có chút đểu cáng. Cái cách hắn đưa mắt nhìn quanh và lắc đầu làm tôi biết có thứ gì đó đang làm hắn ngứa ngáy. Hắn đang cố kiềm chế không nói cái gì đó. Tôi chợt nghĩ ra là nên cho hắn chơi Poker. “Jasper, mày cười cái gì thế?”
Hắn thực sự bật cười, nhìn tôi với nụ cười rộng khó tin, và nói: “Fonse… Alphonse, lần cuối mày chạy bài kiểm thử là lúc nào?”
Chết. Đã được một lúc rồi. Tôi thay đổi tên một loại. Nhưng những thay đổi đó đơn giản! Tôi chạy bài kiểm thử.
Một bài unit test không đạt, và tất cả các bài kiểm thử đều không đạt.
“Au!” Tôi nói.
“Đúng là au!” Jasper nói với một nụ cười rộng hơn cả.