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
class Dog:
pass
Cú pháp trong Ruby
Còn trong Ruby, cú pháp đơn giản hơn:
ruby
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
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
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
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
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
from abc import ABC, abstractmethod
class Car(ABC):
@abstractmethod
def mileage(self):
pass
Ruby
Trong Ruby, ta sử dụng module:
ruby
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
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
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