Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Nắm vững tính đa hình trong Ruby on Rails:Hướng dẫn thực hành

Nếu bạn đã từng dành thời gian xây dựng Chương trình hướng đối tượng (OOP), thì có thể bạn đã sử dụng tính đa hình trong ứng dụng của mình hoặc ít nhất là đã nghe đến thuật ngữ này.

Đó là loại từ mà bạn mong đợi sẽ thấy trong sách giáo khoa khoa học hoặc khoa học máy tính. Bạn có thể đã dành thời gian nghiên cứu tính đa hình và thậm chí đã triển khai nó trong ứng dụng của mình mà không hiểu rõ khái niệm này.

Bài viết này sẽ giúp bạn hiểu rõ hơn về tính đa hình, cụ thể là trong Ruby on Rails. Để thực hiện điều này, chúng ta sẽ đi sâu vào:

  • Việc sử dụng tính đa hình trong thế giới thực
  • Tính đa hình trong lập trình bằng OOP
  • Cách bạn có thể kết hợp nó vào ứng dụng Rails của mình để giúp duy trì mã chất lượng cao

Hãy bắt đầu nào!

Tính đa hình trong thế giới thực

Có một số cách để xác định tính đa hình trong các bối cảnh khác nhau. Một định nghĩa hữu ích, bất kể ngữ cảnh, là 'khả năng hiển thị nhiều dạng của một đối tượng' . Trên thực tế, nếu chúng ta chia nhỏ từ này ra, poly có nghĩa là ‘nhiều’ và morph có nghĩa là ‘hình thức’.

Trong thế giới thực, một ví dụ cơ bản của định nghĩa này có thể là một phụ nữ đồng thời là cảnh sát, chị gái, con của ai đó, mẹ của ai đó, v.v. Mỗi vai trò đều quyết định hành vi của cô ấy và góp phần tạo nên con người cô ấy.

Đa hình và di truyền

Ngoài lập trình máy tính, đa hình là một thuật ngữ thường gắn liền với sinh học và di truyền học. Trong bối cảnh này, tính đa hình được định nghĩa cụ thể hơn là các biến thể di truyền tạo ra một số dạng hoặc loại cá thể riêng biệt trong một loài.

Hãy nghĩ về báo đốm. Báo đốm có thể có nhiều biến thể gen, điều này có thể ảnh hưởng đến màu lông của chúng. Hầu hết báo đốm đều có màu hung với các vòng tròn màu đen. Tuy nhiên, chúng có thể có quầng thâm sáng hơn hoặc tối hơn do gen bị biến đổi và một số có thể có màu lông đen.

Sắc tố khác nhau trong cùng một loài chim là một ví dụ khác về tính đa hình. Hãy xem xét loài chim sẻ Gouldian, loài có màu sắc khác biệt rõ ràng giữa các cá thể.

Đơn hình và đa hình

Nếu chúng ta chú ý đến tính đơn hình, chúng ta có thể hiểu rõ hơn về tính đa hình. Gắn bó với sinh học, tính đơn hình có thể được định nghĩa là 'một loài chỉ có một dạng' , duy trì hình thức tương tự trong các giai đoạn phát triển khác nhau.

Chim cánh cụt là đơn hình. Ngay cả đối với các chuyên gia, rất khó để phân biệt giới tính. Sự khác biệt về gen ở chim cánh cụt là rất nhỏ. Vì vậy, đặc điểm hình thể của chim cánh cụt gần như không thể phân biệt được, đặc biệt là về kích thước cũng như màu sắc đen trắng của chúng.

Các dấu hiệu về hành vi thường là cách dễ dàng nhất để phân biệt giới tính ở các loài đơn hình.

Cụ thể, hãy chuyển sự chú ý của chúng ta sang tính đa hình trong lập trình.

Đa hình trong OOP

Nếu chúng ta xem xét định nghĩa ban đầu về tính đa hình — khả năng một đối tượng hiển thị nhiều dạng — chúng ta có thể liên hệ nó với OOP một cách liền mạch.

Trong OOP, chúng ta có thể sử dụng cùng một phương thức để tạo ra các kết quả khác nhau bằng cách truyền vào các đối tượng riêng biệt. Chúng ta có thể sử dụng các điều kiện để đạt được điều này. Tuy nhiên, điều này có thể tạo ra mã chunky và có thể khiến chúng ta tránh xa các nguyên tắc DRY. Tính đa hình là điều cần thiết trong việc tạo ra các ứng dụng OOP rõ ràng và hợp lý.

Hãy xem hai ví dụ về cách triển khai tính đa hình trong ngôn ngữ OOP như Ruby:thông qua tính kế thừa và kiểu gõ vịt.

Đa hình và kế thừa trong Ruby

Kế thừa là lớp con kế thừa các thuộc tính của lớp cha.

Dưới đây là một ví dụ về cách chúng ta có thể triển khai tính đa hình với tính kế thừa:

 

Đoạn mã trên có hai lớp con — StringedPercussion — kế thừa từ lớp cha Instrument . Ví dụ này là đa hình, vì chúng ta đang gọi một phương thức:instrument_example — và nó xuất ra nhiều dạng:Saxophone , Guitar , và Drums .

Ví dụ về việc đạt được tính đa hình thông qua kế thừa về cơ bản là ghi đè một phương thức, nhưng giúp cung cấp sự hiểu biết rõ ràng hơn về tính đa hình trong ngôn ngữ OOP.

Gõ vịt và đa hình trong Ruby

Một ví dụ thực tế hơn về tính đa hình trong OOP là thông qua việc gõ vịt, như được tham khảo bên dưới.

 

Mặc dù mỗi phương thức lớp được đặt tên là brand , chúng tôi không ghi đè phương thức (không giống như kế thừa đa hình). Thay vì kế thừa từ lớp cha, ở đây chúng ta có bốn lớp độc lập, mỗi lớp có phương thức riêng. Việc gõ vịt rất hữu ích vì chúng ta chỉ có thể lặp qua các lớp để nhận kết quả đầu ra của từng phương thức (ngược lại với việc gọi từng phương thức riêng biệt).

Một lần nữa, kiểu gõ vịt có tính đa hình khi chúng ta gọi một phương thức — brand — và tạo đầu ra có nhiều dạng:Gibson , Pearl , Fender , và Casio . Tất nhiên, kiểu gõ vịt và tính đa hình không cần thiết trong việc tạo ra kết quả này. Tuy nhiên, việc triển khai mã rõ ràng và logic sẽ rất hữu ích.

Tính đa hình trong Ruby on Rails

Tính đa hình hoạt động tốt trong Ruby on Rails dưới dạng liên kết Bản ghi hoạt động. Nếu các mô hình về cơ bản làm điều tương tự, chúng ta có thể biến chúng thành một mô hình duy nhất để tạo mối quan hệ đa hình.

Bám sát chủ đề nhạc cụ, hãy xem xét một ứng dụng trong đó người dùng có thể đăng, nhận xét và đánh giá các nhạc cụ. Kiểm tra Sơ đồ mối quan hệ thực thể (ERD) bên dưới:

Nắm vững tính đa hình trong Ruby on Rails:Hướng dẫn thực hành

Trong ví dụ này, chúng tôi có ERD cho một ứng dụng trong đó người dùng có thể đăng một công cụ kèm theo thông tin chi tiết về nó. Người dùng cũng có thể đưa ra nhận xét về công cụ được đăng đó.

Sau đó, những người dùng khác có thể đưa ra xếp hạng về công cụ và xếp hạng các nhận xét để xác định tính hữu ích hoặc tính hợp lệ của chúng. Các liên kết Bản ghi hoạt động này hoạt động tốt và phục vụ mục đích ứng dụng của chúng tôi.

Điều gì sẽ xảy ra nếu chúng ta muốn thêm các liên kết khác vào ứng dụng của mình? Chúng ta cần thêm và lặp lại các liên kết trùng lặp.

Ví dụ:nếu chúng tôi muốn thêm user_rating Để đánh giá độ tin cậy của người dùng, chúng ta cần tạo một bảng riêng với các liên kết riêng. Điều này có nghĩa là thêm một mối quan hệ mới giữa useruser_rating các mô hình. ERD khi đó sẽ trông giống như thế này:

Nắm vững tính đa hình trong Ruby on Rails:Hướng dẫn thực hành

Bây giờ chúng ta có ba mô hình về cơ bản thực hiện cùng một việc:xếp hạng một đối tượng, nhưng trong các bối cảnh khác nhau. Những liên kết này đã chín muồi cho một liên kết đa hình.

Chúng ta hãy xem ERD với các mô hình xếp hạng là đa hình:

Nắm vững tính đa hình trong Ruby on Rails:Hướng dẫn thực hành

Vì chúng tôi có rating cột, tôi đặt tên cho mô hình là reviews trái ngược với ratings để tránh nhầm lẫn. Ở đây, các mô hình không đánh giá vẫn có mối liên kết với các mô hình khác, nhưng các mô hình xếp hạng riêng biệt đã được hợp nhất thành một mô hình đánh giá duy nhất.

