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
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ả.
Tác giả đã nói cụ thể ở đây là
object-oriented programming
object-oriented programming
là gì ?https://en.wikipedia.org/wiki/Object-oriented_programming
Nó là 1
programming paradigm
Vậy
programming paradigm
là gì ?https://en.wikipedia.org/wiki/Programming_paradigm
Design pattern là gì ?
https://en.wikipedia.org/wiki/Software_design_pattern
programming paradigm
có khác gì vsdesign pattern
?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
Finally someone gets directly to the point!
Hi grab popcorndrgnz.
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
Đã 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é.
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
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_name
làstruct_name *
, và các functions liên quan đặt theo dạngstruct_name_method_name(struct_object, ...)
Trong ví dụ biến đại diện object có kiểu FILE, là pointer tới file_description
Cách 2: sử dụng data trực tiếp, không có số nguyên nào đại diện.
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
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
Đó 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
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á
Chúc chị Rồng thi tốt nha
Mình gọi cái này là Design Pattern của Procedural programming được không?
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.
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:
PROPERTIES: An object can have many other things in it or it can be a structure of other entities. Or object of objects.
STATE: An object has states (live, dead, high, low….)
ACTIONS: An object has actions ( move, stay, change, die….)
TANGIBLE: An object is recognizable.
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á!
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
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).
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.
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 )
https://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413