Giap Hiep

I'm Giap Hiep

I'm a web developer, a gymer. I enjoy share something i know that help people's work!
Giap Hiep

Tôi đã giải thích về OOP cho học sinh lớp 7 thế nào?

OOP là một khái niệm khó hiểu ngay cả với những sinh viên năm cuối đại học, thú thật là mãi cho đến khi đi làm tôi mới nghiêm túc tìm hiểu lại OOP là gì và cũng đã phải rất vất vả mới có thể thẩm thấu được chút đỉnh :v

Có lẽ một phần là vì với một sinh viên năm nhất năm hai bắt đầu học về Java, các khái niệm của giảng viên giải thích quá mơ hồ, thường chỉ tập trung vào hướng dẫn code chứ không tập trung giải thích cụ thể về OOP. Vậy mà đúng là chạy trời không khỏi nắng, vào một buổi đẹp trời nọ, tôi cũng đã phải giải thích lại khái niệm về OOP cho các học sinh lớp 7, với người lớn đã khó, vậy làm thế nào để giải thích cho các em nhỏ hiểu được các khái niệm cực kỳ trừu tượng này?

Bắt đầu với những thứ quen thuộc

Thoạt đầu tôi đã vô cùng bối rối với bài giảng của mình, không biết nên bắt đầu từ đâu là tốt nhất, đi nói về khái niệm luôn cũng dở nên tôi đã cho các học sinh của mình đi tìm hiểu về một thứ trước: kiểu dữ liệu object

Có một điều khá may mắn đó là các học sinh của tôi đã được tìm hiểu về các khái niệm cơ bản của ngôn ngữ lập trình bao gồm cả kiểu Array nên bắt đầu với kiểu dữ liệu Object cũng không mấy khó khăn.

Còn tại sao tôi lại nghĩ đến điều này thì là vì một đối tượng trong OOP cũng (có thể coi) là một object, vậy nên bắt đầu cho các em làm quen dần cũng không phải ý tồi, thế nào cũng có bạn sẽ cảm thấy ngờ ngợ rằng cái OOP này hình như mình đã thấy ở đâu rồi cho mà xem :D

Và đương nhiên để nói về object thì tôi cũng bắt đầu với việc cho các em lấy một ví dụ về một chủ đề mà các em thích: Phim ảnh

Yêu cầu là: Hãy kể ra các thành phần để tạo nên một bộ phim?

Kết quả là chúng ta có:

  • Tên phim
  • Nhân vật
  • Đạo diễn
  • Kinh phí
  • Đạo cụ
  • ...

Trông có vẻ không đúng lắm nhưng thôi gọi là chấp nhận được =))

Vậy một bộ phim được cấu thành từ các thành phần này nên chúng ta sẽ gọi mỗi thành phần này là một thuộc tính (property) và chính bản thân bộ phim là một thực thể (object).

Từ đó suy ra một thực thể được cấu thành từ nhiều thuộc tính khác nhau.

Đó là kết thúc của bài giảng về Object

Đến giải thích các khái niệm trừu tượng

Sau khi đã giải thích cho các em về Object - chính là kết quả khi ta khởi tạo một đối tượng từ Class của nó, tôi bắt đầu giải thích cho các em về OOP bằng cách phát triển rộng ra từ chính những khái niệm mà các em đã biết: objectproperty

Đầu tiên vẫn là bắt đầu bằng một ví dụ quen thuộc, lần này tôi lấy ví dụ về các công đoạn để chế tạo một chiếc xe hơi. Quy trình để chế tạo một chiếc xe chắc chắn sẽ bắt đầu từ một bản thiết kế, ở đây tôi đã vẽ cho các em một bản thiết kế cơ bản:

Và đương nhiên vẫn với câu hỏi cơ bản, tôi yêu cầu các em xác định xem để có thể lắp được một chiếc xe từ bản thiết kế này chúng ta cần những bộ phận nào:

  • Bánh xe
  • Khung xe
  • Động cơ
  • Màu sắc
  • Nội thất

Đó là một số đặc điểm cơ bản mà các em kể được, và đó chính là ý tưởng cơ bản của một thứ sẽ tạo thành các object sau này: class

Class giống như một bản thiết kế nguyên thủy của chiếc xe, với các bộ phận cơ bản và chung chung, nhìn vào bản thiết kế người ta không thể biết được đây là dòng xe gì, hãng xe gì, hoạt động ra làm sao, nhưng người ta biết chắc chắn một điều rằng bản thiết kế này sẽ cho ra sản phẩm là một chiếc xe và chính cái sản phẩm được ra đời từ bản thiết kế đó chúng ta gọi nó là các object.

