Object Oriented là một Design Pattern?

Trước giờ mình được học thì thật sự là chưa bao giờ nghe Object Oriented là một Design Pattern. Mà thường là một Programming Paradigm hay Metholodogy, một Design Concept.

Tuy nhiên dạo Reddit thì gặp link này của bên SQLite nói lý do là tại sao họ lại dùng C thì có một phần là nói về OOP

Object-Oriented is a design pattern, not a programming language. You can do object-oriented programming in any language you want, including assembly language. Some languages (ex: C++ or Java) make object-oriented easier. But you can still do object-oriented programming in languages like C.

Link bài viết: https://sqlite.org/whyc.html (Mục 2)

Mình khá ngạc nhiên vì điều này. Vậy OO có phải là một Design Pattern thật? Vì mình thử tìm thì hầu hết các DP đều đi kèm với OO chứ chưa thấy chỗ nào nói OO là một Design Pattern.

Nên mình đem lên đây để được mọi người giải đáp và thảo luận.
Cảm ơn mọi người :kissing:

5 Likes

Có lẽ đơn giản là đoạn văn đó dùng từ không chuẩn, nghĩa không chuẩn. Nhưng ý của họ thì chắc chắn rằng OOP chỉ là một đường lối lập trình, một cách tư duy lập trình chứ không phải cụ thể là ngôn ngữ nào cả.

Mà mình cho rằng OOP cũng có thể được gọi là design pattern của computer instruction. Tức là mọi thứ đều là tương đối cả.

7 Likes

Tác giả đã nói cụ thể ở đây là object-oriented programming

  • Vậy object-oriented programming là gì ?

https://en.wikipedia.org/wiki/Object-oriented_programming

Nó là 1 programming paradigm

https://stackoverflow.com/questions/4787799/difference-between-programming-paradigm-design-pattern-and-application-architec

https://www.quora.com/What-is-the-difference-between-a-programming-paradigm-and-a-design-pattern

http://allthingsjavascript.com/blog/index.php/2017/04/20/what-is-the-difference-between-a-programming-paradigm-and-a-design-pattern/

Vậy theo ý kiến của mình thì OOP không phải là design pattern

6 Likes

Finally someone gets directly to the point!

2 Likes

Hi grab popcorndrgnz.

  1. Theo mình “Design Pattern” là kinh nghiệm khi gặp các bài toán -> có thể coi nó là một dạng thuật toán.
  2. OO cũng là một dạng thuật toán. Hơn nữa OO đặc trưng bởi một số tính chất và những cái đó có thể coi là pattern.

OOP là Object Oriented Programming, không hề có 1 từ nào là “Language” cả. Ví dụ về OOP trong C language: https://www.linuxtopia.org/online_books/gui_toolkit_guides/gtk+_gnome_application_development/cha-objects.html

3 Likes

Đã sửa.
2. OO cũng là một dạng thuật toán. Hơn nữa OO đặc trưng bởi một số tính chất và những cái đó có thể coi là pattern.

Trước khi bàn về OO là DP thì chị Rồng cho mình nói sơ qua Abstract Data Type (ADT) nhé. :kissing_heart:
ADT là 1 module chung để tập hợp các variables và functions có liên quan đến nhau.
Ví dụ File có các variables: name chỉ tên file, path chỉ đường dẫn tuyệt đối (absolute path), lastModifed: thời gian chỉnh sửa cuối cùng,… và các functions liên quan: open(), append(), close(),…


Trong các ngôn ngữ hỗ trợ OOP thì có dễ dàng biểu diễn dưới dạng syntax của nó, mình mô phỏng trên C# cho chị Rồng, ngắn gọn thôi, cái này chắc ai cũng làm được :kissing:

public class File 
{
    public string Name { get; set; }
    public string Path { get; set; }
    public DateTime LastModifiedTime { get; }
    public DateTime CreationTime { get; }
    public string Owner { get; }

    public boolean Open(int mode) {}
    public boolea Close() {}

    public int Read() {}
    public int Write() {}
    public int Append() {}

    public boolean ChangeFileName(string newFileName) {}
    public boolean Move(string path) {}
}

Tuy nhiên, C không hỗ trợ các cú pháp như class ClassName, nên không thể chuyển sang ADT thành class như các OOP language hỗ trợ. Vì vậy có 3 cách giải quyết, có thể xem là Design Pattern để chuyển ADT thành 1 fake object trong C.

Điểm bất lợi hơn trong C là phải tự quản lý object tạo, xoá, vòng đời hoàn toàn bằng tay. Còn các ngôn ngữ OOP như C++ có RAII, Java và C# có garbage collector quản lý cho mình.

Cách 1: sử dụng 1 số nguyên hoặc con trỏ đại diện, thường là pointer hay int thông thường (giống primary key trong database).
Thường định nghĩa 1 struct có tên là struct_name, object có kiểu là struct_namestruct_name *, và các functions liên quan đặt theo dạng struct_name_method_name(struct_object, ...)

Trong ví dụ biến đại diện object có kiểu FILE, là pointer tới file_description

struct file_description
{
  char name[256];
  char *path;
  time_t last_modified_time;
  time_t creation_time;
  char owner[256];
};

typedef struct file_descriptor* FILE;

bool file_open(FILE file, int mode) {}
bool file_close(FILE file) {}

int file_read(FILE file) {}
int file_write(FILE file) {}
int file_append(FILE file) {}

bool file_change_file_name(FILE file, char *new_path) {}
bool file_move(FILE file, char* new_path) {}

