2013-01-05 7 views
19

Từ question trước đây của tôi, tôi hiểu rằng Rails tạo ra một cá thể bộ điều khiển cho mọi yêu cầu.Tại sao Rails tạo bộ điều khiển cho mọi yêu cầu?

Câu hỏi của tôi là, bởi vì vấn đề này có liên quan đến việc thiết kế của dự án tôi đang làm việc trên:

Tại sao Rails tạo ra một thể hiện mới của

class SomeController < ApplicationController; end 

để xử lý mọi yêu cầu đến? Tại sao không chỉ tạo đối tượng đơn lẻ và yêu cầu chuyển tiếp cho đối tượng này? Điều này có vẻ hiệu quả hơn vì chúng tôi sẽ không lãng phí tài nguyên khi phân bổ và làm sạch các đối tượng theo yêu cầu?

+1

Câu hỏi hay, bạn nên hỏi DHH về điều đó :) Nhưng tôi nghĩ điểm chính là cô lập hoàn toàn môi trường này với môi trường khác. Bởi vì nếu không hệ thống phải tiêu tốn nhiều năng lượng xử lý hơn cho logic phân phối. imho –

+3

Vì dễ dàng hơn để giải thích về mã khi không có nguy cơ dẫm lên dữ liệu của yêu cầu khác. –

+0

Không có gì ngạc nhiên, nhưng có vẻ như Grails cũng làm như vậy. –

Trả lời

32

Chi phí của việc tạo ra một cá thể bộ điều khiển mới là không đáng kể và điều đó có nghĩa là không có trạng thái chia sẻ vô tình giữa hai yêu cầu hoàn toàn không liên quan. Bất kỳ "tiết kiệm" trong thời gian xử lý sẽ được nhiều hơn bù đắp bởi khả năng sản xuất lỗi tàn phá.

Hãy nhớ rằng bộ điều khiển dành cho trạng thái lưu trữ yêu cầu cụ thể. Việc sử dụng lại bộ điều khiển sẽ yêu cầu bạn phải đặt lại mọi số @variable mà bạn từng đặt vào lúc bắt đầu mọi hành động. Nếu không, một cái gì đó như @is_admin = true có thể được thiết lập và không bao giờ bị xóa. Các lỗi ít gây khó chịu mà bạn thực sự muốn giới thiệu sẽ tinh vi hơn và tiết kiệm thời gian của nhà phát triển.

Bạn đang thấy tối ưu hóa ở nơi không có. Điều gì đó phải duy trì trạng thái và đặt lại trạng thái giữa các yêu cầu hoặc bạn có cơn ác mộng này về trạng thái vô tình được chia sẻ. Nếu bạn duy trì trạng thái điều khiển giữa các yêu cầu, bạn chỉ cần đẩy công việc duy trì/đặt lại trạng thái xuống một số cấp thấp hơn, tại đó câu trả lời có thể là vẫn là để khởi tạo phiên bản mới của một số lớp quản lý nhà nước cho từng yêu cầu. Máy vi tính là rất tốt khi phân bổ và giải phóng tài nguyên, do đó, không bao giờ lo lắng về điều đó cho đến khi bạn thực sự biết đó là nút cổ chai. Trong trường hợp này, việc tạo một bộ điều khiển mới cho mỗi yêu cầu có thể dễ dàng là lựa chọn đúng.

Trong trường hợp Rails, có thể sử dụng @variable = value là chiến thắng chính từ điểm rõ ràng và khả năng sử dụng, và điều này ít nhiều đòi hỏi phải loại bỏ từng trường hợp bộ điều khiển khi yêu cầu hoàn tất.

+2

Chà ... không quá nhiều khi '@ foo' sẽ luôn luôn cần được xóa, thay vào đó các bộ điều khiển sẽ cần phải được viết để không có trạng thái chia sẻ, như các servlet Java. Bạn sẽ chuyển giá trị cho lớp xem bằng cách sử dụng một cơ chế khác (người dân địa phương, yêu cầu, v.v.) như trong Java. Bộ điều khiển chỉ dành cho trạng thái lưu trữ yêu cầu cụ thể * bởi vì * chúng được khởi tạo theo yêu cầu - nó không phải là bản chất của khái niệm về bộ điều khiển, mặc dù; các khung làm khác khác nhau. Tôi biết bạn biết điều đó, chỉ cần làm rõ. –

+0

@DaveNewton Vâng, tôi xem xét việc tham gia vào vấn đề này, nhưng câu hỏi là về hiệu suất nên tôi cho rằng nó được đề cập đến bởi "đôi khi phải đặt lại trạng thái giữa các yêu cầu". Các jist là, không có đạt được * hiệu suất * khôn ngoan bằng cách giữ các trường hợp điều khiển xung quanh. Bạn chỉ đang di chuyển phân bổ/deallocation xung quanh. – meagar

+0

Đồng ý và tôi thích ví dụ theo yêu cầu: ít suy nghĩ hơn. –