Là mô hình lập trình hướng đối tượng đã lỗi thời vì nó chống mô-đun và chống song song? [đóng cửa]


23

Tôi đã đọc bài báo gây tranh cãi Dạy FP cho sinh viên năm nhất được đăng bởi Robert Harper, một giáo sư ở CMU. Ông tuyên bố rằng CMU sẽ không còn dạy lập trình hướng đối tượng trong khóa học giới thiệu vì nó không phù hợp với chương trình giảng dạy CS hiện đại.

Và ông tuyên bố rằng:

Lập trình hướng đối tượng được loại bỏ hoàn toàn khỏi chương trình giới thiệu, bởi vì nó vừa chống mô-đun vừa chống song song bởi chính bản chất của nó.

Tại sao coi OOP là chống mô-đun và chống song song?



14
Buhwaaaah?! OO làm cho tính mô đun hóa và tính song song dễ dàng hơn trong thủ tục và không loại trừ lẫn nhau đối với FP. Màu tôi bối rối.
Matt Ellen

4
Họ đã thiết kế lại chương trình giảng dạy của mình để anh ta phải bán chương trình mới và đưa ra những tuyên bố táo bạo được hỗ trợ mà hoàn toàn không có dữ liệu. Không có bằng chứng cho thấy các chương trình chức năng phức tạp là bất kỳ song song hoặc mô-đun hơn so với các đối tác OOP của họ.
davidk01

4
@Matt Ellen: OOP được quyết định loại trừ lẫn nhau với FP. FP được xác định dựa trên một số khái niệm chính trong đó một trong số đó là sự vắng mặt của trạng thái có thể thay đổi. OOP được xác nhận dựa trên sự tồn tại của trạng thái có thể thay đổi mà quyền truy cập được kiểm soát bằng cách gói nó trong "đối tượng". Định nghĩa trạng thái có thể thay đổi và trạng thái bất biến là loại trừ lẫn nhau khá nhiều theo định nghĩa. Đúng, đúng là bạn có thể lập trình theo kiểu chức năng với nhiều ngôn ngữ OOP, nhưng điều này không giống với việc sử dụng ngôn ngữ FP. Và đúng là không phải tất cả các ngôn ngữ FP đều thuần túy. Tuy nhiên, điều này không nói rằng FP tương thích với OOP.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI đúng

2
@ CHỈ: Tôi có một ý tưởng khác về sự độc quyền lẫn nhau đối với bạn. Tôi thấy FP thuần túy và không tinh khiết là tập hợp con của FP, và vì vậy OOP không loại trừ lẫn nhau khỏi FP nếu bạn cho rằng khả năng biến đổi là điều cần thiết đối với OOP. Ngoài ra tôi không đồng ý rằng tính đột biến là điều cần thiết cho OOP. Bạn có thể đạt được và hoàn toàn hệ thống OO bằng cách sử dụng tin nhắn đi qua, và không bao giờ làm thay đổi một điều.
Matt Ellen

Câu trả lời:


30

Vui lòng xem xét, rằng nhu cầu của Harper trong việc giảng dạy một lớp học chương trình CS giới thiệu rất khác so với nhu cầu của một dự án thực tế . Công việc của anh là dạy các khái niệm cơ bản (ví dụ mô đun, song song, cảm ứng) cho sinh viên năm nhất. Vì vậy, điều rất quan trọng là ngôn ngữ (và mô hình) được chọn có thể diễn đạt các khái niệm này với càng ít lễ (cú pháp và khái niệm) càng tốt. Sự quen thuộc, hỗ trợ công cụ, thư viện có sẵn, hiệu suất thực thi, vv hoàn toàn không liên quan trong bối cảnh này. Vì vậy, hãy ghi nhớ điều này khi xem xét ...

Quan điểm cho rằng OO là kết quả chống mô-đun từ số lượng lớn các phụ thuộc cho các lớp khác, ngay cả các đối tượng của các lớp được thiết kế tốt có xu hướng kết thúc. Rằng đây là một vấn đề - ngay cả trong mắt những người đề xướng OO - trở nên rõ ràng khi bạn nhìn vào sự phổ biến của các khuôn khổ , bài báo, sách và bài đăng trên blog trong những năm qua (cũng là sự nổi lên của giả và cuống là thú vị).

Một gợi ý khác là tầm quan trọng của Mẫu thiết kế và sự phức tạp của việc triển khai chúng - so với một số mô hình lập trình khác - ví dụ: Factories, Builder, Adaptor, Bridge, Decorator, Facade, Command, Iterator, Mediator, Observer, Strateg and Template Method và có thể Tất cả đều theo cách nào đó liên quan đến việc cải thiện tính mô đun của mã OO.

Kế thừa cũng có vấn đề (ví dụ: Bài toán lớp cơ sở mong manh ) và tính đa hình (kiểu phụ) quyến rũ người ta để làm tăng việc thực hiện thuật toán giữa nhiều lớp, trong đó các thay đổi có thể gợn qua toàn bộ chuỗi thừa kế (lên xuống!).

Trách nhiệm chống song song có liên quan đến sự nhấn mạnh của trạng thái so với tính toán (hay còn gọi là tính đột biến so với tính bất biến). Cái trước làm cho nó liên quan nhiều hơn đến việc thể hiện sự phụ thuộc của các tính toán con (mà Harper đang thực hiện song song!) Vì bạn thường không thể suy ra vị trí mà trạng thái được quản lý (còn gọi là tệp, trong đó biến thể hiện được khai báo) bên ngoài các tác nhân sẽ thay đổi nó vào thời điểm nào.

Việc nhấn mạnh vào tính bất biến và tính toán làm cho việc thể hiện sự phụ thuộc của các tính toán con dễ dàng hơn nhiều, vì không có quản lý nhà nước, chỉ có các chức năng / tính toán được kết hợp tại nơi bạn muốn thể hiện sự phụ thuộc của các tính toán con.


10
Các yêu cầu song song từ các trại chức năng thường bị thổi phồng. Trình biên dịch cho các ngôn ngữ chức năng hoạt động với lý thuyết nền tảng sạch hơn để người triển khai có nhiều cách tổ chức lại mã hơn trước khi nó được chuyển thành mã máy nhưng điều này không có nghĩa là nếu bạn cung cấp cho các lập trình viên OO sự trừu tượng hóa phù hợp cho sự song song thì họ sẽ không thể để viết mã song song sạch. Cho đến nay các lập trình viên thủ tục chỉ nhận được khóa và luồng và họ đã làm khá tốt tôi nghĩ với những công cụ đó.
davidk01

2
Mặc dù tôi thường đồng ý với mọi điều bạn nói ở đây, tôi muốn chỉ ra rằng các mẫu thiết kế xuất hiện trong tất cả các mô hình lập trình. Đối với lập trình chức năng, tôi chỉ ra những thứ như đơn nguyên và bản đồ / thu nhỏ.
Anm

@ davidk01 Lấy ví dụ. Nó hỗ trợ lập trình hướng đối tượng và có các nguyên hàm đồng thời tuyệt vời. Quan trọng hơn, nó thực sự cất cánh cho lập trình đồng thời mà không hoàn toàn là chức năng.
weberc2

19

Đây có lẽ là một tuyên bố táo bạo để thực hiện, nhưng tôi bằng cách nào đó nghi ngờ, Robert Harper này không bao giờ thực sự viết phần mềm thực tế trong cuộc sống của mình. Tất cả những gì anh ta có vẻ quan tâm đến mình là ML và hệ thống loại thống kê. Đóng góp lớn như có thể có thể có, tôi không thấy những tuyên bố của anh ấy về OOP có liên quan như thế nào.

Bài viết này không gây tranh cãi. Tranh cãi liên quan đến kiểm tra, tranh luận và thảo luận. Những gì bạn có ở đây là một số học giả không biết gì, người đưa ra hai lời buộc tội khá cơ bản chỉ trong một tuyên bố duy nhất, mà không bận tâm để cung cấp bất kỳ lý lẽ.

  1. Yêu cầu về OOP là chống mô-đun chỉ là vô nghĩa. Tôi thậm chí không biết làm thế nào để đáp ứng với nó, không chỉ không có đối số nào được cung cấp mà cả OOP theo thiết kế một cách tiếp cận để thiết lập mô đun với sự ghép rất thấp giữa các mô-đun riêng lẻ thông qua phương thức đóng gói và trừu tượng hóa.

  2. Yêu cầu OOP là chống song song chỉ thể hiện sự thiếu hiểu biết. OOP không khóa trong mọi quyết định về đồng thời. OOP chỉ ra lệnh ẩn chúng: Nếu được xây dựng chính xác, bạn không thể nói, liệu việc triển khai của một đối tượng có song song hay không.
    Do đó, cuối cùng OOP và lập trình song song là trực giao. Mô hình diễn viên là một mô hình thanh lịch cho sự tương tranh có thể được phản ánh trực tiếp trong một hệ thống đối tượng (nhưng không cần thiết), mang lại sự kết hợp ghê gớm của cả hai.

Vấn đề với OOP là, rất ít người thực sự hiểu nó theo nghĩa Alan Kay định nghĩa nó.

  1. OOP là một cách tiếp cận. Trong một số ngôn ngữ, nó được triển khai bằng các mẫu, trong các ngôn ngữ khác, bạn có thể trực tiếp sử dụng các thành ngữ ngôn ngữ tích hợp (ví dụ: Ruby, Objective-C, Smalltalk, Io ).
  2. Trái với niềm tin chung, OOP không phải là về các lớp học. Đó là về các đối tượng và các đối tượng là về việc truyền thông điệp hoặc một cách đóng gói và trừu tượng không kém phần rò rỉ.

Đây là lý do tại sao Java là để OOP những cây gậy nhọn để chiến đấu với hải quân. Điều này cũng đúng với nhiều thứ gọi là "ngôn ngữ OOP", nhưng điều về Java là, dường như đó là niềm tin phổ biến tại các trường Đại học, rằng Java nên được sử dụng để dạy OOP.

Tôi đồng ý với tất cả những người cho rằng giới thiệu về OOP với Java nên được xóa khỏi chương trình giảng dạy CS. Tôi cũng nghĩ rằng những người rõ ràng thiếu hiểu biết cơ bản về OOP không nên dạy nó. Vì vậy, có lẽ sẽ tốt hơn nếu Bob gắn bó với ML cho các khóa học của mình và chỉ đơn giản là dạy những gì anh ấy có một sự hiểu biết vững chắc.
Ngay bây giờ OOP là một nghi thức thời trang, mà mọi người thích gắn bó với mọi thứ. Điều này gây hại cho OOP và nói mọi người. OOP không lỗi thời. Thời kỳ vàng son của OOP vẫn chưa đến, khi mọi người cuối cùng đã hiểu những gì nó là về những gì nó là không về (ví dụ như giải quyết mọi vấn đề có thể bằng cách sử dụng từ khóa class500 lần).


1
+1 để truyền thông điệp và +1 cho 'với Java'. Thật không may nếu họ đã loại bỏ Java, họ sẽ chỉ thay thế nó bằng C # và tiếp tục di sản của nó.
gbjbaanb

@ back2dos +1 cho các nhà phê bình, -1 cho Java. Chắc chắn, Smalltalk "nhiều OO" hơn Java, nhưng ai sử dụng nó? Objective-C khó cho người mới bắt đầu giống như C là.
maaartinus

@maaartinus: Bạn sẽ thấy Squeak được sử dụng rộng rãi trong lĩnh vực giáo dục và học thuật, nếu điều đó trả lời câu hỏi của bạn. Cũng như đối với Java: Bạn có thể thích nó, tôi có thể không. Giống như cà phê, đó là vấn đề sở thích cá nhân và không có lý do gì để thảo luận về điều đó. Tuy nhiên, Java không phù hợp để giới thiệu về OOP là IMHO một hàm ý không thể phủ nhận về bản chất của Java và khái niệm về OOP và đó chính xác là những gì tôi đã nói. Sự phổ biến của Java sẽ không biến mất. Đối với C, tôi khuyên bạn nên đọc joelonsoftware.com/articles/ThePerilsofJavaSchools.html .
back2dos

@ back2dos Squeak có thể được sử dụng trong các lĩnh vực này, nhưng tại trường đại học tôi đã học ML. Cả hai đều không sử dụng như nhau trong ngành công nghiệp và cả hai đều đáng học hỏi, vì các khái niệm của họ. Bài báo nhọn là bài viết tồi tệ nhất của Joel tôi từng đọc, nó quá dài và ngay từ cái nhìn đầu tiên, thông điệp dường như là tầm quan trọng của việc xử lý các lỗi. : D Tôi thực sự vẫn đề xuất Java để dạy OOP.
maaartinus

@maaartinus: Những gì bạn học được ở trường đại học ít quan trọng trong câu hỏi những gì nên được dạy . Bạn vẫn không đưa ra lý do tại sao người ta nên sử dụng Java để dạy OOP, trong khi tôi đã đưa ra những gì tôi cho là lý do khá chắc chắn tại sao không làm điều đó. Ngoài ra, bạn rõ ràng đã không hiểu được bản chất của bài viết: Những người không thể đối phó với các vấn đề tương tự khó khăn như C không nên học CS ngay từ đầu. Tôi nghĩ CS không nên câm lặng với những gì mọi đứa trẻ thích máy tính có thể hiểu. Nếu chúng tôi không thể đồng ý về điều đó, thì thảo luận thêm là lãng phí thời gian của bạn và của tôi.
back2dos

12

Bạn có được nhiệt tình của tất cả các sọc.

Lập trình hướng đối tượng không phải là viên đạn bạc. Nó chưa bao giờ. Nó là gì, là một nạn nhân của sự cường điệu. Không thể tránh khỏi, mọi người phát ốm vì sự cường điệu và phản ứng dữ dội bắt đầu phát triển (bất kể tiện ích thực tế của mô hình).

Hai mươi năm nữa, chúng ta sẽ có một số phản ứng dữ dội khác đối với lập trình chức năng.


1
Đã có!
quant_dev

1
++ "Bạn nhận được sự nhiệt tình của mỗi sọc." Tôi là một học giả, và kinh nghiệm của tôi là thế này . Giới học thuật thích đưa ra những ý kiến ​​khiêu khích, gây ấn tượng có thể là sinh viên của họ.
Mike Dunlavey

5

Tôi không thể trả lời đầy đủ câu hỏi này vì người ta chỉ có thể đoán thứ hai những suy nghĩ mơ hồ của tác giả. Tôi hoàn toàn nghi ngờ rằng bài viết này sắp gây ra một số bối rối cho tác giả của nó. Không có gì về OOP có thể gợi ý rằng nó không phải là mô-đun hay song song:

Tính mô đun : Một khía cạnh chính của OOP là nó thực sự là mô đun (nhưng mô đun có nghĩa là những thứ khác nhau trong các bối cảnh khác nhau). Vì vậy, bất kể tác giả đang nói về khái quát hóa hay lập trình tĩnh, ông đều không chính xác.

Song song hóa : Đối với lập trình song song, hầu hết các khung đã hỗ trợ xen kẽ sau đó xâu chuỗi và bây giờ là song song hóa đúng như những gì chúng ta thấy trong .Net framework 4.0 và các ngôn ngữ OOP bắt vít vào nó.

Tôi nghi ngờ rằng tác giả đã trở thành nạn nhân thời trang ở chỗ có một quan niệm sai lầm rằng lập trình chức năng và OOP là loại trừ lẫn nhau trong việc sử dụng. Có các kiểu chức năng trong các ngôn ngữ OOP được ghi chép tốt, ví dụ, Oliver Sturm đã xuất bản trong lĩnh vực này.


4

Tác giả khẳng định rằng OOP quá khó để các lập trình viên năm nhất có thể hiểu, điều này có thể đúng - mặc dù tôi nghi ngờ điều đó, đưa ra các yêu cầu đầu vào cho CMU! Các tuyên bố chống mô-đun và chống song song có thể đúng trong một bối cảnh hẹp khi so sánh với các ngôn ngữ chức năng thuần túy, nhưng hầu như không lên án toàn bộ mô hình (dường như chỉ hoạt động tốt đối với những người biết sử dụng nó).

Chương trình giảng dạy được đề xuất sẽ dạy lập trình chức năng trong một lớp, lập trình bắt buộc (thủ tục) trong một lớp khác và cấu trúc dữ liệu trong một lớp khác. Khi một sinh viên năm nhất đã thành thạo 3 điều này, anh ấy / cô ấy nên sẵn sàng học OOP.

Cá nhân tôi nghĩ rằng đó là quá mức cần thiết, nhưng các học giả thích thử những điều mới và cực đoan. Là một đối trọng, MIT đã từng (và có thể vẫn) dạy tất cả các mô hình lập trình chính trong một lớp sinh viên năm nhất.

Thật kỳ lạ, cả hai trường đã sản xuất một số lập trình viên thực sự giỏi. Đi hình.

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.