Rails AntiPatterns, Fat Models và các giải pháp [Part 3]
Tiếp nối 2 phần trước: Phần 1: Một số khái niệm và AntiPattern: Voyeuristic Models Phần 2: Những giải pháp còn lại của AntiPattern: Voyeuristic Models Hôm nay, chúng ta sẽ chuyển sang một AntiPattern In Rails khác. Đó là Fat Models AntiPattern 1.2 AntiPattern: Fat Models Đây là một ...
Tiếp nối 2 phần trước:
- Phần 1: Một số khái niệm và AntiPattern: Voyeuristic Models
- Phần 2: Những giải pháp còn lại của AntiPattern: Voyeuristic Models
Hôm nay, chúng ta sẽ chuyển sang một AntiPattern In Rails khác. Đó là Fat Models AntiPattern
1.2 AntiPattern: Fat Models
Đây là một trong những nội dung trọng điểm của AntiPattern mà chúng ta sẽ đề cập tới trong series bài viết. Sự phức tạp là sát thủ số một trong những project hiện nay, nó đi vào một ứng dụng bằng nhiều cách, kể cả thông qua những tính năng phức tạp, những nhà phát triển quá thông minh, và không quen với Ruby On Rails. Chương này, phần nhiều sẽ đề cập tới sự đơn giản từ một góc nhìn duy nhất: đơn giản hóa bên trong model bằng cách di chuyển sự phức tạp đó tới một unit mới trong ứng dụng - modules và classes. Chúng ta sẽ cùng đi qua một ví dụ minh họa, là một Order model trong một ứng dụng bán hàng online. Order model có những phương thức để tìm kiếm theo trạng thái hoặc nâng cao. Nó cũng có những hàm phục vụ cho việc trích xuất dữ liệu ra XML, JSON, PDF.
# app/models/order.rb class Order < ActiveRecord::Base def self.find_purchased # ... end def self.find_waiting_for_review # ... end def self.find_waiting_for_sign_off # ... end def self.find_waiting_for_sign_off # ... end def self.advanced_search(fields, options = {}) # ... end def self.simple_search(terms) # ... end def to_xml # ... end def to_json # ... end def to_csv # ... end def to_pdf # ... end end
Khi nhìn nhận rằng đây chỉ là một ví dụ nhỏ của những dòng code trong Order class, thì chúng ta dễ dàng nhận thấy models có thể nhanh chóng vượt ra khỏi tầm kiểm soát. Tất nhiên chúng ta có quyền ước rằng, điều đó làm cho chúng ta thấy model sẽ vượt quá 1000 dòng code trong một file. Mà sự béo ra, to ra của model có xu hướng tới từ những lập trình viên Ruby On Rails mới vào nghề. Vấn đề khó khăn trong việc bảo trì và khả năng đọc để nắm logic của việc béo ra của model như vậy sẽ ngày càng rõ ràng. Trong những giải pháp tiếp theo, chúng ta sẽ dễ dàng thấy được cách mà Ruby On Rails làm cho bạn khi nhóm các phương thức liên quan thành các module. Sau đó, chúng ta sẽ tìm hiểu về những vấn đề cơ bản đằng sau những overweight (thừa cân