Advertisement
Guest User

Tản mản

a guest
Dec 18th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. Sưu tầm.
  2. _
  3. Tản mạn về trình tự tư duy trong lập trình
  4. Hôm trước có bạn hỏi mình về việc viết TDD, và mình có trả lời rằng mình chỉ TDD khi viết code thuật tuán, còn UI hay logic móc nối thì không. Vậy logic thuật toán là thế nào?
  5. Logic thuật toán là những tính toán phức tạp mà mang tính học thuật cao, ví dụ như các hàm duyệt cây dữ liệu có sử dụng đệ quy, hay là code công thức Bayer. Những đoạn code này thường dài và có nhiều if-for hoặc đệ quy hơn bình thường, đồng thời đầu vào và ra cũng đa dạng hơn, hơn nữa nó là nền móng cho hệ thống, và nếu lỏi lỗi ở đây sẽ rất khó debug, nói chung là thảm họa. Vì vậy việc viết TDD ở đây là hợp lý.
  6. Tuy nhiên, các tầng trên của hệ thống lại có 1 câu chuyện hoàn toàn khác. Ví dụ cái file chứa các tính toán Bayer kia của mình được đặt tên là bayer-calculator (BC) chẳng hạn, thì mình cũng sẽ không gọi nó trực tiếp trong bất kỳ route nào cả. Sao lại thế? Ví dụ như hệ thống có 1 trang tên là Prospect list chẳng hạn, để liệt kê ra các khách hàng tiềm năng và xác suất mua hàng sắp tới của họ. Nghe có vẻ như thằng Prospect-list-route sẽ có code gọi đến bayer-calculator. Đúng là nó sẽ gọi, nhưng vì route này có chứa các dữ liệu phức tạp và cần thanh lọc trước khi gọi đến BC, nên nó sẽ cần có prospect-service để thực hiện tiền tính toán (sàng lọc) trước khi có được dữ liệu đầu vào phù hợp cho BC tính toán. Ví dụ như prospect service sẽ có hàm getPurchaseChance(customerProfile, purchaseHistory...), trong hàm này sẽ chứa các hàm lọc dữ liệu về độ tuổi, giới tính, và sở thích mua sắm của người dùng, chuyển thành dạng dữ liệu đầu vào của thuật toán Bayer, rồi gọi đến BC (1 hoặc nhiều lần) để thực hiện tính toán.
  7. Thằng propect list route khi có prospect-service thì sướng quá, lấy dữ liệu về là truyền hết cho nó, chả phải làm gì, chỉ phải hiển thị kết quả. Bayer calculator cũng nhàn tênh, không phải lo thằng profile là dữ liệu thế nào, chỉ phải tra wiki công thức bayer mà phệt vào là xong. Còn thằng prospect service? Cũng chẳng có gì. Lọc và biến đổi dữ liệu, thực ra code rất nhẹ nhàng, nhất là khi sử dụng ngôn ngữ hỗ trợ biến dạng dữ liệu mạnh như javascript, và đầu vào đầu ra cũng rất đơn điệu, nên thường mình cũng ko phải viết test. Nếu muốn test, thì cả prospect service hay Bayer calculator đều là code js thuần túy (vanilla) nên ko khó j cả.
  8. Vậy đấy, với việc chia tầng hợp lý, thì một bài toán ban đầu nghe có vẻ phức tạp như làm trang danh sách triển vọng khách hàng sẽ được bóc tách gọn gàng, và qua 3 tầng, chúng ta sẽ có những đoạn code mà chỉ lo việc của riêng nó, không nhập nhằng, dễ hiểu, dễ viết, dễ test, dễ maintain.
  9. Quá trình chia tầng cũng thể hiện rõ cách chia dựa trên quy luật: chia theo yêu cầu khách hàng trước (yêu cầu hiển thị dạng thông tin gì, yêu cầu cấu trúc dữ liệu), rồi đặc thù kỹ thuật sau (công thức Bayer)
  10. Ngoài việc rành mạch trong tư duy, việc chia tầng hợp lý cũng sẽ tạo ra một số linh động nhất định trong cấu trúc hệ thống. Ví dụ như khi ta không muốn dùng bayer để tính triển vọng nữa mà muốn thay bằng công thức khác, thì việc thay thế cũng rất đơn giản. Prospect list route code giữ nguyên, bayer calculator code giữ nguyên, chỉ việc sửa trong prospect service là xong.
  11. Sao bayer calculator lại giữ nguyên?... Vì nó có lỗi gì đâu, nó vẫn luôn là công thức bayer mà, ko dùng chỗ này thì dùng chỗ khác, áp dụng công thức mới thì tạo file calculator khác mà viết, bayer calculator vẫn tuyệt đối tốt, đừng có đụng vào làm gì.
  12. Vậy đấy, thực ra hầu hết các hệ thống phần mềm bây giờ, các lớp code thuật toán thường rất mỏng, chắc chỉ chứa đên 1% toàn bộ code hệ thống. Hầu hết code sẽ là hiển thị, điều khiển, móc nối... và nếu bạn ra trường với một lượng kiến thức đồ sộ về thuật toán thì sẽ cảm thấy hụt hẫng vô cùng, vì code thuật toán vốn đã mỏng lại rất dễ search trên mạng. Trong khi đó code điều khiển, móc nối đã nhiều lại không có để search, vì nó liên quan đến bài toán yêu cầu khách hàng cụ thể. Việc viết tốt các loại code này mới giúp định nghĩa bạn là coder giỏi hay amater. Và nếu theo các định nghĩa này thì đến giáo sư Ngô Bảo Châu cũng không giúp gì được cho bạn đâu.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement