Sunday, June 19, 2016

Tư duy hướng đối tượng (OOP) từ góc nhìn embedded C Developer

    Xuất thân từ điện-điện tử, mình chủ yếu lập trình với vi điều khiển sử dụng ngôn ngữ C (lập trình thủ tục), quen với việc sử dụng các hàm để giải quyết vấn đề. Nhược điểm của cách làm này là nếu quản lý không tốt, không chia tách thành được các module độc lập thì khó control đưọc project,  dễ phát sinh bug. Do đó mình tìm hiểu thêm về tư duy hướng đối tượng để có cách quản lý chương tình tốt hơn

 Định nghĩa

   + Tư duy lập trình hướng đối tượng là tư duy lập trình mà theo đó tất cả mọi thứ có thể định nghĩa được thuộc tính (properties) và phương thức (method) đều được coi là các đối tượng.
  + Như vậy tư duy lập trình hướng đối tượng là cách nhìn nhận một sự vật, sự việc dưới dạng một đối tượng (bao gồm thuộc tính và hành vi ). Thuộc tính của đối tượng sở hữu có thể phơi ra hoặc đưọc ẩn đi, hành vi có thể do đối tượng tự thực hiện hoặc đối tượng khác tác động vào. Ví dụ con người có thuộc tính (mắt, mũi, mồm,..) và các hành vi (ăn, ngủ, đi vệ sinh :D, đánh nhau). Một cái cây có thuộc tính (lá, rễ, cao, đường kính thân) và hành vi (quang hợp, chặt cây,...)

Phân tích

Trừu tượng hóa đối tượng
+ Ngôn ngữ lập trình bản chất chỉ là một công cụ để giải quyết một vấn đề thực tế -> khi thiết kế ta phải nhìn từ góc độ thực tế hay nói cách khác đó là trừu tượng hóa (mô hình hóa) sự vật, sự việc cụ thể. Trừu tượng hóa là tìm các thuộc tính và hành vi của đối tượng từ thực tế và mô tả lại bằng ngôn ngữ lập trình
+ Phân tích module gsm
- Thuộc tính

  • loại module (SIM900, HL6528, SIM908,..)
  • hãng sản xuất (SIMCOM, Serria Wireless)
  • cường độ sóng
  • nhà mạng
  • có đăng kí 3g không
  • sim bị khóa không
- Hành vi

  • gọi
  • nhắn tin
  • bật 3G/GPRS
  • Truy cập website qua http request
  • gửi/nhận dữ liệu qua tcp
  • gửi/nhận dữ liệu qua udp
  • download file từ ftp sever

Class và đối tượng
  + Sau khi trừu tượng hóa đối tượng thực tế ta sẽ có một class bằng cách tìm những loại thuộc tính và hành vi giống nhau nhất của các đối tượng gom thành class. 
  + Phân tích ví dụ về module gsm ở trên
     Module gsm có nhiều loại, có loại chỉ có thể nhắn tin gọi điện (trong "stupid" phone), có loại có khả năng kết nối GPRS, có loại cao hơn có kết nối 3G/4G ("smart phone"). Tuy nhiên tất cả đều có tính năng GSM (nhắn tin, gọi điện). Do đó ta sẽ tạo một class STUPID_GSM
  - Thuộc tính

  •   cường độ sóng
  •   nhà mạng
  •   các cell mà module gsm nhìn thấy
  •   thuộc tính liên quan đến SIM (liên quan đến SIM ta cũng có thể tạo một class SIM)
  - Hành vi

  •   gọi điện
  •   nhắn tin đi
  •   đọc tin nhắn đến
      Với các module gsm có thêm tính năng GPRS, 3G/4G thì ta sẽ tạo một class SMART_GSM kế thừa từ class STUPID_GSM tức là có đầy đủ thuộc tính và hành vi của class STUPID_GSM ngoài ra thêm một số thuộc tính và hành vi về data
  - Thuộc tính

  •   Loại kết nối (GPRS/3G/4G)
  - Hành vi

  •   http request/http response
  •   tcp client
  •   udp client
  •   ftp client
  + Đối tượng là một thể hiện của class trong thực tế ví dụ như class SMART_GSM sẽ có các đối tượng như SIM900, HL6528,,...Trong một project nếu chúng ta sử dụng một module gsm chỉ có nhắn tin, gọi điện và một module gsm có cả data  thì chúng ta cần khởi tạo 2 đối tượng

  •   STUPID_GSM  SIMxx;
  •   SMART_GSM  SIM900;


Tổng kết

Hướng đối tượng là tính năng của một số ngôn ngữ C++, C#,.. nhưng chúng ta cũng có thể áp dụng tư duy hướng đối tượng trong lập trình C để có thể quản lý các thành phần ngoại vi tốt hơn bằng cách coi mỗi ngoại vi như một đối tượng (SD card, gsm module, LAN module đều có thể coi như những đối tượng) và sử dụng kiểu cấu trúc struct là công cụ để thể hiện thay cho class

Related Posts:

3 comments: