Điều gì làm cho lập trình hướng đối tượng thành công? [đóng cửa]


17

Tính năng đó theo bạn là gì đã làm cho lập trình hướng đối tượng thành công đến vậy?

  1. Thông qua
  2. Di sản
  3. Đa hình
  4. Đóng gói

Hoặc một số tính năng khác mà bạn có thể muốn giới thiệu.

Ngoài ra tôi muốn biết rằng mối liên hệ giữa kiểu Dữ liệu Trừu tượng và lập trình Hướng đối tượng là gì?


phổ biến và thành công không đồng nghĩa
kevin cline

Câu trả lời:


76

Tôi muốn đề xuất rằng đặc tính quan trọng nhất của lập trình hướng đối tượng là quản lý phức tạp .

Bộ não con người chỉ có thể nắm giữ rất nhiều khái niệm cùng một lúc - giới hạn được trích dẫn của việc ghi nhớ 7 +/- 2 vật phẩm độc lập xuất hiện trong tâm trí.

Khi tôi đang làm việc trên một hệ thống 600kloc tại nơi làm việc, tôi không thể giữ toàn bộ mọi thứ trong đầu. Nếu tôi phải làm điều đó, tôi sẽ bị hạn chế làm việc trên các hệ thống nhỏ hơn nhiều .

May mắn thay, tôi không phải làm vậy. Các mẫu thiết kế khác nhau và các cấu trúc khác mà chúng tôi đã sử dụng trong dự án đó có nghĩa là tôi không phải xử lý toàn bộ hệ thống cùng một lúc - Tôi có thể nhặt từng mảnh riêng lẻ và làm việc với chúng, biết rằng chúng phù hợp với ứng dụng rộng hơn theo những cách được xác định rõ.

Tất cả các khái niệm OO quan trọng cung cấp các cách để quản lý sự phức tạp.

Đóng gói - hãy để tôi xử lý một API bên ngoài cung cấp cho tôi các dịch vụ khác nhau mà không phải lo lắng về cách các dịch vụ đó được triển khai.

Trừu tượng - hãy để tôi tập trung vào các đặc điểm thiết yếu và bỏ qua những gì không liên quan.

Thành phần - hãy để tôi sử dụng lại các thành phần đã được xây dựng trong các kết hợp mới

Đa hình - hãy để tôi yêu cầu một dịch vụ mà không cần lo lắng về việc các đối tượng khác nhau có thể cung cấp dịch vụ theo những cách khác nhau như thế nào.

Kế thừa - hãy để tôi sử dụng lại một giao diện hoặc cách triển khai, chỉ cung cấp các phần khác với những gì đã đi trước đó.

Nguyên tắc trách nhiệm duy nhất - cho phép giữ mục đích cho từng đối tượng rõ ràng và súc tích, vì vậy thật dễ dàng để lý luận về

Liskov Thay thế Prinicple - chúng ta đừng đặt bẫy cho nhau bằng cách đưa ra các phụ thuộc lẻ

Nguyên tắc mở / đóng - hãy cho phép mở rộng và sửa đổi theo những cách không yêu cầu chúng tôi mạo hiểm phá vỡ mã hiện có

Dependency Injection - chúng ta hãy đưa thành phần lên cấp độ tiếp theo và lắp ráp các thành phần lại với nhau sau này.

Phát triển theo định hướng giao diện - hãy đưa sự trừu tượng lên cấp độ tiếp theo và chỉ phụ thuộc vào sự trừu tượng hóa, không bao giờ phụ thuộc vào việc triển khai cụ thể.


6
+1. Tôi chỉ có thể bỏ phiếu một lần, đó là một sự xấu hổ này xứng đáng nhiều hơn.
Richard

1
Có một hệ quả tất yếu, đó là một sự xấu hổ tôi không thể tìm thấy tài liệu tham khảo ngay bây giờ nhưng tôi sẽ cố gắng nhớ để tìm nó và chỉnh sửa nhận xét. Vì vậy, một nghiên cứu về thực hành đánh giá mã đã phát hiện ra rằng các đánh giá mã có xu hướng mất nhiều thời gian hơn để tìm ra lỗi trong mã OO so với mã thủ tục, bởi vì dòng chảy nhảy xung quanh nhiều hơn trong mã OO. Các thực tiễn như TDD và lập trình cặp giảm thiểu điều đó, nhưng nó vẫn là một kết quả thú vị (và đối với tôi, không ngờ tới).

5
Đây có thể là câu trả lời hoàn hảo - thông tin đầy đủ, nhưng đủ ngắn để người đọc không phải đọc tiểu thuyết. Bravo
Tim Claason

@Graham Lee: Tôi rất thích đọc nghiên cứu đó.
Frank Shearar


13

Giao diện người dùng đồ họa. Vào cuối những năm tám mươi, đầu những năm chín mươi, khi Mac, Amigas, Atari STs, Windows và GEM bắt đầu thay thế giao diện người dùng dựa trên ký tự, rõ ràng là các ngôn ngữ như C không phù hợp để viết chương trình GUI. Mặc dù xử lý dữ liệu truyền thống được coi là lược đồ "dữ liệu đầu vào -> xử lý -> dữ liệu đầu ra", cũng có thể được thực hiện bằng ngôn ngữ thủ tục, các tính năng OO rất tiện để xử lý sự phức tạp vốn có của GUI.


1
+1 để đề cập đến các ứng dụng GUI. Hướng đối tượng là công cụ cho phép thực hiện GUI, mặt khác (với mã thủ tục) khá khó quản lý.
Giorgio

7

Ẩn dữ liệu được cung cấp bởi Encapsulation.


Đây là một câu trả lời? Các ADT cung cấp ẩn dữ liệu (đó là lý do tại sao chúng được gọi là "trừu tượng hóa dữ liệu")
Frank Shearar

@Frank, Anh ấy đã hỏi các tính năng cụ thể và khi tôi viết câu trả lời này, chỉ có một cái khác và tôi đã cố gắng không trùng lặp.

Đủ công bằng, nhưng đóng gói không chính xác cụ thể đối với OO. Tôi nên tự kiểm tra điều này, nhưng tôi khá chắc chắn rằng chúng tôi đã thực hiện đóng gói từ lâu trước OO.
Frank Shearar

1
@Frank, tôi đồng ý rằng nó không dành riêng cho OO, đây chỉ là một trong những tính năng chính của nó.

Điều đó đúng với hầu hết các OOPL, nhưng không phải tất cả. CLOS là một ngoại lệ đáng chú ý.
Frank Shearar

7

Một tính năng chưa được đề cập bởi bất kỳ câu trả lời nào khác: mô hình miền . Bởi vì mọi người có xu hướng nghĩ về việc làm mọi thứ với hoặc với các đối tượng và về các đối tượng có các thuộc tính nội tại, rất dễ dàng để mô hình hóa một vấn đề hoặc quy trình làm việc bằng phần mềm hướng đối tượng. Về cơ bản, nó cho phép chúng ta sử dụng khả năng hiện có của mình để đối phó với danh từ, động từ và tính từ trong mã.


6

Tôi nghĩ rằng thừa kế là điểm quan trọng nhất của OOP.

[từ phát triển trò chơi] Bạn có thể tạo một cái gì đó giống như một lớp Drawable, với các phương thức và thuộc tính kết xuất, và tạo một lớp Spaceship và Planet, kế thừa từ Drawable. Lấy tất cả các đối tượng từ những đứa trẻ [và những đứa trẻ Sprite khác], ném vào drawableObjArray và chỉ cần gọi phương thức vẽ cho mọi đối tượng. Bạn chỉ cần biết rằng đó là một Drawable.


2
Có thật không?? Đa hình là CÁCH quan trọng hơn và không yêu cầu sự kế thừa (từ quan điểm lý thuyết).
Thomas Eding

Thậm chí không yêu cầu các chức năng ảo chỉ sử dụng các con trỏ hàm.
Calmarius

1
Khái niệm ban đầu về OO của Alan Kay thậm chí không bao gồm thừa kế vì ông không thích cách nó được thực hiện trong các hệ thống trước đó.
Michael Borgwardt

3

Trừu tượng

Cung cấp các dịch vụ cần thiết che giấu những thứ không cần thiết. Xem giải thích của tôi ở đây- Trừu tượng là gì?


Typo: "Vắng mặt" phải là "Trừu tượng"
Vetle

2

Nó có phần thành công vì nó khuyến khích việc sử dụng các tổ chức của tâm trí con người vào các vật thể. Mọi người thường rất tốt khi nhìn thấy mối quan hệ của mọi thứ - những thứ như sự khác biệt, tương đồng và hành vi. OO khuyến khích phát triển phần mềm để bắt chước khái niệm của con người về thế giới.

Làm cho việc phát triển phần mềm tương tự như cách chúng ta nhìn thế giới giúp tâm trí chúng ta dễ dàng xử lý sự phức tạp hơn.


Có thể đó là do có nhiều kinh nghiệm hơn về thủ tục, nhưng sau khi sử dụng cả hai phương pháp, tôi vẫn thấy thủ tục trực quan hơn để làm hơn OOP. Tôi vẫn thích những phần tốt của cả hai phong cách, mặc dù.
Juha Untinen

1

" ADT vs object " đã được hỏi nhiều lần ở đây. Câu trả lời một dòng là "ADT và các đối tượng là nghịch đảo của nhau - cái này trừu tượng hóa cái kia không thể; mỗi cái cho phép linh hoạt theo những cách khác nhau."