reviewable_typereviewable_id hiện đảm nhận vai trò tương tự như các mô hình xếp hạng riêng biệt bằng cách thể hiện mô hình mà bài đánh giá được liên kết với.

reviewable_type cột lưu trữ tên lớp mô hình (user , instrument_post , hoặc comment ) và reviewable_id lưu trữ ID tương ứng của mô hình đó.

Bây giờ chúng ta có thể sử dụng hai cột này để liên kết số nguyên xếp hạng với một người dùng, bài đăng hoặc nhận xét cụ thể thông qua các truy vấn Bản ghi hoạt động và/hoặc câu lệnh có điều kiện. Khóa ngoại user_id vẫn nằm trong mô hình đánh giá vì điều này cho phép chúng tôi theo dõi người dùng nào đã để lại đánh giá.

Hiện tại, thuật ngữ ‘-able’ trong mô hình đa hình của chúng ta có vẻ lạ, nhưng mục đích của nó sẽ sớm được làm rõ khi chúng ta thực hiện một số phép thuật Rails.

Mô hình đánh giá được coi là đa hình vì chúng tôi có một mô hình hoặc đối tượng có thể biểu diễn và có nhiều dạng:đánh giá của người dùng, nhận xét và công cụ đăng bài.

Triển khai tính đa hình trong Ruby on Rails

Đã đến lúc triển khai tính đa hình trong ứng dụng Rails! Nếu chúng ta hành động như thể chúng ta đã tạo user của mình , instrument_post , và comment các mô hình, chúng ta có thể bắt đầu kết hợp mô hình đa hình của mình:reviews .

Đầu tiên, tạo bảng và tạo mô hình từ thiết bị đầu cuối, như sau:

 

Điều này xây dựng tệp di chuyển:

 

schema.rb cập nhật tệp sau khi quá trình di chuyển được chạy. Tùy chọn đa hình biến đổi reviewable vào cột reviewable_typereviewable_id cột:

 
 

Bạn có nhớ khi chúng tôi đề cập đến thuật ngữ '-able' ở trên không? Đó là quy ước đặt tên của Rails để chỉ định liên kết đa hình của chúng tôi, cho chúng tôi khả năng làm cho người dùng, bài đăng công cụ và nhận xét 'có thể xem lại'.

Để phép thuật Rails này hoạt động, chúng ta cần đảm bảo rằng các mô hình khác được liên kết chính xác với mô hình đa hình của chúng ta.

 
 
 

user , instrument_post , và comment giờ đây các mô hình có thể được xem xét và đưa ra xếp hạng.

Nếu chúng tôi đã tạo ít nhất hai người dùng, một nhận xét và một bài đăng công cụ thì chúng tôi có thể tạo và truy cập các bài đánh giá thông qua nhiều cách khác nhau với Truy vấn bản ghi hoạt động, như sau:

 
 
 
 

Có nhiều cách khác để tương tác với reviews model, tùy thuộc vào dữ liệu bạn cần hiển thị. Điều quan trọng là phải chia sẻ cách các mô hình gốc có thể tạo đánh giá. Miễn là bài đánh giá được liên kết với người dùng và mô hình có thể xem lại, Bản ghi hoạt động sẽ tự động liên kết reviewable_idreviewable_type với mô hình được liên kết.

Nếu không có tính đa hình trong các ví dụ Rails của chúng tôi, sẽ có nhiều bảng hơn, các cột trùng lặp không cần thiết, belongs_to , và has_many các liên kết trong mô hình của chúng tôi. Tính đa hình đã làm giảm nhu cầu nối các bảng, cho phép liên kết và truy vấn Bản ghi hoạt động dễ dàng và nhanh chóng hơn.

Kết thúc:Sử dụng tính đa hình cho mã Ruby rõ ràng và hợp lý

Trong bài đăng này, chúng tôi đã khám phá tính đa hình trong hai môi trường riêng biệt:sinh học và lập trình Ruby. Trong cả hai trường hợp, tính đa hình là khả năng một đối tượng hiển thị nhiều dạng.

Chúng tôi đã xem xét cách triển khai tính đa hình trong Ruby thông qua tính kế thừa và kiểu gõ vịt trước khi đi sâu vào cách sử dụng tính đa hình trong Ruby on Rails một cách cụ thể.

Tính đa hình có thể giúp bạn viết mã rõ ràng và hợp lý. Mục tiêu của tôi là giúp bạn thêm khái niệm OOP thiết yếu này vào kho công cụ cho các ứng dụng hiện tại, tương lai và thậm chí có thể là trong quá khứ của bạn.

Chúc bạn viết mã vui vẻ!

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!