Viết C theo tinh thần hướng đối tượng
C
29
C++
30
oop
15
White

Ngoc Dao viết ngày 22/03/2016

Nhân vật ấn tượng nhất trong tuyệt tác Tiếu Ngạo Giang Hồ có lẽ ai cũng đồng ý là Lệnh Hồ công tử. Kim Dung tiên sinh đã kể rất nhiều tình tiết trong đó Hồ công tử lâm vào tình huống bi đát (như mất hết công lực) khi đối địch nhưng rốt cuộc vẫn chiến thắng. Lí do bởi công tử hiểu rõ được yếu quyết nguồn gốc của các chiêu thức, nên có thể vận dụng vào kiếm chiêu của mình và hoá giải tình huống đối thủ đặt ra một cách dễ dàng.

Nếu như võ công chỉ có vài môn phái chiếm đa số như kiếm tông, khí tông thì lập trình cũng vậy, chỉ có vài paradigm chiếm thế thượng phong như lập trình thủ tục, lập trình hướng đối tượng. Học là học cái tinh thần, thỉnh thoảng đâu đó ta nghe nói dùng PHP4 cũng có thể lập trình hướng đối tượng như PHP5, ngôn ngữ Ruby hướng đối tượng viết bằng ngôn ngữ C không hướng đối tượng là vì vậy.

Bài viết này trình bày vài nét phác thảo cách viết C theo tinh thần hướng đối tượng.

Tinh thần của hướng đối tượng có 4 điểm chính yếu, trong đó nhìn từ quan điểm của C thì quan trọng nhất là đóng gói, bởi chương trình = cấu trúc dữ liệu (data) + giải thuật (code) (bạn nào sắp đi xin việc nên nhớ câu hỏi "Chương trình là gì?" này, vì hay bị hỏi).

C có con trỏ dữ liệu, con trỏ hàm, ép kiểu v.v. cực mạnh nên đóng gói rất dễ thực hiện, 3 điểm còn lại cố một tí cũng thực hiện được:

typedef struct {
  int r, c;
  int *elements;
} Matrix;

int matrix_get_r(Matrix *this) {
  return this->r;
}

int matrix_get_c(Matrix *this) {
  return this->c;
}

void matrix_set_element(Matrix *this, int r, int c, int v) {
  this->elements[r*(this->c) + c] = v;
}

int matrix_get_element(Matrix *this, int r, int c) {
  return this->elements[r*(this->c) + c];
}

Matrix *matrix_new(int r, int c) {
  Matrix *ret;

  ret = (Matrix *) malloc(sizeof(Matrix));
  ret->r = r;
  ret->c = c;
  ret->elements = (int *) malloc(r*c*sizeof(int));

  return ret;
}

void matrix_delete(Matrix *this) {
  free(this->elements);
  this->elements = NULL;
  free(this);
}

Trên đây là trích đoạn chương trình nhân ma trận dùng thư viện OpenMPI. Chương trình hoàn chỉnh đính kèm ở bài Xử lí song song. Ta thấy:

  • Dùng struct để gói dữ liệu, tên struct viết hoa.
  • Hàm có tiền tố suy ra từ tên struct.
  • Hàm xxx_new và xxx_delete dùng để sinh và huỷ.
  • Ngoài xxx_new, tham số đầu tiên của tất cả hàm đều là con trỏ struct.
  • Dùng con trỏ struct ở mọi nơi, không dùng thẳng struct.
  • Học hỏi thiết kế của Ruby, ví dụ không truy cập thẳng dữ liệu của struct, mà phải thông qua hàm.

Bạn thấy đấy, nếu nắm được tinh thần của hướng đối tượng, thì dùng ngôn ngữ không hướng đối tượng C vẫn có thể tận dụng cái hay của nó.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
285 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
62 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết hơn 2 năm trước
62 8
White
40 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
40 1
White
34 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
34 1
Bài viết liên quan
Male avatar
0 0
Constructor của lớp cha luôn được gọi trước constructor của lớp con. class Foo { public: Foo() { cout << "Base class initializing" << endl; ...
baoquocphan viết hơn 1 năm trước
0 0
White
10 1
Chức năng pattern matching trong C++ thấy nói sẽ kill (Link). Cách viết C++ do vậy sẽ thay đổi tương đối. Tự nhiên tôi thấy phải nhìn lại visitor ...
cpplover viết 3 năm trước
10 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
285 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!