Cách 2: sử dụng data trực tiếp, không có số nguyên nào đại diện.

struct file_description { ... };

// typedef struct file_description { ... };

bool file_open(struct file_description file, int mode);
bool file_close(struct file_description file);
...

Cách 3: sử dụng implicit global variable, thường sử dụng trong low-level graphics API
Thường có 1 function tạo implicit variable, kèm theo 1 hàm dọn dẹp implicit variable

get_current_graphics_context();

graphics_move_to(200, 200):
graphics_line_to(200, 300);
graphics_move_to(400, 400);
graphics_line_to(300, 400);

close_current_graphics_context();

Cách này có thể mở rộng bằng cách quản lý thêm 1 global stack chứa các implicit variables

void draw()
{
  get_current_graphics_context();

  graphics_set_stroke_color(0, 0, 0, 255); /* set black color */
  graphics_move_to(200, 200):
  graphics_line_to(200, 300);

  graphics_context_push_stack();
    graphics_set_stroke_color(255, 0, 0, 255); /* set red color */
    graphics_move_to(400, 400);
    graphics_line_to(300, 400);
  graphics_context_pop_stack();

  close_current_graphics_context();
}

Đó là 3 cách mình thường dùng để hiện thực OO trong C, chị Rồng có thể xem là trick hay Design Pattern cũng được :penguin:


Cái này chỉ mới định nghĩa theo class thông thường thôi. Còn inheritance và polymorphism nữa mà mình mỏi tay quá :sob:

Chúc chị Rồng thi tốt nha :kissing_heart:

7 Likes

Mình gọi cái này là Design Pattern của Procedural programming được không?

1 Like

Theo ngu ý mình, chắc là hiện thực Design Pattern (tricks) được.
Trước giờ về procedural programming mình chỉ biết có C thôi. Mình chưa thử trên language khác nên không dám chém liều.

1 Like

To understand what OBJECT-ORIENTED is we firstly need to understand What OBJECT is.

Object is a TANGIBLE ENTITY that exist in physical space. An object has 4 most featured attributes:

  1. PROPERTIES: An object can have many other things in it or it can be a structure of other entities. Or object of objects.

  2. STATE: An object has states (live, dead, high, low….)

  3. ACTIONS: An object has actions ( move, stay, change, die….)

  4. TANGIBLE: An object is recognizable.

         Note: properties are tangible but state is not tangible
    

In human perspective, an object is not a specific entity, it can be any, its definition is not mandated to be defined. So, It has an attribute of ABSTRACT.

An object exists in physical space, regardless recognition of human . It can be reflected in human brain by IDEAS /CONCEPT. There are no real objects in Mind Space, but ideas, concepts or more specific, definitions.

LANGUAGE / PROGRAMING LANGUAGE is product and tool of human brain. It exists in human brain space. In human brain space there are no real OBJECTS but IDEAS/CONCEPTS.

In LANGUAGE or PROGRAMING LANGUAGE Objects are primitively Ideas/Concepts. As in physical space, It is abstract, too.

PROGRAMING is a noun saying about an action of writing, organizing computer program (series of instructions). OBJECT-ORIENTED PROGRAMING is Programing with STYLE /PARADIGM of applying Object Concepts in writing computer program.

OBJECT-ORIENTED PROGRAMING is PROGRAMING that programmers apply Object Concepts to write, to organize their PROGRAMS, regardless PL.

Some programing languages make it easier to apply Object Concepts.

My opinions only.

Xin đừng ném gạch thô bạo quá!

2 Likes

Vần đề là em hiểu cái Design Pattern là cái gì ý là Software Design Pattern?
Nếu theo cách hiểu đó thì anh nghỉ nó không đúng(ý là cái thằng bên kia nói không đúng ):
OOP lần đầu tiên được nhắc đến vào 1950-1960

Terminology invoking “objects” and “oriented” in the modern sense of object-oriented programming made its first appearance at MIT in the late 1950s and early 1960s

Còn Software Design Pattern thì được nhắc đến lần đầu vào 1977/79
Lấy một định nghĩa hình thành sau mà apply cho cái hình thành trước giống như bắn đại bác vào quá khứ vậy :v
Tất nhiên OOP có thể apply cho nhiều ngôn ngữ kể cả C(do nó là design concept), nhưng do C cũng ra đời vào thập niên 60 ở một nơi khác(A&T thì phải) nên 2 thằng này gặp nhau khá thấp.
Nếu một thứ đã phát triển thành basic (underling) thì hãy để nó ở đó. đá đã thành ngọc rồi thì không thể thành đá trở lại được.(chí có thể phá hủy(thay thế nó bằng cái khác).

4 Likes

Cái này khi mình học C thì họ thường nhắc đến OO (Object Oriented) như là một cách để build 1 project vừa hoặc lớn bằng ngôn ngữ C.
Câu chị Rồng trích dẫn ở trong chương “Why Is SQLite Coded In C” cũng liên quan tới C.

Vì vậy có thể có sự nhầm lẫn giữa 2 khái niệm: OO trong C language, và OOP trong programming paradigm. 2 khái niệm có thể xem là khác nhau. Mà theo ý mình, cho nó khác hoàn toàn cho tiện. :penguin:

Nếu bạn nào có hứng thú tìm hiểu sâu về ứng dụng OO trong C như thế nào thì mình gợi ý cuốn này, mình mới đọc nửa chừng nhưng mình thấy sách diễn giải tốt về khái niệm OO cũng như cách ứng dụng của nó. (có mùi PR sách, không liên quan lắm :penguin:)
https://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?