Computer >> Máy Tính >  >> Lập trình >> Ruby

Ứng dụng Rails của tôi nên nói chuyện với Redis như thế nào?

Trong khi viết ứng dụng Rails, bạn có thể gặp phải sự cố mà bạn có thể giải quyết dễ dàng hơn với một kho dữ liệu khác. Ví dụ:bạn có thể có bảng xếp hạng xếp hạng người dùng theo số điểm họ nhận được khi trả lời các câu hỏi trên trang web của bạn. Với Bộ đã phân loại của Redis, rất nhiều bài tập được thực hiện cho bạn. Đáng kinh ngạc! Nhưng bạn đặt codethat tương tác với Redis ở đâu?

User của bạn người mẫu có thể nói chuyện với Redis:

class User < ActiveRecord::Base
  def award_points(points)
    Redis.current.zincrby("leaderboard", points, id)
  end
end

Nhưng bây giờ User của bạn người mẫu chịu trách nhiệm đại diện cho auser, nói chuyện với Redis, quản lý bảng thành tích! Điều này làm cho User khó hiểu hơn và khó kiểm tra hơn và đó là tổng hợp của những gì bạn muốn.

Thay vào đó, bạn có thể bao bọc các yêu cầu của Redis trong một đối tượng mới đại diện cho những gì bạn đang sử dụng Redis for . Ví dụ:bạn có thể tạo Leaderboard lớp kết thúc giao tiếp Redis, không kế thừa từ ActiveRecord::Base , nhưng vẫn tồn tại trong app/models danh mục. Điều này sẽ giống như sau:

app / models / leaderboard.rb
class Leaderboard
  def award_points_to_user(user_id, points)
    Redis.current.zincrby("leaderboard", points, user_id)
  end
end
app / models / user.rb
class User < ActiveRecord::Base
  def award_points(leaderboard, points)
    leaderboard.award_points_to_user(id, points)
  end
end

Cả hai lớp này đều có thể tồn tại trong app/models , nhưng bây giờ bạn không kiểm soát các mô hình ActiveRecord của mình bằng logic bổ sung. Leaderboard lớp quản lý giao tiếp với Redis, vì vậy User lớp không còn phải quan tâm đến việc bảng thành tích được thực hiện như thế nào. Điều này cũng giúp kiểm tra dễ dàng hơn.

Bạn đạt được rất nhiều bằng cách tạo các lớp mới cho các trách nhiệm mới và app/models là một nơi tuyệt vời để giữ chúng. Bạn nhận được những lợi ích từ việc mua một dịch vụ khác để triển khai tính năng của mình, đồng thời giữ cho mã của bạn dễ làm việc.

Hãy dùng thử

Bạn có thể nghĩ về bất kỳ giao tiếp dịch vụ mạng nào được gọi trực tiếp từ các mô hình, bộ điều khiển hoặc chế độ xem ActiveRecord của bạn không? Hãy thử chuyển mã đó sang mô hình dữ liệu không phải ActiveRecord và xem liệu mã của bạn có trở nên dễ hiểu, dễ làm việc và kiểm tra hơn hay không. Sau đó, hãy gửi cho tôi một email và cho tôi biết tình hình diễn ra như thế nào!

Chỉ cần nhớ:

Tất cả các vấn đề trong khoa học máy tính đều có thể được giải quyết bằng một cấp độ hướng dẫn khác.

- David Wheeler

… Ngoại trừ vấn đề quá nhiều lớp chuyển hướng.

- Kevlin Henney