Ủy quyền trong lập trình đề cập đến việc giao một nhiệm vụ từ phần này của chương trình sang phần khác. Đó là một kỹ thuật thiết yếu trong lập trình hướng đối tượng, trao quyền cho mã sạch, có thể bảo trì bằng cách đảm bảo rằng mỗi đối tượng hoặc phương thức chịu trách nhiệm về một nhiệm vụ hoặc hành vi cụ thể.
Hiểu và sử dụng tính năng ủy quyền là chìa khóa để thành thạo Ruby và các ngôn ngữ hướng đối tượng khác. Ủy quyền thúc đẩy sự phân tách các mối quan tâm, làm cho mã của bạn trở nên mô-đun hơn và dễ hiểu, kiểm tra và tái cấu trúc hơn.
Trong bài viết này, chúng ta sẽ đi sâu vào ba cách để thực hiện ủy quyền trong Ruby:sử dụng ủy quyền rõ ràng, Forwardable mô-đun và ActiveSupport::Delegate (dành cho Rails).
Hãy bắt đầu!
Ủy quyền trong Ruby
Hãy bắt đầu bằng cách thảo luận về việc ủy quyền rõ ràng - gọi một phương thức trong một phương thức. Sau đó chúng ta sẽ khám phá Forwardable tích hợp sẵn mô-đun và cách nó có thể hợp lý hóa việc ủy quyền. Cuối cùng, chúng ta sẽ đề cập đến ActiveSupport::Delegate , một công cụ ủy quyền dành riêng cho Rails với một số tính năng hữu ích.
Ủy quyền rõ ràng
Ở dạng đơn giản nhất, việc ủy quyền có thể đạt được bằng cách gọi rõ ràng một phương thức trong một phương thức khác. Cách tiếp cận này thường được sử dụng khi phương thức được ủy quyền thuộc về một đối tượng riêng biệt hoặc khi việc ủy quyền đủ đơn giản để không đảm bảo việc sử dụng các kỹ thuật nâng cao hơn.
Việc triển khai ủy quyền rõ ràng trong Ruby rất đơn giản. Hãy lấy một ví dụ về Printer lớp sử dụng đối tượng HP để in văn bản:
Trong ví dụ trên, phương thức in của Printer lớp ủy quyền rõ ràng nhiệm vụ định dạng cho HP lớp bằng cách gọi phương thức định dạng của nó. Việc ủy quyền này giao trách nhiệm in ấn cho lớp khác một cách đơn giản và dễ đọc.
Ủy quyền rõ ràng là phổ biến trong các ứng dụng trong thế giới thực, vì nó giúp thúc đẩy việc phân tách các mối quan tâm và mã có thể bảo trì. Ví dụ:bạn có thể thấy kỹ thuật này được sử dụng trong các ứng dụng yêu cầu giao tiếp giữa các dịch vụ khác nhau, trong đó một dịch vụ gọi một dịch vụ khác để thực hiện một tác vụ cụ thể.
Ngoài ra, ủy quyền rõ ràng có thể hữu ích khi xây dựng bộ điều hợp hoặc trình bao bọc xung quanh thư viện của bên thứ ba vì nó cho phép bạn tách biệt sự tương tác với mã bên ngoài.
Tóm lại, ủy quyền rõ ràng là một cách đơn giản và hiệu quả để ủy quyền nhiệm vụ giữa các đối tượng trong Ruby. Bằng cách gọi một phương thức trong một phương thức khác, bạn có thể dễ dàng ủy quyền trách nhiệm, giúp mã của bạn dễ bảo trì hơn và thúc đẩy việc phân tách các mối quan tâm.
Mô-đun chuyển tiếp của Ruby
Mô-đun Forwardable là một thư viện Ruby tích hợp cung cấp cách tiếp cận hợp lý và linh hoạt hơn để ủy quyền so với ủy quyền rõ ràng. Bằng cách đưa mô-đun Có thể chuyển tiếp vào lớp của mình, bạn có quyền truy cập vào các phương thức như def_delegator và def_delegators , giúp việc ủy quyền trở nên dễ dàng.
Để bắt đầu với mô-đun Có thể chuyển tiếp, hãy đưa nó vào lớp của bạn và sử dụng def_delegator vàdef_delegators các phương thức để ủy quyền một hoặc nhiều phương thức tương ứng. Hãy xem lại ví dụ về Máy in của chúng tôi với Formatter mới lớp và triển khai mô-đun có thể chuyển tiếp:
Trong ví dụ trên, chúng tôi đã sử dụng def_delegator để ủy quyền phương thức định dạng từ lớp Formatter. Nếu bạn cần ủy quyền nhiều phương thức cùng một lúc, bạn có thể sử dụng def_delegators . Ví dụ:nếu Formatter lớp có các phương thức bổ sung như capitalize , bạn có thể ủy quyền cho họ như thế này:
Khi sử dụng mô-đun Có thể chuyển tiếp, có một số nhược điểm tiềm ẩn quan trọng cần cân nhắc:
- Trước tiên, hãy đảm bảo rằng đối tượng đích được khởi tạo trước khi sử dụng ủy quyền. Nếu không, bạn có thể gặp lỗi.
- Thứ hai, việc lạm dụng ủy quyền có thể dẫn đến sự nhầm lẫn tiềm ẩn về khả năng đọc mã, vì có thể không rõ phương thức nào thuộc về lớp và phương thức nào được ủy quyền.
- Cuối cùng, có thể có một chút hao phí về hiệu suất khi sử dụng lệnh gọi phương thức trực tiếp có thể chuyển tiếp. Tuy nhiên, chi phí này thường không đáng kể trong hầu hết các ứng dụng.
Để biết thêm thông tin chuyên sâu về mô-đun Có thể chuyển tiếp, hãy xem tài liệu Có thể chuyển tiếp.
ActiveSupport::Delegate cho các ứng dụng Rails
ActiveSupport::Delegate là một tiện ích ủy quyền do Rails cung cấp, cung cấp cú pháp ngắn gọn để ủy quyền các phương thức cho các đối tượng liên quan. Mặc dù nó có những điểm tương đồng với mô-đun Forwardable tích hợp sẵn của Ruby, ActiveSupport::Delegate cung cấp các tùy chọn và tính năng bổ sung được thiết kế riêng cho các ứng dụng Rails.
Để sử dụng ActiveSupport::Delegate , chỉ cần gọi phương thức ủy nhiệm trong lớp của bạn và chỉ định (các) phương thức được ủy quyền cùng với đối tượng đích. Hãy xem lại ví dụ về Máy in và Trình định dạng và triển khai ủy quyền bằng cách sử dụngActiveSupport::Delegate :
ActiveSupport::Delegate cung cấp các tùy chọn và tính năng bổ sung có thể hữu ích trong nhiều tình huống khác nhau. Ví dụ:bạn có thể sử dụng :prefix tùy chọn để thêm tiền tố vào phương thức được ủy quyền. Nếu bạn muốn ủy quyền nhiều phương thức cùng một lúc, chỉ cần liệt kê chúng trước to: tùy chọn:
Điều này tạo ra các phương thức như formatter_format , formatter_bold , và formatter_italic trong Printer lớp, ủy quyền cho các phương thức tương ứng trong Formatter lớp học.
ActiveSupport::Delegate thường được sử dụng trong các dự án Rails trong thế giới thực để ủy quyền các phương thức giữa các mô hình hoặc đối tượng được liên kết. Ví dụ:nếu bạn có User mô hình belongs_to một tổ chức, bạn có thể ủy quyền phương thức tên từ organization mô hình thành User mô hình như thế này:
Điều này cho phép bạn truy cập tên của tổ chức thông qua đối tượng người dùng:user.organization_name .
Tóm lại, ActiveSupport::Delegate là một công cụ mạnh mẽ dành cho các ứng dụng Rails cho phép các phương thức ủy quyền ngắn gọn và biểu cảm. Bằng cách tận dụng các tùy chọn và tính năng bổ sung của nó, bạn có thể tạo mã có thể bảo trì và được tổ chức tốt, tuân thủ các nguyên tắc lập trình hướng đối tượng trong bối cảnh các dự án Rails.
Để biết thêm thông tin chuyên sâu về ActiveSupport::Delegate và tất cả các tùy chọn có sẵn, hãy xem tài liệu Rails ActiveSupport.
So sánh các kỹ thuật ủy quyền
Ủy quyền rõ ràng là cách tiếp cận đơn giản nhất để ủy quyền, yêu cầu các phương thức được xác định thủ công để gọi các phương thức mong muốn từ đối tượng được ủy quyền. Mặc dù kỹ thuật này đơn giản và không yêu cầu bất kỳ thư viện bên ngoài nào, nhưng nó có thể quá dài dòng khi ủy quyền ngày càng nhiều phương thức.
Mô-đun Forwardable, được tích hợp trong Ruby, cung cấp một cách hợp lý hơn để ủy quyền các phương thức. Bằng cách sử dụng def_delegator và def_delegators phương thức, bạn có thể ủy quyền một hoặc nhiều phương thức một cách chính xác.
ActiveSupport::Delegate , một phần của thư viện ActiveSupport của Rails, cung cấp cách khai báo để xử lý việc ủy quyền phương thức. Với cú pháp rõ ràng và các tùy chọn bổ sung như tiền tố, đây là một công cụ biểu đạt trong ngữ cảnh Rails. So với ủy quyền rõ ràng,ActiveSupport::Delegate mang tính biểu cảm hơn và ít dài dòng hơn, đặc biệt khi ủy thác nhiều phương thức. Tuy nhiên, nó yêu cầu Rails nên không phù hợp với các dự án Ruby không có Rails.
Việc lựa chọn kỹ thuật ủy quyền phụ thuộc vào nhu cầu và ứng dụng cụ thể của bạn. Trong khi ủy quyền rõ ràng mang lại sự đơn giản và rõ ràng, mô-đun Có thể chuyển tiếp cung cấp cách tiếp cận hợp lý hơn và ActiveSupport::Delegate cung cấp một giải pháp mạnh mẽ, dành riêng cho Rails. Việc hiểu các tùy chọn này cho phép bạn chọn kỹ thuật phù hợp nhất với dự án và phong cách viết mã của mình.
Kết thúc
Từ ủy quyền rõ ràng đến sử dụng mô-đun Chuyển tiếp được tích hợp sẵn hoặcActiveSupport::Delegate dành riêng cho Rails , mỗi kỹ thuật đều có những lợi ích riêng và những hạn chế tiềm ẩn. Kỹ thuật bạn nên chọn tùy thuộc vào bối cảnh cụ thể, tính chất dự án và phong cách viết mã cá nhân của bạn.
Hiểu những kỹ thuật này không chỉ mở rộng kỹ năng lập trình Ruby của bạn mà còn trang bị cho bạn cách viết mã mô-đun hơn, dễ đọc và dễ bảo trì hơn. Với kiến thức này, bạn được chuẩn bị tốt hơn để giải quyết các vấn đề phức tạp bằng thiết kế hùng hồn.
Chúc mừng đại biểu!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!
Jeff Morhous
Tác giả khách mời Jeff Morhous của chúng tôi là Kỹ sư phần mềm viết mã và sửa lỗi để giúp bệnh nhân nhận được thuốc họ cần. Hiện nay, anh ấy tập trung vào việc tạo các ứng dụng web bằng Ruby on Rails, nhưng trước đây anh ấy đã sử dụng Swift, Java và Kotlin để phát triển iOS và Android.
Tất cả bài viết của Jeff Morhous