2013-03-07 45 views
33

Tôi tự hỏi liệu có bất kỳ phương pháp hay nhất nào về đặt các tệp Ruby không chuẩn trong ứng dụng Rails hay không các thư mục mặc định (controllers/models v.v.).hướng dẫn về vị trí đặt các lớp trong ứng dụng Rails không phù hợp với bất kỳ đâu

Tôi đang nói về các lớp được sử dụng bởi bộ điều khiển/mô hình, vv, nhưng không phải là lớp con của bất kỳ lớp cơ sở Rails nào. Các lớp bao gồm chức năng được trích xuất từ ​​các mô hình để làm cho chúng ít chất béo hơn. Một số người trong số họ loại giống như mô hình nhưng không phải là mô hình AR, một số người trong số họ trông giống như "dịch vụ", một số là một cái gì đó ở giữa hoặc cái gì khác.

Một vài ví dụ ngẫu nhiên:

  • "chiến lược" lớp học có thể xử lý xác thực với mật khẩu, thông qua facebook, vv
  • "XParams" đối tượng mà gói gọn params hoặc "XCreator" các đối tượng có thể xử lý chế biến params để thực hiện một số hành động phức tạp dẫn đến việc tạo một số mô hình AR ở cuối các lớp
  • yêu cầu API bên ngoài hoặc đóng gói các yêu cầu và phản hồi đó
  • mô hình giả có thể được thay thế cho mô hình AR thực. er)
  • việc Resque
  • lớp lưu trữ và đọc thông tin từ Redis
  • lớp mà thực hiện một số hành động cụ thể như xử lý dữ liệu, tạo báo cáo vv và được gọi là từ việc Resque hoặc nhiệm vụ cào

Tôi đã có khá nhiều trong số này bây giờ, một số người trong số họ được thêm vào lib mà kết thúc lên như là một đống các lớp học ngẫu nhiên và các mô-đun, một số lẻn vào app/models. Tôi muốn tổ chức điều này bằng cách nào đó, nhưng tôi không biết bắt đầu từ đâu.

Chỉ các mô hình AR mới đi vào app/models? Hoặc là nó ok để cũng đặt có bất kỳ tên miền hoặc mô hình trợ giúp? Làm thế nào bạn quyết định nếu một cái gì đó là một mô hình?

Mọi thứ không phù hợp với app đều đi vào lib? Hoặc có lẽ tôi nên thêm một vài thư mục con tùy chỉnh mới vào app? Những thư mục con nào, và làm cách nào để phân chia các lớp tùy chỉnh?

Bạn xử lý điều này như thế nào trong các dự án của mình? Tôi biết mỗi dự án có một chút khác biệt, nhưng phải có một số điểm tương đồng.

+1

Tôi muốn có câu trả lời rõ ràng hơn – carbonr

+1

@carbonr Bài viết CodeClimate là điều tốt nhất tôi đã tìm thấy, tôi đã đánh dấu nó là được chấp nhận ngay bây giờ. Quy tắc "MyTurtleFaceSpace" là một quy tắc khá tốt để tuân theo. Tôi cũng đã viết một bài viết tiếp theo về điều này sau: http://blog.lunarlogic.io/2013/declutter-lib-directory/ –

Trả lời

12

Tốt câu hỏi - tôi không có một câu trả lời cụ thể cho bạn

nhưng tôi khuyên bạn nên kiểm tra ra bài này - http://blog.codeclimate.com/blog/2012/02/07/what-code-goes-in-the-lib-directory/ - hãy chắc chắn để đọc qua tất cả các ý kiến ​​

trên một dự án hiện tại tôi có một tấn đối tượng không phải ActiveRecord trong ứng dụng/mô hình, nó hoạt động nhưng không lý tưởng tôi đặt 'không thể sử dụng được' mã ứng dụng không cụ thể theo lib

