Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Lỗ chân trâu private trong Ruby 1440

ngocdaothanh.myopenid.com 172
Updated over 3 years ago

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 Deciphering protected methods in Ruby.
  • 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.

Comments

akia.myopenid.com 6
over 3 years ago

Thực ra khi phân biệt được public, private, protected rồi thì thấy nó hoàn toàn hợp lý, và dễ hiểu, việc nhầm lẫn là do newbie chưa tìm hiểu cách sử dụng kỹ càng mà đã dùng bừa. Những tài liệu về 3 từ khoá này cũng nên kèm những ví dụ minh hoạ dễ hiểu hơn như anh Ngọc đã dề cập.

Trong hội nghị ruby vừa qua, các nhà phát triển ruby đang bàn về hướng giải quyết hay là chuyển động tác của protected giống hoàn toản với private. Theo mình điều này sẽ gây ra nhiều bất tiện và nguợc lại gây khó hiểu hơn. Xét về trực quan và ngữ nghĩa đều không hợp lý. Muốn phản đối mà không biết nên ý kiến ở đâu?

Xung quanh vấn đề này không biết mọi người ý kiến thế nào?

ngocdaothanh.myopenid.com 172
over 3 years ago

Muốn phản đối mà không biết nên ý kiến ở đâu?

Ruby có (vài?) mailing list (truyền thống chung của open source), akia đăng kí tham gia mailing list để nghe ngóng và phát biểu ý kiến xem sao.

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content