Thợ lành nghề #33: Dọn dẹp ở gian số 10

Thợ lành nghề

Nguyên lý bất định Heisenberg.

Werner Heisenberg yêu nước Đức, nhưng căm thù quân phát xít. Năm 1939, ông gia nhập vào nhánh của Neils Bohr trong đội nghiên cứu. Ông đã đưa ra một quyết định đau lòng là rời bỏ Đức để đến nước Mỹ; và không may là ông đã tốn rất nhiều thời gian để đưa ra quyết định đó.

Quân SS chưa bao giờ rời mắt khỏi Heisenberg sau vụ “Do Thái Trắng”. Họ cũng để ý thấy rằng cách cư xử của một số nhà khoa học Đức đã thay đổi. Khi Von Braun mất tích, quân SS tăng cường để ý đến các nhà khoa học khác. Chúng hoảng hốt khi Von Braun không phải là người duy nhất biến mất. Nhưng chúng đã phát hiện ra Heisenberg ở bến xe bus.

Cuộc di dời khỏi nước Đức được lên kế hoạch kỹ lưỡng và đồng nhất. Nhưng lòng yêu nước của Heisenberg đã làm ông lỡ nhịp. Ông đáng lẽ phải có mặt trên chuyến xe bus, nhưng thấy rằng ông không thể ép bản thân lên xe. Ông đứng nhìn nó đi mất. Trong khi đứng ở bến xe bus, dặn bản thân phải lên chuyến sau, quân áo đen đã phát hiện ra ông.

Dưới sự chăm sóc của các chuyên gia – và chắc chắn quân SS có chuyên gia – con người ta sẽ tiết lộ thông tin mà không cần phải nói ra một lời nào. Ngôn ngữ hình thể phản ứng với những bức ảnh đưa ra đúng thời điểm, hoặc những câu kết luận, sẽ tiết lộ những gì người đó không dám mở miệng ra nói. Heisenberg không hề nói ra câu nào. Ông quyết tâm chống cự. Một trong những người tra tấn nói rằng: “Ông ta đã đấu tranh rất nhiều. Dành cả trái tim của mình vào việc đó.”

Có thể ông đã đấu tranh lại, nhưng những gì được tiết lộ một cách gián tiếp là quá đủ. Khi Stalin tiếp cận Hitler sau đó để kéo dài thời gian đồng minh, và đưa tin tình báo thu thập được từ Nimbus làm lý do, Hitler đã trân trọng sự chính xác và giá trị của thông tin đó.

Đầu năm 1941, liên minh bốn nước (Phe Trục) bao gồm Đức, Nhật, Ý và Liên Xô được thành lập; và số phận của bán cầu phía đông đã được định đoạt.


“Vậy,” Tôi nói một cách đầy học thức, “bắt đầu với mock object nào. Mày nói đúng, nó không nên chứa tin nhắn.” Tôi xem lại đoạn mã. Nó trông như này:

“Đầu tiên là”, tôi tiếp tục, “trường id nên được đặt trong hàm khởi tạo SuitRegistrationMessage.”

“Đồng ý” Avery nói. Và hắn bắt đầu gõ.

“Được rồi, bài kiểm thử vẫn đạt.” Avery nói. “Giờ cùng xem lại trường sender. Nó không nên được đặt trong lớp mock. Thiết lập trường đó là một chức năng mà đoạn mã của môi trường production phải làm.”

“Đồng ý.” tôi đáp lại. “Nhưng nó nên nằm ở đâu trong đoạn mã của môi trường production?”

“À….Hmmm.” 

“Được rồi. Bây giờ chúng ta đang cố đạt được điều gì?”

“Bài kiểm thử là để đảm bảo chúng ta khởi tạo và gửi được tin nhắn phù hợp cho bộ phận sản xuất.”

“Đúng!” Avery nói. “Vậy thứ mà ta cần làm là khởi tạo và gửi tin nhắn trong mã của môi trường production”

“Được thôi, nhưng ta đâu có thể gửi nó sang bên sản xuất. Chúng ta chỉ đang kiểm thử thôi”

“Đúng, vậy ta sẽ tạo một hàm Mock để bỏ qua phần thực hiện thao tác gửi”

Tôi đã thấy lối đi tiếp. “À, được rồi, ý mày là bên sản xuất sẽ được tượng trưng bởi một lớp trừu tượng mà có phương thức send, và hàm mock của ta sẽ bỏ qua nó.”

“Ừ, tao nghĩ vậy.”

“Được rồi, vậy ta sẽ thay đổi hàm MockManufacturing cho đúng định dạng, sau đó ta có thể chuyển các phương thức sang một lớp nền.” Tôi bắt đầu gõ.

“Được rồi, bài kiểm thử vẫn đạt. Bây giờ chuyển phương thức registerSuit vào lớp nền.”

“Ta sẽ gọi lớp đó là gì?” Avery hỏi.

“Dĩ nhiên là Manufacturing rồi.”

Avery lắc đầu vào chỉ vào màn hình.

