Lập trình hướng đối tượng (OOP)

(OOP), có 2 câu hi thc dng:

  • Nó có đặc thù gì?
  • Khi học một ngôn ngữ OOP nào đó, làm sao để kiểm tra xem ta đã nắm bắt được ngôn ngữ này hay chưa, bằng cách diễn tả các đặc thù này bằng cú pháp của ngôn ngữ này?

 

1: OOP có 4 đc thù chính, bt kì ngôn ng OOP nào cũng đu có cách đ din t:

  • Tính module: Có thể dùng module để gói nhiều lớp lại với nhau, còn có thể gọi là package, namespace.
  • Tính đóng gói: Có thể gói dữ liệu (data, ~ biến) và mã chương trình (code, ~ phương thức) thành một cục gọi là lớp (class) để dễ quản lí. Trong cục này thường data rất rối rắm, không tiện cho người không có trách nhiệm truy cập trực tiếp, nên thường ta sẽ che dấu data đi, chỉ để lòi phương thức ra ngoài. Ví dụ hàng xóm sang mượn búa, thay vì bảo hàng xóm cứ tự nhiên vào lục lọi, ta sẽ bảo: “Ấy bác ngồi chơi để tôi bảo cháu lấy cho”. Ngôn ngữ Ruby “phát xít” đến nỗi dấu tiệt data, cấm không cho truy cập từ bên ngoài.
  • Tính thừa kế: Nếu cha đã có phương thức m, thì con khỏi phải định nghĩa lại m, giúp chương trình ngắn gọn lại nhiều.
  • Tính đa hình: Đối tượng có thể thay đổi kiểu (biến hình). (1) Với các ngôn ngữ OOP có kiểu, có thể mượn phát biểu của C++ “con trỏ kiểu lớp cha có thể dùng để trỏ đến đối tượng kiểu lớp con”. Như vậy khi khai báo chỉ cần khai báo p có kiểu lớp cha, còn sau đó nó trỏ đến đâu thì kệ cha con nó: nếu cha và con cùng có phương thức m, thì từ p cứ lôi m ra gọi thì chắc chắn gọi được, không cần biết hiện tại p đang trỏ đến cha hay con. (2) Với ngôn ngữ OOP không có kiểu như Ruby, có thể mượn phát biểu của phương pháp xác định kiểu kiểu con vịt: “nếu p đi như vịt nói như vịt, thì cứ coi nó là vịt”. Như vậy nếu lớp C có phương thức m, mà hiện tại có thể gọi phương thức m từ đối tượng p bất kì nào đó, thì cứ coi p hiện có kiểu là C (một lát sau p biến hình thành kiểu khác thì mặc kệ, who cares? – thế giới vận động không ngừng, không theo kịp thì chết chứ tội tình gì)

2:

Nên làm bài tp nh v các con vt sau:

  • Tạo module Animal, trong moudule này tạo các lớp như trình bày ở dưới. (<- kiểm tra tính module)
  • Tạo lớp Animal có phương thức say_hello. (<- kiểm tra tính module, đóng gói)
  • Tạo 2 lớp Cat và Dog kế thừa từ Animal, trong đó override lại phương thức say_hello. (<- kiểm tra tính thừa kế, đóng gói)
  • Tạo lớp Zoo để quản lí nhiều Animal, có (1) phương thức add, remove để thêm, bớt đối tượng Animal hoặc con của nó (đối tượng của lớp thừa kế từ Animal), (2) phương thức say_hello để gọi say_hello của tất cả đối tượng nó quản lí. (<- kiểm tra tính đa hình)

Đây là bài tập gối đầu giường, khi được yêu cầu viết phải viết được ngay không ngắc ngứ. Ở dưới là ví dụ cho Ruby thể hiện 3 đặc thù (làm sao để thể hiện tính module là bài tập cho độc giả).

# zoo.rb

class Animal
attr_reader :name

def initialize(name)
@name = name
end

def say_hello
puts “I am animal, my name is #{@name}”
end
end

class Cat < Animal
def say_hello
puts “Meow, my name is #{@name}”
end
end

class Dog < Animal
def say_hello
puts “Woof woof, my name is #{@name}”
end
end

class Zoo
attr_reader :animals

def initialize
@animals = []
end

def add(animal)
@animals << animal
end

def remove(animal)
@animals.delete(animal)
end

def say_hello
@animals.each { |a| a.say_hello }
end
end

# Some test
if __FILE__ == $0
z = Zoo.new
animals = [Animal.new(‘A’), Cat.new(‘C’), Dog.new(‘D’)]
animals.each do |a|
z.add(a)
end

z.say_hello
z.remove(animals[0])
z.say_hello
end

Duck typing

Đoạn mã trên lưu thành tập tin zoo.rb. Để thử tính năng duck typing của Ruby, ta chạy thử tập tin duck.rb sau:

# duck.rb

require ‘zoo’

class Duck
attr_reader :name

def initialize(name)
@name = name
end

def say_hello
puts “Duck, my name is #{@name}”
end
end

# Some test
if __FILE__ == $0
z = Zoo.new
animals = [Animal.new(‘A’), Cat.new(‘C’), Dog.new(‘D’), Duck.new(‘D’)]
animals.each do |a|
z.add(a)
end

z.say_hello
z.remove(animals[0])
z.say_hello
end

Chạy thử thấy ngon lành. Để ý sẽ thấy lớp Duck không thừa kế từ Animal. Phỏng theo nhạc chế, có thể chế câu của Đặng Tiểu Bình thành: “Vịt trắng vịt đen đều là vịt. Thậm chí bất kể con gì đi như vịt nói như vịt cũng đều có thể coi là vịt.”


 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: