Là công cụ hướng đối tượng thực sự quan trọng? [đóng cửa]


8

Trong nhiều năm, tôi đã làm công cụ Thuật toán, viết các cấu trúc dữ liệu có thể mở rộng để tìm kiếm trên internet, ví dụ: Cây tìm kiếm nhị phân ngẫu nhiên cho Đề xuất tự động, BitMaps, Thuật toán dựa trên đám đông bằng cách sử dụng Biểu đồ, viết một số thuật toán học máy thú vị như Phân cụm, Phát hiện dị thường, làm việc trên các công cụ truy xuất thông tin và như vậy

Có một điều phổ biến trong những điều mà tôi đã đề cập ở trên. Tất cả những thứ ở trên, mỗi thứ nếu được mã hóa bằng một ngôn ngữ như C ++ đòi hỏi rất nhiều lớp. Ý tôi là chúng là những vấn đề thú vị nhưng chúng không phức tạp về mặt công cụ Hướng đối tượng được tải nặng. Tôi chưa bao giờ sử dụng Kế thừa, công cụ ảo, vv Mặc dù tôi đã sử dụng nhiều Lập trình chung, Mẫu, v.v.

Tôi yêu C ++ (- Công cụ OO cồng kềnh, vì tôi thích những gì Joe Armstrong, người tạo ra Erlang nói, Trong Thế giới OO nếu bạn yêu cầu một quả chuối, bạn sẽ có một khu rừng lớn dọc theo con khỉ đột đang cầm quả chuối). Tôi thích mã hóa trong các ngôn ngữ khác như Java, Python cũng vậy.

Bây giờ câu hỏi của tôi là vì tôi đang tận hưởng loại dự án / Thuật toán mà tôi đang làm, tôi có cần phải học OO không, tôi có phải là một nhà thiết kế / lập trình viên giỏi hơn chỉ bằng cách sử dụng các công cụ như Kế thừa, Đa hình động (ảo) không? HOẶC tôi có thể chuyển sang thế giới Lập trình chức năng (tôi chưa làm điều đó cho đến bây giờ), điều này thu hút tôi hơn khi tôi chỉ có thể tập trung vào các nhiệm vụ / thuật toán và không để các công cụ OO dựa trên Kingdom Of Noun, có-a, là một quy tắc tôi?

Tóm lại, công cụ OO có thể giúp tôi tất cả cho các loại dự án / Thuật toán mà tôi đã đề cập ở trên không?

BIÊN TẬP:

Một liên kết cực kỳ thú vị để thêm vào đây:

http://steve-yegge.blogspot.in/2006/03/execut-in-kingdom-of-nouns.html


25
Hướng đối tượng là mô hình lập trình được sử dụng rộng rãi nhất hiện nay. Bỏ qua nó lúc nguy hiểm của bạn.
Robert Harvey

5
<mỉa mai> Không, đừng lo lắng về điều đó. C là đủ cho bạn. </
Trớ trêu

2
Liên kết / có thể trùng lặp: lập trình
viên.stackexchange.com / questions / 7126

16
Tất nhiên OOP / OOD được đánh giá cao. Mô hình tầm thường này chỉ có thể sử dụng cho các vấn đề hẹp. Nhưng bạn không nên bỏ qua nó - nếu không, bạn sẽ sử dụng sai công cụ cho các khu vực hẹp và hiếm hoi nơi OOP thực sự tỏa sáng.
SK-logic

13
Linus Torvalds, đây có phải là bạn không?
Jesse C. Choper

Câu trả lời:


9

Lập trình hướng đối tượng thực sự tốt trong việc che giấu những thứ toán học phức tạp của bạn đằng sau những từ dễ hiểu và giúp những người ít hơn trong số bạn thực sự sử dụng những thứ bạn đã viết. Nó không thay thế lập trình chức năng ... nó chỉ cung cấp cho bạn một cách thực sự dễ dàng để tắt các triển khai hoặc thêm hành vi.

Trong ví dụ về Cây tìm kiếm nhị phân ngẫu nhiên của bạn ở trên, điều gì sẽ xảy ra nếu bạn được yêu cầu vào Ngày cá tháng tư, Randomizer được thay thế bằng một thứ tự theo khoảng cách từ ba stooges. Thật tiện dụng để tạo StoogeBinaryTree : RandomBinaryTreevà ghi đè protected int GetSortOrder (Tree a, Tree b)phương thức, vì vậy vào ngày 2 tháng 4, bạn có thể chuyển việc thực hiện trở lại RandomBinaryTreemà không phải thay đổi bất kỳ mã nào.

Trong một ví dụ đơn giản, tôi đã cho thấy cả việc thêm các hành vi nhỏ và thực hiện chuyển đổi ...


14
Đây không phải là OOP, bất kỳ hệ thống mô-đun tử tế nào cũng sẽ làm như vậy (và, có thể, theo cách đơn giản hơn nhiều). Xem các mô-đun lớp 1 SML chẳng hạn.
SK-logic

4
@ SK-logic: Và các mô-đun và OOP khác nhau đáng kể như thế nào, chính xác?
DeadMG

12
@DeadMG, không có BS về các trạng thái và thông điệp và sự kế thừa trong định nghĩa của bất kỳ hệ thống mô-đun phong nha nào. Chỉ bao gồm, cộng với rất nhiều toán học hữu ích (tôi biết bạn sẽ ngất xỉu vào thời điểm này).
SK-logic

2
@ SK-logic: Các hệ thống OOP của tôi không sử dụng tin nhắn hoặc kế thừa hoặc trạng thái quá mức. Chúng gói gọn, và sau đó nếu tôi cần, chúng cũng có thể gói gọn trong thời gian chạy. Những người khác có thể làm việc của họ khác nhau, tất nhiên, nhưng đó là lựa chọn của họ, và không liên quan đến OOP.
DeadMG

3
@DeadMG Vậy sự khác biệt giữa ngôn ngữ hướng đối tượng và ngôn ngữ không phải là gì? Ví dụ, Haskell hoặc Erlang không hướng đối tượng theo cách nào nếu tất cả những gì cần thiết cho hướng đối tượng là một hệ thống mô-đun? Hay bạn đang nói đó là những ngôn ngữ hướng đối tượng?
sepp2k

8

Nếu bạn định làm FP vẫn với các ngôn ngữ như Haskell và Erlang làm tốt điều đó, thì không cần phải uống chất hỗ trợ làm mát OOP. FP rất mạnh mẽ và có thể làm được rất nhiều ngay cả trong thế giới thực

Điều đó đang được nói, học một ngôn ngữ OOP sẽ không phải là một điều xấu. Hiểu nhiều cách để lập trình và một số phương pháp sẽ có lợi cho bạn. Ngoài ra, nếu bạn chuyển từ Haskell hoặc Erlang sang Java, bạn có thể tự hỏi làm thế nào mọi người có thể làm việc mà không cần REPL và lambdas trên thế giới.