“À!” tôi nói, “đã có sẵn giao diện Manufacturing rồi. Được rồi, hãy chuyển nó thành một class và đưa phương thức registerSuit vào đó.”

Avery với lấy bàn phím và bắt đầu gõ.

“Nhìn hơn trước nhiều rồi.” tôi nói, sau khi nhìn thấy bài kiểm thử đã đạt. “Nhưng tao không thích để phương thức getLastMessage trong Manufacturing.  Nó có cảm giác như là phương thức dùng trong bài kiểm thử và chỉ nên có trong MockManufacturing”

“Tao nghĩ mày đúng.” Avery nói. Rồi hắn bỏ phương thức getLastMessage ra khỏi lớp Manufacturing.

“Ặc, giờ thì nó không biên dịch được.”

“Ừ lớp Utilities kia phụ thuộc vào nó.” tôi nói.

“Và phương thức đó được gọi ở đâu.” Avery hỏi.

Tôi lấy bàn phím và tìm xem nó được dùng ở đâu. “Chỉ có lớp unit test UtilitiesTest, và trong fixture MessageSentToManufacturing của ta. Chúng ta có thể sửa được, chỉ cần chuyển biến manufacturing thành MockManufacturing.” Rồi tôi gõ:

“Được rồi, tình thế có vẻ xấu.‘ tôi nói, khi nhìn thấy bản kiểm thử đạt.

“Được rồi, hãy chuyển phương thức đó ra khỏi đây. Chúng ta đã có thể gọi object manufacturing trực tiếp từ fixture và unit test. Cả hai đều biết object manufacturing là MockManufacturing nên chúng ta không cần phải chuyển.”

Avery lấy bàn phím và đổi trong unit test trước.

“Được rồi, vẫn hoạt động” tôi nói. “Nhưng không hợp lý khi để nó trong UtilitiesTest nhỉ?”

“Không, rõ ràng là thế.” Và Avery tiếp tục gõ. Hắn chuyển phương thức testRegisterSuitSendsMessageToMfg sang một lớp mới tên là ManufacturingTest. Tất cả bài kiểm thử đều đạt.

Avery đang hăng. “Tiếp theo, chúng ta phải thay trong fixture.” Hắn tiếp tục gõ.

“Bài kiểm thử vẫn đạt.‘ hắn nói. “Giờ chúng ta có thể bỏ phương thức getLastMessageToManufacturing đi rồi.” Hắn tìm chỗ được sử dụng để kiểm tra là không chỗ nào còn gọi nó nữa, và xóa đi.

“Chúng ta có thể bỏ Utilities.registerSuit bằng cách tương tự!” Tôi la lên và lấy bàn phím. Tôi bỏ phương thức trực tiếp, và thay fixture của SuitRegistrationRequest để gọi registerSuit thông qua Utilities.manufacturing. Bài kiểm thử vẫn đạt.

Lớp Utilities giờ trông như này.

“Này,” tôi nói, “ta còn có thể lược bỏ gutNumberOrSuitsInInventory, và addSuit bằng cách tương tự!” Và tôi tiếp tục gõ điên cuồng.

“Thế này tốt hơn nhiều.” Avery nói. “Lớp Utilities bắt đầu biến mất dần. Và nó cần phải thế.”

“Ừ, tao đồng ý. Nhưng tao không nghĩ mình có thể lược thêm vào lúc này. Sao không thử xem biến được truyền vào lớp SuitRegistrationMessage.”

Nhưng trước khi chúng tôi có thể bắt đầu thì Jerry quay lại.

“Chào hai đứa, mọi thứ sao rồi?”

“Khá tốt” bọn tôi trả lời.

“Hai đứa làm cho trang kiểm thử đạt được chưa?”

“Bon tôi…” Chúng tôi nhìn nhau. “Bọn tôi có chút tiến triển, nhưng lại quyết định sửa lại mã một chút. Nó nhìn hơi xấu.”

Jerry nhướn mày và nói: “Hai đứa… gì cơ?”

“Bọn tôi lược hầu hết lớp Utilities, và…”

“Hai đưa… sửa lại mã? Để xem nào.”

Bọn tôi cho gã xem những thay đổi của bọn tôi. Gã gật đầu sau mỗi đoạn. Rồi nói, “Làm tốt lắm mấy đứa; tốt lắm. Phần mã này trông tốt hơn lúc tao dừng một tiếng trước. Tao nghĩ nó sẽ giúp cho công việc trôi chảy hơn.”

Avery và tôi nhìn nhau và cười. Tôi cảm thấy khá tốt về những phần bọn tôi đã dọn dẹp. Cũng rất vui khi biết Jerry cũng nghĩ vậy.

“Được rồi, hai đứa, tao sẽ đi nói chuyện với Carole một chút. Sao hai đứa không sửa nốt để cho trang này đạt đi.”

Xem thêm về Tạp chí lập trình Vol.4 tại đây

Đăng ký nhận bộ tài liệu kỹ năng dành cho lập trình viên (video hướng dẫn + slide) tại đây


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: