Các loại biến và cách sử dụng Module trong Ruby
Bất kì một ngôn ngữ lập trình nào đều có khái niệm biến và Ruby cũng không ngoại lệ, đây là kiến thức nền tảng trong lập trình mà hầu như lập trình viên nào cũng phải học đầu tiên.
Và ngoài ra trong mỗi ngôn ngữ đều có một đặc thù riêng, đối với ngôn ngữ Ruby sẽ có khái niệm Module. Vậy Module là gì thì chúng ta cùng nhau theo dõi để hiểu rõ hơn về nó.
1. Module trong Ruby là gì?
Module là một tập các phương thức, lớp, hằng số, do đó module cũng gần giống như class, chỉ khác là module không thể tạo các đối tượng và không thể thừa kế.
Thường thì chúng ta sẽ gộp các lớp, phương thức và hằng số có liên quan với nhau vào một module để tránh xung đột tên. Nếu bạn đã từng làm việc với C# và Java thì có thể nói module trong Ruby tương đương với namespace trong C# và package trong Java vậy.
Bài viết này được đăng tại [free tuts .net]
Cách mà chúng ta tạo ra một module ở trong Ruby. Thực sự rất rất đơn giản.
module MyFirstModule def say_hello “Hello, My name's Tăng Quốc Minh” end end
Để sử dụng được các method của module ở trong các class chúng ta thường "include" hay "extend" những module này vào trong các class đó. include hay extend module vào trong một class nghĩa là class đó có thể truy cập các phương thức được khai báo ở trong module.
- Đối với include: Khi ta sử dụng include module vào trong class thì các phương thức trong module sẽ được xem là instance method trong class
- Đối với extend: Khi ta sử dụng extend module vào trong class thì các phương thức trong module sẽ được xem là class method trong class
module MyFirstModule def say_hello 'Hello, I am a Module' end end class A include MyFirstModule end class B extend MyFirstModule end puts A.new.say_hello puts B.say_hello
Kết quả sau khi chạy chương trình
Ở trong class A ta sử dụng include cho nên ta gọi phương thức say_hello phải thông qua một đối tượng. Trong class B ta sử dụng extend nên ta sẽ gọi nó như là một class method.
2. Các loại biến trong Ruby
Trong Ruby có 5 loại biến mà chúng ta cần lưu ý:
- Biến cục bộ (local variable)
- Biến đối tượng (instance variable)
- Biến toàn cục (global variable)
- Biến lớp (class variable)
- Hằng (constant): Một số bạn vẫn hay nhầm lẫn giữa hằng số và biến, thực ra hằng số củng được xem như là biến, nhưng tính chất của mỗi biến là khác nhau.
Biến cục bộ (local variable)
Phạm vi sử dụng của biến cục bộ phụ thuộc vào vị trí của biến khi khai báo.
#irb local_variable = 'Toi nam ngoai method.' def variable_scope puts local_variable = 'Toi nam trong method.' end variable_scope #Toi nam trong method puts local_variable #Toi nam ngoai method
Ta thấy mặc dù có cùng tên nhưng giá trị in ra là khác nhau, vì biến local_variable ở trong phương thức variable_scope không có liên quan gì với biến local_variable ở ngoài phương thức. Mặc dù chúng có cùng tên biến. Biến này ta thường hay dùng trong một phương thức
Biến đối tượng (instance variable)
Biến được bắt đầu bằng ký tự @ được gọi là "Biến Đối Tượng", có nghĩa là nó chỉ thuộc về một đối tượng riêng lẻ hoặc một đối tượng của một lớp.
class Nguoi def initialize(ten) @ten = ten end def show puts @ten end end first = Nguoi.new('Quoc') first.show # Quoc second = Nguoi.new('Minh') second.show # Minh
Ở ví dụ trên ta thấy instance variable chỉ thuộc riêng lẻ cho mỗi đối tượng và phạm vi sử dụng của nó là toàn bộ trong một lớp.
Biến toàn cục (global variable)
Khác với biến cục bộ, biến toàn cục được khai báo với tên bắt đầu bằng ký tự $ và biến toàn cục có phạm vi sử dụng trong toàn bộ chương trình. Đối với bạn nào đã từng học về PHP thì rất dễ bị nhớ nhầm lẫn biến này trong Ruby lắm nhé.
$global_variable = 'Toi chua duoc thay doi.' def variable_scope puts $global_variable = 'Toi da bi thay doi.' end variable_scope #Toi da bi thay doi. $global_variable #Toi da bi thay doi.
Ta thấy, khi giá trị của biến toàn cục thay đổi ở trong phương thức, thì sự thay đổi này ảnh hưởng ra tới bên ngoài phương thức. Như vậy, phạm vi của biến toàn cục là toàn bộ chương trình. Các bạn nên hạn chế sử dụng biến này nếu như không cần thiết.
Biến lớp (class variable)
Để định nghĩa biến thuộc class, chúng ta sử dụng ký tự @@ trước tên biến. Khác với instance variable, class variable sẽ được dùng chung cho tất cả các đối tượng của lớp đó.
class Dog def initialize(leg) @@leg = leg end def show_leg puts @@leg end end first = Dog.new(4) first.show_leg # 4 second = Dog.new(10) second.show_leg # 10 first.show_leg # 10
Như ví dụ trên ta thấy biến @@leg đã bị thay đổi sau khi đối tượng second được tạo.
Hằng (constant)
Hằng trong Ruby củng giống như một biến, ngoại trừ giá trị của hằng sẽ không bị thay đổi trong quá trình chương trình chạy. Nếu như ta đã khai báo hằng sau đó overwrite lại giá trị của hằng thì vẫn được nhưng trình thông dịch của Ruby sẽ cảnh báo đã tồn tại. Tên hằng số phải được viết hoa
AT_CONST = 105 AT_CONST = 205 "warning: already initialized constant AT_CONST"
3. Quy tắc đặt tên file, phương thức, biến, class và module
Trong bất kỳ ngôn ngữ nào củng có quy chuẩn đặt tên biến và class. Trong Ruby sẽ có 1 số quy ước như sau:
- Tên file, thư mục, biến và phương thức chúng ta nên sử dụng dạng snake_case. Ví dụ: groups_users, teams_users, projects_users
- Tên class và module ta sử dụng dạng CamelCase. Ví dụ: ProjectsUser, GroupsUser, TeamsUser
Ngoại lệ, đối với tên hằng ta phải viết hoa toàn bộ, và có thể cách nhau bởi dấu gạch dưới (cái này gọi là SCREAMING_SNAKE_CASE)
Lưu ý: Chúng ta nên sử dụng tiếng anh để đặt tên, đối với những từ viết tắt như HTTP, RFC, XML thì viết hoa
Đặt tên là để gợi nhớ, ví dụ khi gọi đến tên của bạn là người ta biết ngay đó là bạn mà không nhầm sang người khác, đặt tên trong lập trình cũng vậy cần phải tường minh.
Có một số bạn đặt tên các biến rất lạc quan, ví dụ: @blablabla, @oh_yeah_oh_fuck, @hahhahaa… vãi cả nón, khi đọc code chắc bị ngộ độc tên biến, không thể hiểu được các biến này dùng làm gì, đặc biệt hơn nữa là khi xử lý qua lại đánh tên các biến này khó vãi, chắc phải copy cho chắc ăn. =))
4. Kết luận
Trong bài này mình đã giới thiệu các bạn cách tạo Module, sử dụng module và các loại biến trong Ruby. Và thông thường thì mình sử dụng module để nhóm các phương thức cùng thực hiện 1 chức năng gì đó lại với nhau.
Đối với biến thì các bạn nên sử dụng 3 loại biến chính là biến local, biến instance và hằng số; 2 biến còn lại củng rất ít khi dùng. Về các quy tắc hay gọi là convention thì mình sẽ có riêng 1 bài cụ thể đi sâu hơn. Qua bài sau mình sẽ nói về câu điều kiện, vòng lặp và một số toán tử.