Professional Documents
Culture Documents
thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau. Người lập trình có thể
định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau
nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng theo
đặc tính của từng đối tượng mà không bị nhầm lẫn.
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì có một phương thức chung là
"chu_vi". Khi gọi phương thức này thì nếu đối tượng là "hinh_vuong" nó sẽ tính theo công thức khác với
khi đối tượng là "hinh_tron".
• Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác
đã có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải
tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này.
Một điểm mới về mẫu hình, về quan điểm hay về một lời khuyến mại
OOP vẫn còn là một đề tài của nhiều tranh cãi về định nghĩa chuẩn xác hay về các nguyên lý của nó.
Trong dạng tổng quát nhất, OOP được hiểu theo cách là một loại thực nghiệm viết chương trình văn bản được phân
cấp ra thành nhiều mô đun (module), mà mỗi mô đun đóng vai như một lớp vỏ che đại diện cho mỗi kiểu dữ liệu.
Những khái niệm liên hệ đã được góp nhặt lại để tạo thành một khuôn khổ cho việc lập trình. Các triết lý đằng sau
việc định hướng đối tượng đã trở nên mạnh mẽ để tạo thành một sự chuyển đổi mẫu hình trong ngành lập trình.
Những mẫu hình khác như lập trình chức năng và lập trình thủ tục tập trung chủ yếu trên các hành động, còn lập
trình lô gíc lại tập trung vào những khẳng định hợp lý để kích hoạt sự thực thi của mã chương trình.
OOP đã phát triển một cách độc lập từ việc nghiên cứu về các ngôn ngữ định hướng của hệ thống mô phỏng, đó là
SIMULA 67, và từ việc nghiên cứu các kiến trúc của hệ thống có độ tin cậy cao, đó là các kiến trúc CPU và khả
năng cơ bản của các hệ điều hành.
Một chức năng đặc sắc của OOP là việc xử lý các kiểu con của các kiểu dữ liệu.
Dữ liệu của các đối tượng, một cách tổng quát, được đòi hỏi trong thiết kế để thỏa mãn các yêu cầu của người lập
trình (tức là các lớp).
Các kiểu dữ liệu bị giới hạn thêm các điều kiện mặc dù có cùng kiểu dữ liệu với loại không bị ràng buộc bởi các điều
kiện đó, gọi là kiểu dữ liệu con. Cả hai loại kiểu dữ liệu này đều dựa vào và đều được điều tiết bởi các hành xử (tức
là các phương thức) đã được định nghĩa. Các điều kiện hay yêu cầu này có thể được khai báo rõ ràng hay được giả
thiết công nhận ngầm bởi người lập trình. Các ngôn ngữ định hướng đối tượng cung cấp nhiều cơ chế cho việc khẳng
định rằng các giả thiết đó có tính địa phương cho một phần của chương trình. Các cơ chế này này có thể đọc thấy
trong các tài liệu về các chương trình định hướng đối tượng.
OOP tự nó đã đang được dùng để khuyến mại cho nhiều sản phẩm và dịch vụ. Các định nghĩa hiện tại và ích lợi của
các đặc tính của OOP thường được màu mè hóa bởi các mục đích của thị trường thương mại. Tương tự, nhiều ngôn
ngữ lập trình có những quan điểm đặc biệt về OOP mà nó ít tổng quát trong một số khía cạnh.
Các định nghĩa chính xác của OOP sẽ có sự khác biệt tùy theo quan điểm. Đặc biệt, các ngôn ngữ có kiểu tĩnh
thường có cái nhìn hơi khác với các ngôn ngữ có kiểu động về OOP, nguyên do là vì chúng tập trung trên thời gian
dịch hay tập trung vào thời gian thi hành của các chương trình.
OOP thường được xem là một mẫu hình hơn là một kiểu hay một phong cách lập trình nhằm nhấn mạnh vào điểm
quan trọng là OOP có thể thay đổi phương thức phát triển phần mềm bằng cách thay đổi tư duy của những người lập
trình và những kỹ sư phần mềm về phần mềm.
Mẫu hình của OOP chủ yếu không phải là kiểu lập trình mà là kiểu thiết kế. Một hệ thống được thiết kế bởi định
nghĩa của các đối tượng mà các đối tượng này sẽ tồn tại trong hệ thống đó, trong mã mà hiện làm việc chưa tương
thích với đối tượng, hay là trong người dùng đối tượng do ảnh hưởng của tính chất đóng của đối tượng.
Lập trình hướng đối tượng 3
Cũng nên lưu ý rằng có sự khác biệt giữa mẫu hình định hướng đối tượng và lý thuyết các hệ thống. OOP tập trung
trên các đối tượng như là các đơn vị của một hệ thống, trong khi đó, lý thuyết các hệ thống lại tự nó chỉ tập trung vào
hệ thống. Như là phần trung gian, người ta có thể tìm thấy các dạng thức thiết kế phần mềm hay các kỹ thuật khác
dùng các lớp và các đối tượng như là các viên gạch trong những thành phần lớn hơn. Những thành phần này có thể
được xem như là bước trung gian từ mẫu hình định hướng đối tượng đến các mô hình "định hướng sống thực" hơn
của lý thuyết các hệ thống.
Lưu ý:
• Thí dụ trên được viết trong C++ có thể dùng bất kì trình dịch nào để dịch thẳng ra tập tin khả thi. Cụ thể là dùng
Borland C++ cho Windows hay dùng g++ cho Linux.
• Các dòng màu đen là mã nguồn, các dòng màu khác là các dòng giải thích ý nghĩa sử dụng của OOP.
• Đòi hỏi người đọc biết ít nhiều cách dùng về ngôn ngữ lập trình và trình dịch.
• Bản thân các lớp khi khai báo vẫn có tính trừu tượng. Nghĩa là, nó không sử dụng trực tiếp được (mà chỉ có thể
xem là các kiểu dữ liệu). Chỉ khi nào người dùng thực hiện động tác thực thể hóa (instantiate) thì lớp này mới
khởi động và tạo thành một đối tượng thực. Trong thí dụ này thì câu lệnh Inherit1 boy; và câu lệnh Inherit2 girl; là
hai câu lệnh để thực thể hóa thành hai đối tượng boy và girl.
• Sự hỗ trợ các loại đặc tính cho OOP trong C++ rất phong phú. Thí dụ chỉ nhằm minh họa các tính chất cơ bản của
OOP.
Một số khái niệm cần biết trong ngôn ngữ OOP hiện đại
Hiện nay các ngôn ngữ OOP phổ biến nhất đều tập trung theo phương pháp phân lớp trong đó có C++, Java, C# và
Visual Basic.NET. Sau đây là một số khái niệm mà các ngôn ngữ này thường dùng tới
Lớp (class)
Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng. Trong một lớp, người ta thường dùng các biến để mô
tả các thuộc tính và các hàm để mô tả các phương thức của đối tượng. Khi đã định nghĩa được lớp, ta có thể tạo ra
các đối tượng từ lớp này. Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp
như một kiểu dữ liệu để tạo ra các đối tượng.sai opp
Lập trình hướng đối tượng 6
Riêng tư (private)
Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc tính hay một lớp). Khi dùng tính chất này gán cho một
biến, một phương pháp thì biến hay phương pháp đó chỉ có thể được sử dụng bên trong của lớp mà chúng được định
nghĩa. Mọi nỗ lực dùng trực tiếp đến chúng từ bên ngoài qua các câu lệnh hay từ các lớp con sẽ bị phủ nhận hay bị
lỗi.
Ngoài các khái niệm trên, tùy theo ngôn ngữ, có thể sẽ có các chức năng OOP riêng biệt được cấp thêm vào.
Lịch sử
Khái niệm về các đối tượng và thực thể trong khoa học máy tính được nhiều người biết đến từ hệ thống PDP-1 của
đại học MIT. Đây có lẽ là thí dụ sớm nhất của kiến trúc cơ sở có khả năng thực. Một bằng chứng sớm sủa khác của
OOP được tìm thấy qua Sketchpad viết bởi Ivan Sutherland trong năm 1963, tuy nhiên, đây chỉ là một ứng dụng chứ
không là một mẫu hình lập trình.
Ngôn ngữ lập trình định hướng đối tượng đầu tiên đã là Simula, ngôn ngữ này được thiết kế để dùng trong các việc
mô phỏng, được sáng tạo bởi Ole-Johan Dahl và Kristen Nygaard thuộc Trung tâm Máy tính Na Uy ở Oslo. Các kiến
thức trong ngôn ngữ này sau đó đã được dùng trong nhiều ngôn ngữ khác, bắt đầu từ Lisp và Pascal cho đến họ ngôn
ngữ Smalltalk.
Lập trình hướng đối tượng đã được phát triển như là phương pháp lập trình chủ đạo từ giữa thập niên 1980 nguyên do
đáng kể là việc ảnh hưởng của C++, một ngôn ngữ mở rộng của C. Địa vị thống trị của OOP đã được củng cố vững
chắc bởi sự phổ biến của các GUI dành cho ngôn ngữ lập trình hướng đối tượng ngày càng tiện lợi. Một thí dụ về
quan hệ gần gũi của thư viện GUI động và ngôn ngữ OOP là phần mềm Cocoa, nó là khung cơ sở của Mac OS X
dược viết bằng Objective C (Objective C là một loại ngôn ngữ định hướng đối tượng mở rộng của C với việc thông
báo động). Công cụ cho OOP cũng được nâng cao phần "lập trình điều khiển theo sự kiện" (mặc dù khái niệm này
không chỉ dành cho OOP).
Tại Zürich, Niklaus Wirth và những cộng sự đã theo dõi các đề tài như là dữ liệu trừu tượng và lập trình mô đun.
Modula-2 bao gồm cả hai đặc tính đó. Thiết kế liền tiếp theo là Oberon bao gồm sự tiếp cận riêng biệt với việc định
hướng đối tượng, các lớp,... Sự tiếp cận này không như Smalltalk, và cũng khác hẳn C++.
Các chức năng của định hướng đối tượng cũng đã đang được thêm vào nhiều ngôn ngữ trong suốt thời gian đó kể cả
ADA, BASIC, Lisp, Fortran, Pascal và nhiều nữa. Việc cộng thêm các chức năng đó cho các ngôn ngữ mà được
trước đó không chủ định thiết kế cho chúng ngay từ đầu cũng thường dẫn tới nhiều khó khăn trong khả năng tương
thích (với mã nguồn viết cho các phiên bản cũ) và khả năng bảo trì mã. Điển hình của trường hợp này là Pascal và
Visual Basic. Các ngôn ngữ thuần túy định hướng đối tượng, ở phía khác, lại thiếu các đặc tính mà nhiều người lập
trình phụ thuộc vào. Để bắc cầu cho khoảng trống này, nhiều nỗ lực đã được xúc tiến dể tạo ra các ngôn ngữ đặt cơ
sở trên các phương pháp định hướng đối tượng nhưng lại cho phép dùng nhiều đặc tính lập trình cấu trúc theo những
phương cách "an toàn". Ngôn ngữ Eiffel của Bertrand Meyer đã sớm thành công với các mục tiêu này.
Trong thập niên đã qua, Java được dùng rộng rãi một phần là do sự tương tự với C và C++, nhưng có lẽ do phần khác
quan trọng hơn là việc lắp đặt sử dụng máy ảo mà chủ ý là thực thi cùng một mã nguồn cho nhiều nền tảng khác
nhau. Microsoft.NET cũng mở đầu với các chủ ý tương tự và cộng thêm việc hỗ trợ nhiều ngôn ngữ hay các sự biến
thể của các ngôn ngữ cũ (như trường hợp C# và Visual Basic).
Gần đây, một số ngôn ngữ xuất hiện với chức năng chính là định hướng đối tượng nhưng lại tương thích được với
phương pháp thủ tục như là Python và Ruby. Bên cạnh Java, C# và Visual Basic.NET là hai ngôn ngữ OOP quan
trọng hiện tại thiết kế bởi Microsoft.
Giống như lập trình thủ tục đã dẫn tới việc tinh lọc các kỹ thuật như là lập trình cấu trúc, phần mềm định hướng đối
tượng hiện đại thiết kế các phương pháp bao gồm các sự tinh lọc. Chẳng hạn như là việc ứng dụng các dạng thức
thiết kế, thiết kế bởi hợp đồng và các ngôn ngữ mô hình trong đó có UML.
Lập trình hướng đối tượng 9
Đọc thêm
• Grady Booch: Object-Oriented Analysis and Design with Applications, Addison-Wesley, ISBN 0805353402
• Alan Kay: The Early History of Smalltalk [1]
• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object
Oriented Software, Addison-Wesley, ISBN 0201633612
• Bertrand Meyer: Object-Oriented Software Construction, Prentice Hall, ISBN 0136291554
• James Rumbaugh, Michael Blaha, William Premerlani, Frederick Eddy, William Lorensen: Object-Oriented
Modeling and Design, Prentice Hall, ISBN 0136298419
• Ivar Jacobson: Object-Oriented Software Engineering: A Use Case-Driven Approach, Addison-Wesley, ISBN
0201544350
• Harold Abelson, Gerald Jay Sussman, Julie Sussman: Structure and Interpretation of Computer Programs, The
MIT Press, ISBN 0262011530
• Martin Abadi, Luca Cardelli: A Theory of Objects, Springer-Verlag, ISBN 0-387-94775-2
• Paul Harmon, William Morrissey: The Object Technology Casebook - Lessons from Award-Winning Business
Applications, John Wiley & Sons, ISBN 0-471-14717-6
• David A. Taylor: Object-Oriented Information Systems - Planning and Implementation, John Wiley & Sons,
ISBN 0-471-54364-0
• Peter Eeles, Oliver Sims: Building Business Objects, John Wiley & Sons, ISBN 0-471-19176-0
Lập trình hướng đối tượng 10
Tham khảo
• Introduction to OOP [2]
• Introduction to Object Oriented Programming [3]
• Structured Programming vs Object-Oriented Programming [4]
• Object-oriented programming FAQ [5]
• Example of the subtyping problem [6]
• What are OOP's Jargons and Complexities [7]
• Object Oriented Design Principles [8]
• The report "Object Orientation Redefined" [9] outlines how OO has been considered a thinking tool, i.e. "we view
the world in objects", and how such an approach may further our understanding of object-oriented formalisation.
Chú thích
[1] http:/ / gagne. homedns. org/ %7etgagne/ contrib/ EarlyHistoryST. html
[2] http:/ / www. oopic. com/ pgchap6. htm
[3] http:/ / www. eecs. utoledo. edu/ ~ledgard/ oop/ page2b. html
[4] http:/ / userpages. aug. com/ frodo/ oopstruc. html
[5] http:/ / www. objectfaq. com/ oofaq2/
[6] http:/ / okmij. org/ ftp/ Computation/ Subtyping/ #Problem
[7] http:/ / xahlee. org/ Periodic_dosage_dir/ t2/ oop. html
[8] http:/ / www. eventhelix. com/ RealtimeMantra/ Object_Oriented/
[9] http:/ / www. interaction-design. org/ mads/ articles/ object_orientation_redefined. html
[10] http:/ / www. geocities. com/ tablizer/ oopbad. htm
[11] http:/ / dreamsongs. com/ ObjectsHaveFailedNarrative. html
[12] http:/ / c2. com/ cgi/ wiki?ArgumentsAgainstOop
[13] http:/ / www. devx. com/ opinion/ Article/ 26776
[14] http:/ / www. paulgraham. com/ noop. html
Nguồn và người đóng góp vào bài 11
Giấy phép
Creative Commons Attribution-Share Alike 3.0 Unported
http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/