Để có câu trả lời dài hơn, hãy xem phần Hiểu về trừu tượng dữ liệu của William Cook , được xem lại . Tóm lại, các đối tượng cho phép bạn dễ dàng sử dụng nhiều triển khai / biểu diễn của một số mốc thời gian (một cái gì đó trông giống như một danh sách có thể là một mảng hoặc một cây tự cân bằng hoặc ...) nhưng làm cho nó khó thêm các hoạt động mới (vì bạn phải thêm thao tác mới đó vào mỗi biểu diễn của bạn), trong khi các ADT giúp dễ dàng thêm các thao tác mới vào loại dữ liệu của bạn, nhưng làm cho khó có nhiều triển khai.

Chỉnh sửa: Tôi đã nói rằng tin nhắn đi qua là điều làm cho OO thành công. Dựa trên nhận xét của Jonas, điều đó không đúng, bởi vì hầu hết các ngôn ngữ mà mọi người cho là OO không sử dụng thông điệp truyền qua. Vì nó không đúng, tôi đã loại nó khỏi câu trả lời của tôi.


1
Truyền tin nhắn khó có thể là câu trả lời vì không có ngôn ngữ OOP thành công nào sử dụng nó.
Jonas

OO của bạn không nhất thiết là OO của tôi. Và hầu hết các ngôn ngữ được gọi là OO thì không, theo định nghĩa của Alan Kay. Tôi quên câu trích dẫn chính xác, nhưng Kay's nói rằng các đối tượng không phải là điều quan trọng về Smalltalk, mà là truyền thông điệp (và hầu hết đã bỏ lỡ điểm này).
Frank Shearar

@Jonas Tôi đoán, khi đọc lại câu hỏi và câu trả lời của tôi, rằng tôi đang nói nửa vời "OO không thành công, vì rất ít ngôn ngữ làm đúng." Nhưng tôi chỉ nói những điều như thế khi tôi mặc bộ đồ chống cháy.
Frank Shearar

0

Ba tính năng hàng đầu của tôi. Thành phần đối tượng - cho phép các đối tượng cộng tác. Đa hình - hỗ trợ các hành vi động khi chạy. Kế thừa - bằng cách sử dụng lại mã và sửa đổi hành vi thông qua các phương thức ghi đè.

ADT - bạn có thể có điều đó ngay cả trong các ngôn ngữ không hướng đối tượng như Pascal. Một ngăn xếp hoặc một hàng đợi là ví dụ về ADT.


"ADT - bạn có thể có điều đó ngay cả trong các ngôn ngữ không hướng đối tượng như Pascal. Một ngăn xếp hoặc hàng đợi là ví dụ về ADT.": Đúng. Nhưng OOP giúp xác định giao diện của ADT dễ dàng hơn và cung cấp triển khai khác nhau, có thể hoán đổi cho nhau (lớp giao diện / lớp trừu tượng <---> lớp con / lớp cụ thể). Theo như tôi biết thì không dễ như Pascal.
Giorgio

0

nói một cách đơn giản, OOP là chìa khóa để tái sử dụng và đóng gói dẫn đến việc tạo ra các khung lớn giúp cuộc sống của các lập trình viên dễ dàng trong thời đại này vì họ chỉ có thể gọi API và làm những gì ngày thường muốn.

như câu hỏi của bạn là về 4 tính năng của OOP để bạn có thể nói

  1. Kế thừa và 4. Đóng gói là các tính năng quan trọng nhất và hai tính năng khác rất cần thiết để đạt được hai tính năng đầu tiên

vì vậy 1. Truyền thông điệp và 3. Đa hình thực sự hỗ trợ 2. Kế thừa và 4. Đóng gói.

  1. Kế thừa và 4. Đóng gói là chìa khóa thành công cho OOP

kế thừa không bắt buộc, một thành phần xác định hoặc thậm chí là một phần rất mong muốn của OOP hầu hết thời gian. đóng gói là một nguyên tắc tốt cho lập trình nói chung. nó không được phát minh bởi OOP và nó không chỉ được sử dụng trong OOP.
sara

-1

Theo tôi, ba tính năng cuối cùng là quan trọng nhất một khi đã ảnh hưởng đến việc sử dụng OOP trên diện rộng:

2. Inheritance
3. Polymorphism
4. Encapsulation

Chỉnh sửa: Một điểm khác sẽ là IDE và môi trường phát triển giao diện đồ họa như Visual studio và Eclipse. Khi họ nắm lấy các ngôn ngữ OOP, do đó, ngày càng có nhiều thiết kế có xu hướng về OOP.

Và tất nhiên Nguyên tắc RẮN là một lần làm cho các sản phẩm phần mềm ROCK có thể phân phối được :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.