Lỗ chân trâu private trong Ruby
Ruby
106
White

Ngoc Dao viết ngày 22/03/2016

Tại Ruby Kaigi 2008, trong bài thuyết trình Rails症候群の研究 (Triệu chứng lập trình Rails mà không rành Ruby) Shugo Maeda có đề cập lỗ chân trâu public, protected, private cho những người quen với ngôn ngữ hướng đối tượng truyền thống như C++, Java, C#. Từ Ruby 2, public, protected, private sẽ giống trong Java hơn. Tuy nhiên, trong khi Ruby 2 sớm nhất 1 năm nữa mới ra mắt, thì chúng ta cũng cần xem Shugo Maeda nói gì để khỏi "đi sông đi biển không chết, về nhà chết lỗ chân trâu" (làm bao project to đùng ngon ơ, nhưng lại dính chấu chỗ bé tẹo này).

Nơi nhận tường minh và không tường minh

Trong Ruby, bản chất của gọi hàm là truyền message ngược dòng cây thừa kế, đến khi nào gặp được nơi hiểu và xử lí được message. Gọi hàm hoặc truyền message có nội dung là tên hàm đều có cùng tác dụng.

class A
def m
end
end

a = A.new
a.m
a.send(:m)

Đã truyền thì phải có nơi nhận (receiver). Vì trong Ruby mọi thứ đều là đối tượng, nên "nơi nhận" đó là đối tượng, trong ví dụ trên nơi nhận là đối tượng a. Khi nơi nhận là self, thì có thể viết self một cách tường minh (explicit) hoặc bỏ self đi một cách không tường minh (implicit). Tham khảo Use self explicitly.

public, protected, private

3 từ khoá này được giải thích mà không có nhiều ví dụ minh hoạ ở quyển Ruby gối đầu giường. Nếu bạn vẫn nghĩ 3 từ khoá này chẳng khác gì trong Java, dùng protected mà không dùng private như trong chương trình Rails ở dưới, thì ủm... bạn đã lọt lỗ chân trâu (pitfall):

class ApplicationController < ActionController::Base
before_filter :check_login

protected

def check_login
redirect_to(root_path) if session[:user_id].nil?
end
end

3 từ khoá này chỉ áp dụng cho phương thức:

  • Phương thức public: Giống trong Java, có thể được gọi thoải mái từ bất kì đâu (toàn phương)
  • Phương thức protected: Giống trong Java, có thể được gọi bởi đối tượng của lớp con (chiều dọc) hoặc đối tượng cùng loại (chiều ngang). Tham khảo Protected Methods and Ruby 2.0.
  • Phương thức private: Khác trong Java ở 2 điểm (1) không thể dùng với nơi nhận tường minh (2) có thể được gọi một cách không tường minh bởi đối tượng của lớp con (chiều dọc). Tham khảo đâyđây.
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
252 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
56 6
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết 2 năm trước
56 6
White
32 0
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết gần 2 năm trước
32 0
White
28 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết gần 2 năm trước
28 1
Bài viết liên quan
White
8 6
Chưa xem phần 2? Xem (Link) Trong bài viết này tôi giới thiệu cho các bạn về khái niệm function arity, một cách gọi mĩ miều của số lượng argument ...
Lơi Rệ viết hơn 2 năm trước
8 6
White
8 1
Tiếp theo (Link) Mình sẽ hướng dẫn cách test căn bản cho API mình tạo. Thật ra mà nói thì mình phải viết test trước khi làm nhưng mà để tránh việc...
My Mai viết hơn 2 năm trước
8 1
White
4 2
__Chú thích__: Đây là bản dịch tiếng Việt của bài viết gốc của tôi. Nếu bạn muốn xem bản tiếng Anh, xin hãy trỏ tới URL (Link) Lời mở (Link) là ...
Lơi Rệ viết gần 3 năm trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
252 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!