0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Lý do chọn Ruby để dạy Lập trình Hướng Đối Tượng (OOP) thay vì Python

Đăng vào 1 tháng trước

• 4 phút đọc

Giới thiệu

Chào các bạn!

Trong thời gian gần đây, công việc của mình đã mở rộng sang việc đào tạo cho các intern. Các bạn intern này chủ yếu là du học sinh đến từ các trường đào tạo công nghệ thông tin tại Tokyo, có nền tảng kiến thức lập trình còn hạn chế. Đặc biệt, mình chỉ có 3 tháng để truyền đạt kiến thức lập trình cơ bản, với 2 tháng đầu tập trung vào Lập trình Hướng Đối Tượng (OOP) và 1 tháng cuối để thực hiện các dự án. Do đó, việc lựa chọn ngôn ngữ lập trình phù hợp là rất quan trọng. Ban đầu, mình định chọn Python vì cú pháp dễ hiểu và phổ biến trong giới trẻ. Tuy nhiên, sau một thời gian thử nghiệm, mình đã quyết định chuyển sang Ruby để giảng dạy OOP. Bài viết này sẽ cung cấp lý do cho sự lựa chọn đó cũng như phân tích cụ thể ưu nhược điểm của hai ngôn ngữ.

Tổng quan về Lập trình Hướng Đối Tượng (OOP)

Lập trình hướng đối tượng (OOP) là một mô hình lập trình dựa trên khái niệm "đối tượng". Mỗi đối tượng sẽ chứa dữ liệu và các phương thức liên quan đến dữ liệu đó. OOP có 4 thuộc tính chính: Tính Đa Hình, Tính Kế Thừa, Tính Trừu Tượng và Tính Đóng Gói. Chúng ta sẽ cùng xem xét cách mà Ruby và Python thể hiện các thuộc tính này.

Khởi tạo Class

Cú pháp trong Python

Trong Python, để khởi tạo một class, bạn cần viết:

python Copy
class Dog:
    pass

Cú pháp trong Ruby

Còn trong Ruby, cú pháp đơn giản hơn:

ruby Copy
class Dog
end

Nhận xét

Cả hai ngôn ngữ đều có cú pháp tương đối giống nhau. Tuy nhiên, Python yêu cầu từ khóa pass để kết thúc một class rỗng, trong khi Ruby sử dụng từ khóa end, điều này khiến Ruby trở nên chặt chẽ hơn khi giảng dạy OOP.

Tính Kế Thừa

Python

Python cho phép một class kế thừa từ class khác như sau:

python Copy
class Animal:
  def __init__(self, name):
    self.name = name

  def speak(self):
    print("Generic animal sound")

class Dog(Animal):
  def __init__(self, name, breed):
    super().__init__(name)
    self.breed = breed

  def speak(self):
    print(f"{self.name} (the {self.breed}) barks!")

Ruby

Ruby thể hiện tính kế thừa như sau:

ruby Copy
class Animal
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def speak
    puts "Generic animal sound"
  end
end

class Dog < Animal
  attr_reader :breed

  def initialize(name, breed)
    super(name)
    @breed = breed
  end

  def speak
    puts "#{name} (the #{breed}) barks!"
  end
end

Nhận định

Cả Ruby và Python đều thể hiện tính kế thừa rõ ràng với cú pháp dễ hiểu.

Tính Đa Hình

Cú pháp trong Python

python Copy
class Animal:
  def make_sound(self):
    print("Generic animal sound")

class Dog(Animal):
  def make_sound(self):
    print("Woof!")

class Cat(Animal):
  def make_sound(self):
    print("Meow!")

Cú pháp trong Ruby

ruby Copy
class Animal
  def speak
    puts "Generic animal sound"
  end
end

class Dog < Animal
  def speak
    puts "Woof!"
  end
end

class Cat < Animal
  def speak
    puts "Meow!"
  end
end

Nhận định

Cả hai ngôn ngữ đều thể hiện đặc tính đa hình một cách rõ ràng và dễ hiểu.

Tính Trừu Tượng

Python

Python biểu diễn tính trừu tượng với module abc:

python Copy
from abc import ABC, abstractmethod

class Car(ABC):
    @abstractmethod
    def mileage(self):
        pass

Ruby

Trong Ruby, ta sử dụng module:

ruby Copy
module Car
  def mileage; end
end

Nhận định

Sự khác biệt giữa hai ngôn ngữ là Python hỗ trợ đa kế thừa nhưng Ruby không; thay vào đó, Ruby sử dụng modules để đạt được tính đa hình.

Tính Đóng Gói

Cú pháp trong Ruby

ruby Copy
class Example
  def public_method
  end
  protected
  def protected_method
  end
  private
  def private_method
  end
end

Cú pháp trong Python

Tương tự, Python sử dụng các prefix để xác định mức độ truy cập:

python Copy
class Example:
  def public_method:
    pass
  def _protected_method:
    pass
  def __private_method:
    pass

Nhận định

Phân loại public, protected và private trong Ruby rõ ràng hơn so với Python, vì Python chỉ sử dụng prefix để xác định quyền truy cập.

Kết luận

Sau khi so sánh chi tiết, mình nhận thấy rằng Ruby giúp người học nắm vững OOP hơn nhờ cú pháp rõ ràng và dễ hiểu, đặc biệt là trong các vấn đề liên quan đến tính đóng gói. Với kinh nghiệm thực tế, sau khi chuyển sang dạy bằng Ruby, các intern mình đã đào tạo có tiến bộ rõ rệt trong việc áp dụng OOP.

Cuối cùng, mình muốn chia sẻ một video thú vị nói về việc chọn ngôn ngữ lập trình:
Chúc các bạn thành công trong sự nghiệp lập trình! Và đừng quên ủng hộ mình nước cafe qua kênh donate của mình nhé: Donate Link
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào