Trong API của chúng tôi, chúng tôi đã có một vài kiểu dữ liệu trung tâm cần được "trang trí" (có thể nói) sau khi truy xuất từ cơ sở dữ liệu với các giá trị được tính toán. Cơ sở dữ liệu được truy cập thông qua ORM theo động của Bảng / Thực thể được truyền cảm hứng mạnh mẽ bởi lớp cơ sở dữ liệu CakePHP 3, trong đó đối tượng Bảng được sử dụng làm trung gian giữa cơ sở dữ liệu và ứng dụng nhận và xử lý các hàng làm đối tượng mô hình. Vì vậy, thay vì chỉ lấy dữ liệu từ cơ sở dữ liệu và trả về các hàng đó, chúng ta cần xử lý trước dữ liệu được trả về trước khi thực sự có thể sử dụng được. Dưới đây là một vài trường hợp sử dụng được đưa ra để giải thích rõ hơn ý tôi là gì:
- Các đối tượng có các giá trị số được dịch sang nhãn thân thiện với người dùng (thông thường đây là logic mà tôi giữ hoàn toàn trên máy khách, nhưng vì lý do bảo mật kinh doanh, một số dữ liệu này chỉ cần được giữ trên máy chủ, phải thừa nhận một chút trường hợp cạnh)
- Các đối tượng cần phải có một giá trị xếp hạng liên quan được lấy từ xếp hạng được thêm gần đây nhất
- Dựa trên sự kết hợp của các giá trị được tính toán như giá trị này và giá trị được lưu trữ, một đối tượng lịch biểu phức tạp được xây dựng
Theo cách riêng của họ, bất kỳ cá nhân nào trong số này thực sự khá dễ thực hiện với một map()
thao tác đơn giản trên tập kết quả được trả về. Điều tương tự áp dụng cho khi bạn muốn nhiều giá trị được tính toán, bạn chỉ có thể thực hiện thêm các thao tác bản đồ để tính toán và thêm các trường đó khi cần thiết.
Điều đó nói rằng, phương pháp này có hai nhược điểm chính:
- Điều đó có nghĩa là bạn cần thực hiện thêm một bước xử lý hậu kỳ ở mọi nơi bạn muốn làm việc với các giá trị được tính toán này, không đặc biệt là DRY
- Một số biến đổi này phụ thuộc vào các biến đổi khác được thực hiện trước tiên, nếu không, chúng chỉ không có sẵn dữ liệu để làm việc với
Để xử lý cả hai, tôi đã nghĩ rằng cách tiếp cận tốt nhất sẽ là chuyển mã này vào ORM, sau đó sửa đổi ORM để giao diện (bên ngoài) cho phép truy cập vào các trường ảo được tính giống như cách nó xử lý các cột cơ sở dữ liệu . Trong nội bộ, sau đó nó có thể ánh xạ các trường ảo này tới các hàm biến đổi và xác định bên trong bất kỳ phép biến đổi phụ thuộc cần thiết tiềm năng nào để giải quyết vấn đề thứ hai.
(Bên cạnh đó, tôi tự hỏi liệu điều này cũng loại bỏ sự cần thiết của các hàng được trả về là các đối tượng thực tế trái ngược với các giá trị băm đơn giản. Ngay bây giờ mỗi hàng sẽ tạo một đối tượng mới với dữ liệu trường được đặt trên nó, nhưng nếu tất cả tính toán hoặc sửa đổi dữ liệu được chuyển ra khỏi mô hình sau đó đối tượng chỉ trở thành một túi thuộc tính - một hashmap, về cơ bản, không có logic bên trong của chính nó. Tôi có thể không thực sự là một điều xấu)