Ngạc nhiên, ngạc nhiên!
Vào đầu hè năm 1942, trong khi quân Anh chiến đấu với quân đội của Hitler một cách vô vọng ở phía nam và đông của Anh Quốc, và Mỹ hoảng loạn tìm kiếm điệp viên Xô Viết ở bộ máy phía trên, Đế Quốc Nhật Bản tấn công Trân Châu Cảng bằng một cuộc tấn công bất ngờ và vĩ đại.
Đô đốc Yamamoto muốn tấn công từ sáu tháng trước, nhưng bị trì hoãn do phải đàm phán với Hitler và Stalin. Kể cả thế, Mỹ đang trong tình trạng hỗn loạn đến mức ông cảm thấy tự tin rằng ông có thể loại bỏ mối nguy đến từ Mỹ và tự do tung hoành trên biển Thái Bình Dương.
Nhưng đó không phải cách mà mọi chuyện xảy ra. Không hề.
Vào 0740 ngày mùng 6 tháng 6, Sabura Sakei lái chiếc “zero” về phía nam hướng tới Oahu trong một nhóm gồm hai tá phi công chiến đấu và máy bay thả ngư lôi. Ông luôn canh chừng cả trên bầu trời và dưới biển, nhìn trái rồi phải, lên rồi xuống, coi chừng máy bay và tàu có khả năng đe dọa ông. Khi chỉ còn cách cảng 8 dặm ông thấy một chiếc “zero” trong nhóm đột ngột phát nổ không hề có cảnh báo. Ông theo bản năng kéo cần để thoát khỏi đội hình, và ngay nửa giây sau quan sát được một chiếc nữa trong đoàn phát nổ.
Sau đó, ông nói với những người bắt được ông rằng nó như ở trong máy nổ bỏng ngô. Máy bay nối tiếp máy bay phát nổ trước cả khi phi công có thể hành động để tránh. Số ít người thoát được khỏi đội hình có kết cục tốt hơn chút. Sakei có thể thấy vệt khói trắng vạch về phía bắc trên đường bay của máy bay “zero” và theo sau những chiếc phá khỏi đội hình.
Dĩ nhiên ông không hề thấy được ở phía sau mình.
“Ừ nhưng ta cần phải loại bỏ lớp Utilities kia đi.” Avery trả lời. “Để xem ta có làm xong được trước khi Jerry bảo ta nghỉ hết ngày.”
“Kế hoạch ổn đấy.” Tôi đáp lại.
“Đúng!”
Tôi kéo lớp Utilities lên màn hình.
Cả hai chúng tôi nhìn nó trong khoảng 30 giây. Tôi nói: “Tao nghĩ mình nên bỏ phương thức cuối, getSuitsInInventory, tao cá là loại bỏ khá dễ.”
“Tao nghĩ là tao đồng ý với mày.” Avery gọi lệnh “tìm kiếm chỗ sử dụng”. Kết quả cho thấy nó chỉ được dùng ở một chỗ: một lớp fixture tên là SuitsInInventory. Hắn đưa lên màn hình.
Avery quan sát màn hình vài giây và nói: “Tao nghĩ sắp bỏ được rồi.” Hắn ấn vào chức năng getSuitsInInventory và gọi ở trên dòng. Phần gọi đến chức năng được tự động thay thế bởi phần được viết của nó…
… và chức năng được tự động loại bỏ khỏi Utilities.
Chúng tôi nhìn nhau với nụ cười xảo trá và đồng thời nói: “Loại bỏ!”
Tất cả các bài unit test đều vẫn đạt, và trang FitNesse vẫn đạt. Không có gì hỏng cả.
“Sang chức năng tiếp theo.” Tôi nói.
Cả hai nhìn vào acceptMessageFromManufacturing.
“Hmmm” Avery nói, “Tao đoán là mày đồng ý loại bỏ không phải là phương án trong trường hợp này.”
“Chắc rồi.” Tôi nói. “Tao nghĩ chuyển ra chỗ khác là phương án hợp lý hơn.”
“Có vẻ. Nhưng ra đâu?”
Đó là một câu hỏi hay. Chức năng này chứa một chút tư duy về chính sách ở trong đó. Đây là chức năng chấp nhận việc chuyển đồ từ bên sản xuất. Đây là chức năng đưa bộ đồ vào trong kho.
“Nếu có chức năng hoàn thành việc đăng ký gọi là gì?” Tôi hỏi.
“Thư ký? Người bán? À, là … Registraar!”
Chúng tôi đều nhìn nhau với một nụ cười và lặp lại: “Một Registraar!”
Tôi lấy bàn phím và ấn vào phương thức. Tôi gọi lệnh ‘chuyển’ và gõ dtrack.policy.Registraar. Sau khi xác nhận là tôi thực sự muốn tạo gói policy và lớp Registraar, phương thức được tự động chuyển đi.
“Đã chuyển!” cả hai hét lên.
Lúc này lớp Utilities trông vô cùng còi cọc.
“Cái chết đang cận kề lớp này.” Tôi cười mỉa và nói.
“Không còn nghi ngờ gì nữa. Và tao nghĩ tao đã thấy mục tiêu kế tiếp. Mày thấy sao về việc bỏ biến suiteGateway đi?”
“Tao nghĩ là tao sẽ thích làm việc đó.” Tôi đáp lại.
Avery lấy bàn phím, ấn vào cái biến đã tới số, và gọi lệnh ‘chuyển’. Hắn chọn lớp SuiteGateway làm mục tiêu. Và biến được chuyển đi một cách tự động.
“Thú vị đấy.” Tôi nói. “Phần khởi tạo cũng bị chuyển đi luôn. Tao không chắc là tao thích thế. Có vẻ như SuitGateway không nên can thiệp đến phần gọi vào sau nó.”
“Tao e là tao đồng ý, Alphonse. Phần khởi tạo nên đặt ở chỗ khác. Tao không rõ nên ở đâu?”
Điều này làm bọn tôi phải nghĩ, và thôi dần mấy câu đùa cợt.
“Chúng ta cần chức năng khởi tạo ở đâu đó… Nhưng chỗ nào nên gọi nó?”
“Ừ, tao không biết. Cứ để todo ở đây và hỏi lúc Jerry quay lại. Tao không muốn vấn đề này làm xao nhãng việc loại bỏ lớp Utilities”
“Đồng ý! Loại bỏ mới là mục tiêu!”
Và Avery đặt ghi chú todo vào phần khởi tạo.
“Được rồi, giờ tìm xem chỗ nào sử dụng biến đó.” Tôi nói. Tôi lấy bàn phím và “tìm chỗ sử dụng” của biến. Nó được dùng ở 6 chỗ. Tất cả đều trông như này:
“Tao thấy nó có vẻ không cần thiết.” Tôi nói.
“Tao đồng ý. Đề xuất là chúng ta thay đổi tên biến.” Tôi ấn vào biến và gọi lệnh ‘đổi tên’, thay tên biến thành instance. Giờ tất cả những chỗ sử dụng trông như này:
Avery nhìn màn hình một lúc và nói: “Chắc chắn là có tiến bộ. Nhưng tao nghĩ ta có thể làm tốt hơn.” Avery sử dụng lệnh ‘đổi tên’ để thay SuitGateway thành ISuitGateway. Sau đó hắn chuyển biến instance sang lớp mới có tên SuitGateway. Rồi hắn tìm chỗ sử dụng của biến instance và sửa chỗ đầu tiên bằng cách loại bỏ biến như sau:
Nó làm cho câu lệnh chuyển sang màu đỏ, hiển thị rằng sẽ không biên dịch được. Avery ấn vào hình bóng đèn bên cạnh dòng mã và chọn ‘tạo phương thức getNumberOfSuits’. Nó tự động tạo phương thức trong lớp SuiteGateway. Cuối cùng, Avery chỉnh phương thức để sử dụng thông qua biến instance. Tất cả các bài kiểm thử vẫn đạt.
Avery thay đổi tất cả chỗ sử dụng biến instance tương tự. Giờ SuitGateway trông như này:
“Avery, mày đúng là thiên tài!” Tôi nói. Tôi thực sự ấn tượng.
“Tao biết.” Hắn nói với nụ cười khểnh. Và cả hai đều cười.
“Trông đẹp thật.” Tôi nói tiếp. “Phần SuitGateway có thể sử dụng một cách đơn giản, nhưng đồng thời nó cũng đa hình. Chúng ta có thể đặt bất kỳ phần phát sinh nào của ISuitGateway mà ta muốn vào trong biến instance.
“Đúng, nhưng ta vẫn phải tìm cách khởi tạo nó.”
“Ừ. Thế lớp Utilites giờ trông như nào?”
Tôi lấy bàn phím và kéo nó lên màn hình.
“Chà!” Tôi nói. “Không còn gì ngoài mấy cái ngày tháng, và cái biến MockManufacturing quái lạ.”
“Ừ, và tao cá chúng ta có thể bỏ biến đó như cách ta bỏ biến SuitGateway.”
“Ừ! Một lớp Manufacturing, liên hệ tới object IManufacturing. Gọn!”
Vừa lúc đó, Jerry bước vào. “Này mấy đứa, đến giờ ăn tối rồi.”
“Hả!” Avery và tôi nhìn nhau ngạc nhiên. Thời gian trôi đâu mất rồi?
Jerry nhìn vào lớp Utilities. “Trời, có vẻ như hai đứa mải dọn dẹp mọi thứ hả? Tốt. Để vừa ăn tối vừa nói. Đi thôi.”
Và rồi bọn tôi rời phòng máy cuối ngày… và đúng là một ngày năng suất!
0 Lời bình