12/08/2018, 13:21

Modules, Classes, and Objects trong ruby

Trong chủ đề lần này, tôi sẽ đề cập đến các bạn vấn đề không hề mới, nhưng có tính nền tảng cơ bản và rất quan trọng. Làm thế nào để phân biệt được các khái niệm Modules Classes Objects trong ruby? Điều đầu tiên tôi muốn nhắc lại ở đây là Ruby là object-oriented programming language. Điều đó có ...

Trong chủ đề lần này, tôi sẽ đề cập đến các bạn vấn đề không hề mới, nhưng có tính nền tảng cơ bản và rất quan trọng. Làm thế nào để phân biệt được các khái niệm Modules Classes Objects trong ruby?

Điều đầu tiên tôi muốn nhắc lại ở đây là Ruby là object-oriented programming language. Điều đó có nghĩa là một khởi tạo trong Ruby được gọi là class, điều đó cho phép bạn cấu trúc chương trình của mình một cách riêng biệt. Sử dụng Class, bạn có thể thêm tính nhất quán cho chương trình của bạn. Và bạn có thể sử dụng để xây dựng một cách minh bạch. Ít nhất, đó là theo lý thuyết.

Và bây giờ, tôi sẽ chia sẻ với các bạn về ngôn ngữ hướng đối tượng của classes, and objects sử dụng những gì bạn đã biết về hashes và modules.

  1. Modules như là hashes

Bạn biết làm thế nào để tạo mới và sử dụng một hash, và đó là cách để map đến một thứ khác. Điều đó có nghĩa là nếu bạn có 1 hash với key là apple và bạn muốn get giá trị của nó.

mystuff = {'apple' => "I AM APPLES!"}`

puts mystuff['apple']

Vẫn giữ tư tưởng get X from Y chúng ta sẽ liên tưởng đến modules cũng có cơ chế tương tự.

Những điều cần nhớ về modules:

  1. Các hàm trong ruby thường được đặt bên trong một block module .. end.

  2. Bạn import file đó

  3. Bạn có thể truy cập vào các functions hoặc các biến trong modules bằng dấu . (dot).

Tiếp theo, tưởng tượng bạn đang có một module và đặt tên là mystuff.rb và một hàm apple :

module MyStuff
    def MyStuff.apple()
        puts "I AM APPLES!"
    end
end

Để dùng lại module trên, chúng ta có thể require module trên và truy cập đến hàm apple:

require "./mystuff.rb"
MyStuff.apple()

Chúng ta cũng có thể put vào một biến, đặt tên là tangerine:

module MyStuff
    def MyStuff.apple()
        puts "I AM APPLES!"
    end

    TANGERINE = "Living reflection of a dream"
end

Chúng ta cũng có thể truy cập đến module trên bằng cách:

require "./mystuff.rb"

MyStuff.apple()
puts MyStuff::TANGERINE

Chúng ta có một đặc điểm rất chung về ruby:

  1. Lấy một cặp key = value là một kiểu đóng gói
  2. Lấy giá trị thông qua key's name.

Trong trường hợp của hash, cú pháp là [key], còn trong trường hợp của module là .key . Còn những thứ khác đều gần như giống nhau.

  1. Classes lại giống như Modules

Bạn có thể tưởng tượng, Modules như một dạng đặc biệt của Hash, bạn có thể lưu trữ và truy cập thông qua . Ruby cũng cung cấp một kiểu cấu trúc khác cũng phục vụ các mục đích tương tự, gọi là class.

Một class là cách để nhóm các functions và data và được đóng gói mà bạn cũng có thể truy cập đến thông qua hành động .

Chúng ta tạo ra một class cũng giống như mystuff module.

class MyStuff

    def initialize()
        @tangerine = "And now a thousand years between"
    end

    attr_reader :tangerine

    def apple()
        puts "I AM CLASSY APPLES!"
    end
end

Nhìn qua có vẻ phức tạp hơn cách thức hoạt động của module. Tuy nhiên, bạn nên hiểu, làm thế nào một "mini-module" với MyStuff lại có thể có function apple được khởi tạo như thế. Điều đó có thể làm bạn bối rối, bởi hàm initialize và sử dụng @tangerine để settings biến instance tangerine.

Phép khởi tạo này chính là điểm khác nhau giữa Class và Module.

Tôi sẽ giải thích vì sao ở đây lại dùng class thay vì dùng module. Đó là vì bạn có thể lấy class MyStuff và sử dụng chúng cho rất nhiều thứ, nhưng mà với con số hàng triệu trong một khoảng thời gian, điều đó cũng không gây trở ngại đến mỗi phần tử khác. Khi bạn thực hiện import một module thì chỉ có một phần tử chương trình, tức là không có phép toán tạo mới nếu bạn không thực hiện phép hack nào khác =))

  1. Object lại giống như require.

Nếu Class giống như 'mini-module', thì Object lại có khái niệm tương tự như require cho Class. Đó là create. Khi bạn khởi tạo một class đó chính là bạn đang gọi Object.

Bạn khởi tạo một class bằng cách gọi function new:

1. thing = MyStuff.new()
2. thing.apple()
3. puts thing.tangerine

Dòng thứ nhất là hành động khởi tạo, giống như việc gọi một function. Chúng ta sẽ phân tích trình tự của Ruby:

  1. Ruby tìm kiếm MyStuff và các class mà nó được định nghĩa.

  2. Ruby tạo ra một empty object với tất cả các functions xác định bằng def vì bạn sử dụng MyStuff.new().

  3. Ruby sau đó sẽ tìm nếu bạn gọi đến hàm khởi tạo, và tạo ra một empty object.

  4. Khi gọi đến hàm khởi tạo của MyStuff, sau đó khai báo biến @tangerine, và @tangerine trở thành một phần của object. Ruby thường sử dụng @ and $ để xác định biến được cấp phát. $ là biến global, ví dụ $stdin thì sẽ được gọi ở tất cả mọi nơi. @ thường được định nghĩa cho một object.

  5. Ở đây, ta định nghĩa @tagerine là lời một bài hát.

  6. Ruby sẽ cập nhật giá trị mới nhất cho biến.

Tựu chung lại:

Class như một bản thiết kế hoặc là các định nghĩa để tạo nên các mini-modules.

Khởi tạo nghĩa là làm việc tạo mới các mini-modules và các require cùng lúc. Tức là tạo ra một object và đồng thời cho object các quyền require các function đã định nghĩa trong class.

Kết quả của quá trình khởi tạo mini-modules gọi là object, sau đó gán các giá trị mới cho object đó và thực hiện các thao tác với nó.

0