Breaking Temporal Coupling — Phá Vỡ Sự Phụ Thuộc Theo Thời Gian (Pragmatic Programmer #33)
Mở đầu
Ảnh: ThisisEngineering — Pexels
Mình đang đọc cuốn The Pragmatic Programmer (bản kỷ niệm 20 năm) và cảm thấy series cảm nhận từng topic này thật sự hữu ích. Mỗi topic như một viên gạch nhỏ góp phần xây dựng nên tư duy lập trình viên chuyên nghiệp. Hôm nay mình muốn chia sẻ về Topic 33 trong chương Concurrency — Breaking Temporal Coupling.
Breaking Temporal Coupling
Ảnh: Pixabay — Pexels
Temporal Coupling (hay coupling theo thời gian) xảy ra khi code của bạn ép buộc một thứ tự thực thi mà thực ra không cần thiết. Ví dụ điển hình là bạn phải gọi method A() trước rồi mới gọi B(), vì B() phụ thuộc vào trạng thái mà A() tạo ra. Nếu sau này bạn muốn thay đổi thứ tự, hoặc chạy song song, thì code sẽ vỡ tung.
Cuốn sách khuyên nên break sự phụ thuộc thời gian này bằng cách:
- Truyền tất cả thông tin cần thiết vào hàm một lần (không để hàm phụ thuộc vào thứ tự gọi trước đó).
- Sử dụng event, queue, hoặc callback để tách rời các bước.
- Thiết kế API không giả định thứ tự gọi.
Trong thực tế lập trình, mình hay gặp cái này khi viết code xử lý form: validate() rồi save() — nếu sau này muốn save trước validate (ví dụ batch processing) thì phải refactor lớn. Hoặc trong microservices, service A phải gọi service B theo thứ tự nhất định, dẫn đến tight coupling về thời gian.
Cảm nhận của mình
Ảnh: Daniel — Pexels
Mình thấy topic này hay lắm vì nó chạm đúng vào một thói quen xấu của dev: viết code theo thứ tự logic trong đầu mình lúc đó, mà không nghĩ đến tương lai khi yêu cầu thay đổi. Mình từng làm một project ETL pipeline, mọi thứ đều theo thứ tự strict: extract → transform → load. Khi cần scale ra parallel processing thì đau đầu kinh khủng vì temporal coupling khắp nơi. Sau khi áp dụng ý này, mình refactor lại dùng message queue (Kafka/RabbitMQ), mỗi bước độc lập hoàn toàn — code sạch hơn nhiều, dễ test và scale hơn.
Nó nhắc mình nhớ đến nguyên tắc “Orthogonality” ở những topic trước — code phải độc lập theo nhiều chiều, không chỉ theo không gian mà cả theo thời gian nữa. Hay thiệt!
Kết
Tóm lại, Breaking Temporal Coupling giúp code linh hoạt hơn, ít bug hơn khi thay đổi yêu cầu. Nếu bạn đang viết code có nhiều thứ tự “phải làm trước sau”, thử nghĩ cách tách nó ra xem sao. Hẹn mấy bạn ở topic sau trong series Pragmatic Programmer nha!