Don't Repeat Yourself - là một nguyên lý rất quan trọng trong thiết kế phần mềm. Đại ý là không làm lại cái thứ đã làm rồi. Ngay từ việc thiết kế phải xác định nó như tư tưởng xuyên suốt.
Cách đây tầm 1 tháng, trước việc nhìn thấy các query dữ liệu bị lặp lại rất nhiều. Khi thì liệt kê đơn hàng với đk này, khi thì liệt kê với dk khác. Nhưng bản chất vẫn là query dữ liệu đơn hàng. Tôi quyết định giải quyết vấn đề đó bằng việc thay vì dùng các stored procedure thì xây dựng các query builder có khả năng tái sử dụng cao. Các query builder phải sinh các query động phù hợp với nhiều kịch bản khác nhau.
Tư tưởng ban đầu rất đơn giản, sinh mệnh đề where động bằng cách concat string. Tiếp đến phát sinh các yêu cầu giải quyết bài toán quan hệ giữa các entity. Ví dụ một đơn hàng có nhiều item. Nó dẫn tới việc tôi phải cố gắng giải quyết vấn đề định nghĩa quan hệ, giải quyết bài toán mapper dữ liệu trả về. Lúc này tôi sử dụng feature spliton của Dapper. Bằng việc sử dụng các delegate tôi dần giảo quyết được. Tôi build được một lib orm đơn giản giải quyết được các query dữ liệu của qua hệ 1-1, 1-n... Cho phép phân trang, dynamic filter, chọn lựa các field của dữ liệu. Việc cấu hình khá đơn giản. Nó đủ dùng, kết hợp việc thiết kế theo hướng đơn giản các query, thì nó đáp ứng hầu hết các nhu cầu query dữ liệu của nhóm. Điều này rất có ý nghĩa, vì coi như team chẳng phải viết sql cho phần lớn các case sử dụng.
Nhưng chính lúc build xong, tôi nhận thấy có mỗi quan hệ giữa việc định nghĩa quan hệ, xây dựng mệnh đề where, mệnh đề from, mệnh đề select, việc mapper kết quả trả về. Tôi sử dụng khá nhiều các delegate - func. Tôi dần nhìn thấy hình hài của cú pháp table.where(...).select(...) trong các thư viện orm như entity framework, linq.... Đây chính là tư tưởng lập trình hàm, sử dụng các closure là các delegate. Lúc này tôi như oà lên một tiếng. Mọi con đường đều đến thành Rome. Quả thực có tự build mới vỡ ra nhiều điều. Xuất phát từ một vài yêu cầu riêng, mà nhờ đó tôi hiểu ra những thứ mà tôi vẫn dùng cả chục năm nay. Khi theo đuổi cái gì đó, nó giống như lần mò một đầu chỉ của một cuốn chỉ rối. Không thể biết, cái đầu chỉ mình lần ra là gì, nhưng càng cố gắng thì càng lần ra nhiều, và giữa hàng tá phép thử, bắt chợt ta kéo ra một đầu chỉ rất dài. Thật tuyệt vời!
Cách đầy tầm 8 tháng, một anh kĩ sư trưởng về core banking nói là nên tự build một bộ orm riêng. Không hệ thống lớn nào sài bộ có sẵn cả. Tôi e ngại, nghĩ build quá nhọc. Nhưng giờ thấy hoá ra nó không phức tạp lắm, nếu chỉ build cho những yêu cầu riêng. Và khi tự build hiểu hơn rất nhiều thứ.