các lựa chọn thay thế khác Tôi đã thử các dự án phụ đối tượng lệnh) ray là một nỗi đau khi nói đến namespace dưới ứng dụng, nó tải mọi thứ lên vào cùng không gian tên mặc định

app/ 
    commands/ 
    products/create_command.rb   # Products::CreateCommand 
    products/update_price_command.rb # Products::UpdatePriceCommand 

thay thế, tất cả mọi thứ bên cạnh đường ray dưới src hoặc một thư mục app_name

app/ 
    src/ 
    commands/ 
     create_product.rb   # Commands::CreateProduct 
     update_product_price.rb # Commands::UpdateProductPrice 

tôi thiên đường 't đi qua một giải pháp tốt cho điều này, lý tưởng là một trong 2 là tốt hơn, nhưng sẽ là tốt đẹp để không có thư mục bổ sung theo ứng dụng, theo cách đó bạn mở ứng dụng và xem bộ điều khiển, lệnh, mô hình, vv ...

+2

+1 cho liên kết CodeClimate, đó là tài nguyên tốt nhất mà tôi đã thấy cho đến nay về điều này đề tài. –

+2

Câu trả lời được chấp nhận tại http://stackoverflow.com/questions/1068558/oo-design-in-rails-where-to-put-stuff cũng được viết rất tốt. – sameers

2

Tôi đặt bất kỳ lớp mô hình nào (như lớp con STI) trong apps/models. Tôi đặt các lớp khác của tôi trong lib, vì nó có vẻ là nơi tốt nhất để đặt chúng. Thật dễ dàng cho tôi để biết nơi để tìm. Nó cũng dễ dàng hơn cho tôi để nhóm các bài kiểm tra của tôi kể từ khi các lớp mô hình của tôi là tất cả ở một nơi.

Công ước khôn ngoan Tôi không muốn đặt các lớp trợ giúp vào app/models. Nếu họ là những người dẫn chương trình, họ thuộc về số app/helpers. Nếu không thì lib có vẻ là nơi tốt nhất cho họ.

1

Thường thì các lớp học của tôi tìm đường vào lib trong các thư mục con nơi các mô-đun có cùng tên với thư mục phụ có trách nhiệm đưa chúng vào. (Rails là rất nhạy cảm về tên tập tin và tên lớp khi nói đến autoloader.)

Một tùy chọn khác là đóng gói từng mô-đun vào đá quý của riêng nó và sau đó tham khảo đá quý qua Gemfile của bạn. Điều này cho phép chia sẻ mã qua các dự án.

7

Bạn chạm vào một số trường hợp sử dụng khác nhau, và tôi nghĩ rằng phần này là gần nhất với câu trả lời "đúng":

Tôi đã có khá nhiều những bây giờ, một số trong số họ được thêm vào lib mà kết thúc lên như là một đống các lớp học và mô-đun ngẫu nhiên, một số lẻn vào ứng dụng/mô hình. Tôi muốn tổ chức điều này bằng cách nào đó, nhưng tôi không biết bắt đầu từ đâu.

Điều đó khá đúng trong sách của tôi. Một điều bạn không đề cập đến là giải nén các phần khác nhau thành các viên đá riêng biệt. Các lớp học nói chuyện với các dịch vụ bên ngoài là những ứng cử viên xuất sắc để khai thác, cũng như các lớp chiến lược nếu chúng đủ chung chung. Đây có thể là riêng tư, vì chạy máy chủ gem của riêng bạn không khó, và sau đó bạn có thể sử dụng lại chúng trên các ứng dụng ROR.

Cuối cùng và cụ thể nhất, hãy thay đổi công việc mà tôi nhập vào lib/jobs.

Quy tắc chung của tôi là nếu đó là mô hình của một số loại, nó sẽ chuyển thành app/models. Nếu không, nó có thể thuộc về lib hoặc một số thư mục con được đặt tên thích hợp, ví dụ: lib/jobs, lib/extensions, lib/external hoặc các loại tương tự.