Vậy ở đây có 2 khái niệm cần lưu ý:

  • Class: giống như một bản thiết kế dùng để tạo ra các object (đối tượng), bản thân Class không phải là một object
  • Object: được tạo ra từ một Class, các object được tạo ra từ class nào sẽ có đầy đủ các thuộc tính của class đó.

Giống như những chiếc xe được tạo ra từ bản thiết kế kia đều sẽ phải có: bánh xe, khung xe, động cơ, nội thất,... Chỉ có điều là với mỗi chiếc xe được sản xuất ra người ta sẽ thay đổi giá trị của các thuộc tính đó để biến tấu ra nhiều dòng xe khác nhau.

Ví dụ như một chiếc BMW cũng sẽ có các thuộc tính như trên, nhưng nó sẽ mang động cơ khác với màu khác so với xe Toyota chẳng hạn

Và cuối cùng kết quả khi tạo ra một đối tượng từ một class nào đó nó sẽ có kiểu dữ liệu tương đồng với kiểu object mà các em đã được học ở bài trước kia.

Tuy nhiên nếu một chiếc xe chỉ có các thuộc tính như trên thì nó sẽ không thể nào chạy được, khi chế tạo một chiếc xe, người ta đồng thời cũng sẽ phải cung cấp cho nó khả năng hoạt động, để biểu thị khả năng này trong mỗi class chúng ta có một khái niệm gọi là phương thức - method.

Về bản chất thì method vẫn chỉ là một function bình thường, tuy nhiên điểm đặc biệt là các method này sẽ tương tác với các thuộc tính của chiếc xe, ví dụ như bạn muốn một chiếc xe có thể lăn bánh được thì bạn sẽ quy định cho nó method run() chẳng hạn, trong method này bạn đặt lại thuộc tính động cơ = 'active', và thế là chiếc xe chạy phà phà :D

class Car:
    engine = 'rest'
    
    def run(self):
        return self.engine = 'active'

Tổng kết lại:

Chúng ta có 4 khái niệm cần lưu ý trong bài học cơ bản về OOP này:

  • Class
  • Object
  • Property
  • Method

Những câu hỏi học sinh

Tuy giải thích là vậy nhưng có một điều tôi cũng cần phải giải thích với các học sinh của tôi, tại sao lại là OOP? hay chính xác hơn: tại sao lại phải áp dụng OOP vào bộ code của mình?

Đây là câu hỏi khó giải thích, vì các em đã quen với việc code tất cả trong một file nên tôi lại quay lại với cách giải thích đơn giản nhất: lấy ví dụ

Hãy tưởng tượng các em muốn xây dựng một game nho nhỏ, game rắn săn mồi chẳng hạn, chúng ta sẽ phải tạo ra những gì:

  • Rắn
  • Mồi
  • Bàn chơi

Vậy các em sẽ tạo ra những đối tượng này bằng cách nào đây? Với cách truyền thống thì các bạn có thể sử dụng thư viện Turtle hoặc Pygame để vẽ ra một con rắn với: màu sắc, chiều dài,... Điều này hoàn toàn hợp pháp :D không ai cấm cả, tuy nhiên nó sẽ khiến cho bộ code của các bạn trở nên cồng kềnh hơn rất nhiều, và thật sự tôi đã cho các em làm thử với cách truyền thống

Sau đó tôi hỏi: có ai để ý tôi gọi những thứ ở trên là các đối tượng không? và những màu sắc, chiều dài, điểm số,... nó chính là các property của đối tượng, tức là chúng ta hoàn toàn có thể quy đổi những thứ ở trên về với bộ code OOP và đương nhiên tôi đã hướng dẫn các em cách để làm điều này, so sánh với bộ code cũ, rõ ràng code theo OOP đơn giản và linh động hơn rất nhiều, nó cũng làm bộ code tường minh hơn, dễ sửa chữa hơn nữa.

Trong thực tế phát triển phần mềm phục vụ cuộc sống, tất cả các dữ liệu thu thập được từ thực tế đều có thể quy về dưới dạng đối tượng, các bạn có các sự vật, các sự vật thì có các đặc điểm, nói đơn giản như một phần mềm quản lý học sinh chẳng hạn, thì với mỗi học sinh cần quản lý cũng sẽ có những đặc điểm nhất định, và mỗi học sinh các bạn cũng chính là một thực thể, một đối tượng, hay một object.

Đó là kết thúc bài giảng!