Và cần phải đề cập rằng các ngôn ngữ như Clojure cho phép OOP nhưng không hạn chế bạn phải dựa trên lớp. Đó là, Clojure hỗ trợ các hàm đa hình, giao diện, v.v. tất cả mà không cần phải tạo một lớp (ít nhất không phải là cách C # / Java định nghĩa nó).
Timothy Baldridge

Joe Armstrong lập luận rằng Erlang nhiều OO hơn C ++ hoặc Java, sẽ không giáo điều về những điều này, hoặc bạn sẽ bị nó cắn. Nhấp vào liên kết @ Đối tượng Erlang có định hướng không?

Ôi không, tôi đã viết một cuốn sách về Erlang ( shop.oreilly.com/product/0636920021452.do ) nhưng khi mọi người nói về OOP Erlang thường không phải là ý của họ
Zachary K

7

Có vẻ như bạn chỉ tập trung vào giải quyết một vấn đề duy nhất tại một thời điểm, tức là viết các thuật toán. Nhưng hãy xem xét cách bạn viết một ứng dụng GUI, ví dụ, hoặc một số ứng dụng lớn khác có thể yêu cầu bạn sử dụng nhiều thuật toán của mình. Trong trường hợp đó, việc biết OO sẽ rất cần thiết, vì nó sẽ giúp bạn đơn giản hóa mã của mình để giúp các nhà phát triển khác dễ đọc hơn và dễ sử dụng hơn, ví dụ như bằng cách tạo một thư viện có thể được tải dưới dạng đối tượng.

Một trong những mẫu thiết kế quan trọng nhất trong Lập trình hướng đối tượng là Mẫu chiến lược , trong kịch bản trên cũng sẽ giúp bạn rất nhiều. Xem xét một ví dụ nơi người dùng sẽ đưa cho bạn đầu vào mà bạn cho phép người dùng thực hiện thuật toán. Điều này có thể dễ dàng là một mớ hỗn độn nếu / khác hoặc chuyển đổi / trường hợp xây dựng. Bằng cách tạo giao diện chung cho thuật toán của bạn và sử dụng Mẫu chiến lược, mã của bạn sẽ linh hoạt hơn, dễ đọc hơn, dễ mở rộng hơn và do đó dễ bảo trì hơn.


Bạn có nhận xét gì về các ngôn ngữ chức năng thực hiện mô hình chiến lược rất thanh lịch (người ta có thể tranh luận, hơn thế nữa) mà không có đối tượng?
Steven Evers

4
-1 Vì giả sử rằng 1) các ứng dụng lớn là không thể nếu không có OOP và 2) việc tải thư viện bằng cách nào đó được gắn với OOP. Đọc nhiều công văn (và vấn đề về biểu thức) và bạn bắt đầu nhận ra rằng Java / C # / C ++ thực sự làm cho nhiều nhiệm vụ khó khăn hơn bằng cách đặt các hạn chế không cần thiết cho lập trình viên.
Timothy Baldridge

1
Xin vui lòng cho tôi biết làm thế nào một thư viện có thể được tải như một đối tượng là tốt hơn so với một thư viện không được tải như một đối tượng?
aseq

@SnOrfus Tôi ủng hộ OO, vì đó là thế giới mà tôi quen thuộc nhất. Tôi không quen thuộc với mẫu chiến lược ngôn ngữ chức năng
kba

2
"mô hình chiến lược" Đó là một điều khiến tôi chú ý đến OOP hơn bất cứ điều gì khác. Tại sao mọi thứ phải có một mô hình? Lý do duy nhất mà những thứ như mẫu khách truy cập phải được phát minh là ngôn ngữ được sử dụng rất hạn chế và phức tạp, đến mức không thể lặp lại trên cơ sở hạ tầng mà không có mẫu. Loại bỏ sự phức tạp điên rồ của các ngôn ngữ OOP hiện đại và đột nhiên mô hình hóa thành các chức năng đơn giản. Các mô hình chỉ đơn giản là một cách làm cho âm thanh OOP giống như nó có manh mối về những gì nó đang làm </ rant>
Timothy Baldridge

6

Cách tiếp cận hướng đối tượng đã trở nên thành công vì một khía cạnh quan trọng: nó cho phép bạn giải quyết các hệ thống có độ phức tạp thiết yếu đáng kể mà không đưa ra quá nhiều sự phức tạp tình cờ . Điều này có thể gần như bị bỏ qua khi bạn làm việc trên các hệ thống cây nhà lá vườn, nhưng trở nên rất quan trọng khi bạn xây dựng các hệ thống quy mô lớn.

Các yếu tố chính của cách tiếp cận hướng đối tượng có thể được giải thích cho một lập trình viên tiếp xúc rộng rãi với lập trình thủ tục trong vài ngày, điều này giúp kỹ thuật này trở nên phổ biến nhanh chóng (điều này không có nghĩa là bạn có thể trở thành một chuyên gia trong vài ngày: tương tự như học cờ vua - bạn có thể học cách di chuyển quân cờ của mình dưới mười phút, nhưng phải mất nhiều năm để thành thạo trò chơi).

Các kỹ thuật lập trình chức năng đang ngày càng trở nên quan trọng hơn với việc giới thiệu hỗ trợ ngôn ngữ cho chúng sang các ngôn ngữ chính (lambdas và đại biểu ẩn danh của C #, lambdas của C ++ và thậm chí các lớp Java ẩn danh ở một mức độ nhất định). Rất hữu ích để hiểu các kỹ thuật này, nhưng chúng được thiết kế để giải quyết các vấn đề cục bộ hơn trên quy mô chiến thuật . Các kỹ thuật hướng đối tượng, mặt khác, vẫn có liên quan trên quy mô chiến lược , đặc biệt là trong bối cảnh các đội lớn hơn.


3
Trong khi tôi đánh giá cao tình cảm được thể hiện liên quan đến sự phức tạp, thì thật đáng buồn trong thực tế thì điều ngược lại là đúng. Các ngôn ngữ OO có một sở trường để giới thiệu sự phình to và phức tạp không cần thiết. Đó thường không phải là lỗi của ngôn ngữ. Nhưng tôi tin rằng nếu một kỹ thuật có xu hướng khiến nhiều người sử dụng nó không đúng cách thì nó có thể hơi thiếu sót. Không có vấn đề như thế nào tốt đẹp trong lý thuyết.
aseq

1
+1 cho dasblinkenlight và tôi không đồng ý với aseq. Cụ thể, tôi nghĩ rằng OO ánh xạ chặt chẽ với những gì cần thiết để thực hiện bất kỳ GUI hướng sự kiện nào và vì có rất nhiều hoạt động trong UI, nên có rất nhiều hoạt động trong các khung OO. Làm một UI mà không có khung OO và cuối cùng bạn sẽ thực sự xây dựng một thứ gì đó lộn xộn hơn nhiều (xem X11 Xt); sự phức tạp thiết yếu vẫn còn đó, không có khuôn khổ, nó nhô ra theo những cách khủng khiếp. Sử dụng các công cụ thích hợp cho công việc. Khi một học viên không có kỹ năng sử dụng sai công cụ, bạn có đổ lỗi cho ngôn ngữ hoặc học viên không?
Liudvikas Bukys

@aseq "Nhưng tôi tin rằng nếu một kỹ thuật có xu hướng khiến nhiều người sử dụng nó không đúng cách thì nó có thể hơi thiếu sót." Nhìn vào các số liệu thô là sai lệch vì các công nghệ khác nhau thu hút số lượng học viên khác nhau . Tỷ lệ phần trăm sẽ có ý nghĩa hơn, nhưng chúng không có sẵn. Hơn nữa, các rào cản gia nhập và cấu trúc của các khuyến khích phi công nghệ giúp các học viên có mức độ chất lượng khác nhau , do đó, ngay cả tỷ lệ phần trăm có thể không cung cấp cho bạn một bức tranh hoàn chỉnh.
dasblinkenlight

1
Tôi không thấy cách lập trình chức năng không "chiến lược". Đó là, nếu có bất cứ điều gì, tốt hơn OOP cho quy mô lớn hơn vì nó làm giảm sự ghép và phức tạp và cho phép bạn làm việc ở mức độ trừu tượng cao hơn. Ngoài ra, có một số kỹ thuật rất hay để xây dựng UI theo cách hoàn toàn có chức năng: kiểm tra "lập trình phản ứng chức năng".
Tikhon Jelvis

4

Làm lập trình chức năng, nó sẽ là một kinh nghiệm rất tốt cho bạn, ngay cả khi bạn quyết định không tiếp tục. Như bạn có thể đọc một số câu trả lời ở đây, nhiều người thậm chí không biết nó là gì.

Các khái niệm ngôn ngữ chức năng, ví dụ đánh giá lười biếng và độ trong suốt tham chiếu, là một điều rất tốt để học. Đặc biệt nếu bạn thích đệ quy.

ví dụ:

lenth :: [a] -> Integer
length (x:xs) = 1+length(xs)
length [] = 0

là một hàm haskell rất đơn giản, đệ quy thông qua một danh sách và tính toán chiều dài. Nếu bạn quan tâm đến những con số lớn hơn dài và muốn sử dụng Danh sách vô hạn và những thứ ưa thích khác, hãy thử lập trình chức năng.


2
Đó cũng là một cách ngu ngốc (di chuyển thủ công thay vì sử dụng các khái niệm trừu tượng được xây dựng trước và không hiệu quả) để thực hiện length. Một cách khác (hiệu quả hơn và gần hơn với cách các chương trình FP không thực sự được viết) có thể được gọi một số lần với giá trị bắt đầu 0và chức năng bước acc -> acc + 1. Ngoài ra, sum . map (const 1)đọc độc đáo.

1
@Giorgio Không, chức năng không phải là đệ quy đuôi. Và ngay cả khi đó là, trong các ngôn ngữ như Haskell chỉ liên quan một cách hữu hình đến hiệu quả và việc sử dụng ngăn xếp (người ta phải tránh xây dựng những chiếc quần lớn; không phải cái này cũng không lengthđược xây dựng trên đỉnh của những người không nghiêm ngặt foldlàm điều này).

2
@Jordan: Ngoại trừ trong Haskell, các giá trị không thể được sửa đổi và không phải tất cả các danh sách đều có độ dài (hữu hạn).
Jon Purdy

3
@ WalterMaier-Murdnelch Vâng, cuối cùng danh sách sẽ phải được duyệt và người ta phải hiểu những gì xảy ra dưới mui xe. Nhưng điều đó không làm cho sự trừu tượng trở nên vô dụng, hoàn toàn ngược lại. Tôi có thể viết các truy vấn SQL (trên Yesod persistent), xử lý lỗi (over Maybe/ Either), tung hứng trạng thái (over State), tra ngang cây (over Map/ Set), v.v. nhưng mô tả ý định của tôi về chức năng cấp cao hơn theo mọi cách tốt hơn , và do đó, những gì FP làm trong thực tế.

1
@Giorgio Trong các ngôn ngữ nghiêm ngặt, vẫn là chuẩn mực, mặc dù vậy, nó cũng phụ thuộc vào trình biên dịch chăm sóc tối ưu hóa này (Python, mặc dù có một số huyền thoại đô thị, không phải là ngôn ngữ chức năng và không tối ưu hóa các cuộc gọi đuôi - Lua OTOH nào). Nhưng ngay khi bạn nhận được không nghiêm ngặt (ví dụ nổi bật nhất: Haskell), các quy tắc sẽ thay đổi. Bạn có thể đệ quy theo đuôi và vẫn bị tràn ngăn xếp vì bạn đã tạo ra một khối lớn (một triệu bổ sung số nguyên bị trì hoãn do lười biếng) hoặc (không đuôi-) tái diễn một cách điên cuồng và hòa hợp với nhau. Vì vậy, tôi sẽ không lấy quy tắc này làm phúc âm.

2

Như những người khác đã nói, định hướng đối tượng là mô hình chi phối trong công nghiệp. Bạn đã nói rằng bạn đã làm việc chủ yếu với các chương trình có thể được giải quyết bởi một số lớp, nhưng trong một ứng dụng công nghiệp, có hàng trăm hoặc hàng ngàn trường hợp sử dụng cần được giải quyết và hướng đối tượng đã chứng minh rất đáng tin cậy và cách rộng rãi dễ hiểu để cấu trúc các cơ sở mã lớn như vậy.

Bạn nói về lập trình chức năng, vốn là một ứng cử viên vững chắc cho The Next Big Paradigm, nhưng FP vẫn chưa quen thuộc trong ngành. Đặc biệt, khi bạn là một lập trình viên C ++, bạn nên biết rằng ngành công nghiệp có thể bảo thủ và thế giới C / C ++, với sự nhấn mạnh vào hiệu suất, là một nơi mà bản chất bắt buộc của phần cứng được xem là một sự cân nhắc rất thực tế. Nói chung, các lập trình viên hệ thống nhúng cực kỳ hoài nghi về FP, theo kinh nghiệm của tôi.

Thậm chí nếu FP không trở thành một mô hình có ưu thế hơn trong công nghiệp, nó chắc chắn là trường hợp đó nó sẽ thành công trong các hình thức ngôn ngữ lai đối tượng chức năng như F # và Scala và không theo hình thức ngôn ngữ FP "tinh khiết" như Haskell.

Tất cả những điều đó là để nói rằng, vâng, "công cụ" hướng đối tượng là quan trọng đối với các cơ sở mã chuyên nghiệp và sự nghiệp của bạn.


2

OO đã đạt được lực kéo bởi vì đó là một cải tiến lớn để xử lý sự phức tạp, vì trước đó nó cũng có cấu trúc / lập trình thủ tục.

Lợi ích của việc sử dụng OO tăng lên khi quy mô của dự án tăng lên. Đối với chương trình 1KLOC, việc bạn sử dụng mô hình nào không quan trọng, tất cả chúng sẽ hoạt động tốt. Nhưng đối với chương trình 200KLOC +, đơn giản là không có sự cạnh tranh khả thi nào đối với OO. Điều đó không có nghĩa là bạn không thể viết chương trình 200KLOC bằng C, chỉ là bạn sẽ phải kỷ luật hơn rất nhiều để tránh kết thúc với một mớ hỗn độn mà không ai (kể cả bạn) có thể hiểu được. Điều đó không có nghĩa là OO sẽ ngăn chặn sự lộn xộn như vậy, chỉ là nó sẽ giúp cuộc sống của bạn dễ dàng hơn để ngăn chặn nó.

Lập trình hàm là một mô hình hơi sai lệch so với mẫu trước đó, vì nó không giúp xử lý sự phức tạp thậm chí phức tạp hơn OO, nhưng để giải quyết một loại vấn đề khác: lập trình song song. Đó cũng là lần đầu tiên, một mô hình lập trình đã cố gắng làm như vậy: tất cả các cơ chế tồn tại trước đó trong OO và / hoặc SP / PP không phải là một phần của mô hình, mà chỉ là các thực thể HĐH (luồng, biến đổi, v.v.) gói gọn theo các quy tắc mô hình.

Về vấn đề đó, FP tự nhiên hơn rất nhiều so với những người khác, nhưng điều đó phải trả giá bằng cách đảo ngược cách chúng ta thường nghĩ về các vấn đề. Và do đó, nó có khả năng hạn chế để xử lý sự phức tạp rất giống nhau ở cùng một quy mô mà OO làm.

Tôi đoán là điều này sẽ hạn chế việc áp dụng FP trong tương lai gần đối với các hệ thống rất chuyên biệt, nói chung không có nhiều phần lớn hoặc chuyên biệt của các hệ thống lớn hơn. Và phần còn lại vẫn sẽ được thực hiện bằng OO. Những người bạn dự định phát triển (hoặc tìm hiểu về sự phát triển) sẽ xác định điều gì sẽ là trọng tâm học tập của bạn, IMO.


1

Mặc dù tôi đã sử dụng rất nhiều Lập trình chung, Mẫu, v.v.

Có thể cho rằng, các mẫu đơn giản là một dạng OOP khác. Các hàm ảo và kế thừa rõ ràng có một trường hợp sử dụng cụ thể - thời gian chạy, khả năng hoán đổi nhị phân. Mẫu là khả năng hoán đổi thời gian biên dịch. Tuy nhiên, ở cấp độ cơ bản nhất, chúng cung cấp tính năng trừu tượng tương tự đối với bất kỳ loại nào cung cấp giao diện chính xác. Việc sử dụng quá mức kế thừa thời gian chạy là một mùi mã đáng kể và trong trường hợp này, tôi đồng ý với bạn - đơn giản là nó không cần thiết trong phần lớn thời gian.

template<typename T> void func(T t) { t(5); }
void func(std::function<void(int)> t) { t(5); }

Hai đoạn mã này giống hệt nhau một cách hiệu quả, mặc dù một đoạn sử dụng riêng các mẫu và đoạn còn lại sử dụng kế thừa và các lớp thời gian chạy khi triển khai. Cả hai đều trừu tượng về chức năng bạn đang gọi. Đây là trivially rõ ràng khi bạn thay thế Tcho std::function<void(int)>, ví dụ. Sự khác biệt duy nhất là thời gian mà sự trừu tượng được thực hiện. Phiên bản mẫu vượt trội cho các chức năng và std::functionthường tốt hơn là các biến thành viên. Bạn không muốn phải tạo một lớp mới mỗi khi bạn muốn một cuộc gọi lại mới.

OOP không đặc biệt phù hợp với các thuật toán. Nó được dự định nhiều hơn cho các công trình quy mô lớn, phá vỡ các phần của chương trình. Nếu bạn đang viết một thuật toán cụ thể hoạt động trên dữ liệu cụ thể thì có thể bạn sẽ không cần các lớp.

Thật dễ dàng và thật tuyệt vời khi soạn thảo các thuật toán của các hàm. Tuy nhiên, ngay khi bạn vượt qua điều đó, thì các lớp sẽ nổi lên như là phương thức chi phối.


9
Ồ Mẫu là một "hình thức của OOP"? Bạn đã làm cho ngày của tôi, anh bạn!
SK-logic

4
Mẫu dành cho lập trình chung. Tôi không nghĩ là đúng khi nói rằng các mẫu đơn giản là một dạng OOP khác. Hy vọng Alex Stepanov không đọc nó :)
Yavar

Như tôi đã chứng minh, hai chức năng tương đương hiệu quả và có cùng sự trừu tượng hóa. Nó chỉ đơn giản là xảy ra tại một thời điểm khác nhau.
DeadMG

4
Cộng đồng C ++ ngày nay sử dụng lập trình meta mẫu cho những việc được thực hiện trước đó theo cách OOP hơn. Tuy nhiên tôi sẽ không gọi đây là "một dạng OOP khác". Đặc biệt là ví dụ trên tôi sẽ gọi "cách C ++ sử dụng các đối tượng functor là một dạng lập trình chức năng đặc biệt", đây không phải là một giải pháp OOP điển hình.
Doc Brown

4
Họ chồng chéo trong một số tính năng, phải. Đó là bởi vì cả hai đều hữu ích, vì vậy chắc chắn có một số điều cả hai đều làm tốt. Nhưng điều đó không cho thấy rằng chúng luôn đồng hình và nó không cho thấy chúng hữu ích như nhau (ví dụ cô đọng và hiệu quả) cho tất cả các vấn đề. Một danh sách được liên kết chức năng thuần túy cũng chia sẻ một số tính năng với các mảng động, phân bổ quá mức - chúng đều là bộ sưu tập được đặt hàng, chúng có thể được tạo tăng dần với độ phức tạp hợp lý, chúng hỗ trợ sử dụng tốt như stack (pop / pop / peek), v.v. nhưng khác nhau rộng rãi, về mặt khái niệm và trong nhiều ứng dụng thực tế.

1

Vâng, điều quan trọng là, vì lý do duy nhất này: hiểu OOP giúp bạn trở thành một lập trình viên tốt hơn. Như một quy luật tự nhiên: sự hiểu biết luôn khiến bạn trở thành một lập trình viên tốt hơn.

Cần lưu ý rằng không phải là a, cũng không phải là các lớp kế thừa có liên quan gì đến OOP. Những gì OOP thực sự là về việc tách rời thông qua sự gián tiếp, được hình thành bởi nguyên tắc đảo ngược phụ thuộc . Người ta có thể lập luận rằng đây cũng là một khía cạnh quan trọng của FP. Nếu nghiên cứu cả OOP và FP, bạn sẽ ngày càng nhận ra rằng chúng thực sự là hai mặt của một sự liên tục. Sự hiểu biết của bạn về nó càng rộng và sâu hơn, bạn sẽ trở nên tốt hơn.

Để hiểu về OOP, hãy thử Io và có thể là Smalltalk và Ruby.


0

Trong thế giới phát triển, ngôn ngữ là công cụ, mô hình lập trình là công cụ và thư viện là công cụ. Bạn càng có nhiều công cụ, bạn càng có khả năng lựa chọn công cụ phù hợp cho công việc. Vì vậy, điều đó sẽ tranh luận để bạn học lập trình OO, AOP và Chức năng - khi thời gian cho phép.

Thế giới phát triển tiếp tục phát triển ngày càng lớn hơn (về ngôn ngữ, khung, v.v.), vì vậy bạn không thể mong đợi học mọi thứ. Tuy nhiên, mục tiêu của tất cả những đổi mới này là giúp các nhà phát triển làm việc hiệu quả hơn (tốc độ phát triển và khả năng sử dụng lại) và làm cho mã dễ duy trì hơn (dễ hiểu, dễ mở rộng và sửa đổi).

Điều tốt nhất bạn có thể làm là thực hiện mục tiêu, học hỏi liên tục, với hy vọng rằng điều gì đó mới bạn vừa học đã giúp bạn hoàn thành điều gì đó tốt hơn và nhanh hơn theo cách bạn không bao giờ ngờ tới.


-1

Tôi đã đọc cuốn sách của Steve Jobs và trong đó có một câu chuyện về cách Steve nhìn thấy SmallTalk tại phòng thí nghiệm Xerox PARC. Đó là một trong những ngôn ngữ OO sớm nhất. Nếu không có OO, sẽ rất kinh khủng khi phát triển một thứ như Giao diện người dùng đồ họa (GUI). Với tất cả các đầu vào không đồng bộ và có thể chuyển từ nhiệm vụ này sang nhiệm vụ khác trong khi làm việc với một "Đối tượng" hoặc đối tượng khác.

Vì vậy, trong khi bạn có thể làm rất nhiều với một ngôn ngữ chức năng và nó chắc chắn có trường hợp sử dụng. Khi bạn bắt đầu xử lý các hệ thống phức tạp hơn tương tác nhiều hơn với các vấn đề trong thế giới thực, bạn thấy OO là một thiết kế ưu việt.


khung công tác GUI GUI đầu tiên (Hộp công cụ) là một thứ xấu xa của C làm cho Win32 trông thật lành mạnh khi so sánh. OO đã không đến thế giới Mac cho đến khi chuyển sang OSX! Đây là một sự tương tự khủng khiếp và tốt nhất trong lịch sử gây hiểu lầm. Wings3D được viết bằng Erlang và có GUI rất phong phú và là "thế giới thực", trường hợp sử dụng phức tạp và thực tế như bạn có thể nhận được.

Nó thực thi lại cách lập trình chức năng không phù hợp thì không. (Tôi chưa hoàn thành cuốn sách, thật thú vị khi họ không chọn sử dụng một trong nhiều tiến bộ mà nhóm Xerox đã thực hiện, có vẻ như nhóm Xerox đã đi trước thời đại)
Bill Leeper

Bạn có nhận ra rằng Erlang là ngôn ngữ chức năng và Wings3D là một GUI rất tiên tiến và phức tạp, mâu thuẫn với khẳng định của bạn rằng lập trình chức năng không thực tế và OO tốt hơn, trừ khi bạn không hiểu lý thuyết Chức năng.
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.