Các đối tượng đã phân phối về mặt tái sử dụng mã?


17

Tôi thường nghe nói rằng các đối tượng chưa được phân phối về mặt tái sử dụng mã. Bạn có đồng ý không? Nếu bạn tin rằng họ không có, tại sao không?


4
Tôi chưa bao giờ nghe ai nói điều đó ...
TheLQ

2
@ Tôi không tin tôi thực sự đã nghe ai nói điều đó, nhưng tôi đã đọc nó.
George Marian

Khả năng sử dụng lại không phải là lợi thế duy nhất của OOP.
Không ai là

2
"Các đối tượng được phân phối về mặt tái sử dụng mã?" -> Chỉ khi bạn tin rằng nhân viên bán hàng OOP từ ngày trước (đó có phải là thập niên 60 không? Tôi quên)
Steven Evers

Câu trả lời của tôi cho một câu hỏi tương tự: lập trình
viên.stackexchange.com/

Câu trả lời:


18

Không, không nhất thiết.

Các đối tượng cung cấp ngữ nghĩa tốt hơn, tổ chức mã / chức năng và, có thể, dễ sử dụng.

Các thư viện được thiết kế tốt sẽ cung cấp dựa trên lời hứa về việc tái sử dụng mã, chứ không phải các đối tượng.


Vâng, vâng. Nhưng các đối tượng có hỗ trợ các nhà thiết kế thư viện bằng cách cung cấp cho họ các tùy chọn giúp thư viện của họ dễ sử dụng lại không? Tôi sẽ tranh luận họ có, và do đó các đối tượng đã cung cấp tái sử dụng được cải thiện.
Jules

@Jules Tôi cũng vậy, thích tranh luận chỉ vì tranh luận. Tôi sẽ không tranh luận rằng các đối tượng đã không làm cho việc thiết kế thư viện dễ dàng hơn. Tôi cho rằng việc sử dụng đúng công cụ của bạn là điều dẫn đến kết quả đúng.
George

7

Thành thật mà nói tôi không chắc chắn liệu "tái sử dụng mã" có thực sự là thứ mà bất kỳ ai cũng theo đuổi (hoặc ít nhất, nên là sau). Triết lý của tôi là "các thành phần phần mềm", có nghĩa là khả năng bảo trì tốt hơn thông qua các giao diện tốt và tránh các khớp nối không cần thiết. "Tái sử dụng mã" là một trong những điều đôi khi rơi ra khỏi điều đó - mã trùng lặp không cần thiết là một dấu hiệu cho thấy bạn đã tổ chức mọi thứ sai cách và tất nhiên đó là một nỗi đau để duy trì.

Để trả lời câu hỏi trực tiếp hơn một chút, có một bộ công cụ khá tốt để tránh lặp lại chính mình: thừa kế, đặc điểm, ủy quyền, chức năng bậc cao, v.v. Trong số đó, mọi người có xu hướng nhầm lẫn giữa thừa kế với OO nói chung - và họ cũng có xu hướng lạm dụng nó một chút, nếu bạn hỏi tôi. Có lẽ đó là nơi mà một số rung cảm "OO hút" đến từ: tìm sự kế thừa bị mắc kẹt ở nơi không có quyền tự nhiên :)


Tái sử dụng mã chắc chắn là một cái gì đó để nhắm đến, khi bạn có thể tránh hy sinh chất lượng mã
Casebash

1
Tái sử dụng mã mặc dù không phải là một mục tiêu cho chính nó. Tái sử dụng là một từ khác để ghép nối. Như vậy, bạn phải tiếp cận tái sử dụng một cách cẩn thận. Có vẻ rất nhiều nhà phát triển quên điều này. Họ muốn các hệ thống tách rời, nhưng quay lại và cố gắng sử dụng một lớp hiện có ở mọi nơi.
Andy

5

Không, "đối tượng" chưa tạo mã sử dụng lại dễ dàng hơn hoặc phổ biến hơn. Những mối quan tâm tương tự ngăn không cho mã được sử dụng lại trong một chương trình mô-đun (thiết kế, kiểm tra và ghi lại API mục đích chung đòi hỏi nhiều nỗ lực trước mắt hơn là viết một thói quen một lần và tất cả các giao dịch có thể là chủ của không - logic dự định được sử dụng lại có thể không được tối ưu hóa tốt cho các mục đích sử dụng mà nó thực sự hướng tới) áp dụng cho các chương trình OO, với mối quan tâm thêm rằng một mô hình đối tượng được thiết kế kém có thể cản trở việc tái sử dụng nếu không sử dụng lại mã.

OO là một sự trừu tượng hóa hữu ích cho nhiều vấn đề, nhưng hãy cảnh giác với sự cường điệu của thập niên 80-90: nó không giải quyết được các vấn đề cơ bản trong giao dịch của chúng tôi nhiều hơn là làm bánh quế cho bạn khi bạn ngủ.


5

Tôi không mong đợi TẤT CẢ các đối tượng được sử dụng lại nhưng chúng tôi có rất nhiều đối tượng mà chúng tôi sử dụng lại trên nhiều dự án khác nhau. Chúng tôi cũng có các đối tượng chỉ được sử dụng lại trên một dự án. Chúng ta thường sẽ sử dụng cùng một đối tượng kinh doanh (hoặc đối tượng truyền dữ liệu) cũng như các đối tượng logic kinh doanh từ ứng dụng máy tính để bàn Click-Again, ứng dụng web và ứng dụng điện thoại cho cùng một dự án.

Bạn đã nghe nói rằng OO không cung cấp khi tái sử dụng ở đâu? Và lý do là gì? Có lẽ thiết kế của các đối tượng của họ đã buộc họ vào tình huống đó ...


4
Bài viết khác nhau. Và từ kinh nghiệm cá nhân, làm cho một đối tượng có thể tái sử dụng không hề dễ dàng chút nào
Casebash

3

Một số lập trình viên sẽ sao chép và dán bằng bất kỳ ngôn ngữ và phong cách nào.

Các lập trình viên thực sự giỏi có thể tránh hầu hết các bản sao và dán bằng gần như bất kỳ ngôn ngữ nào.

Tôi thấy các mẫu OO có xu hướng khuyến khích tái sử dụng. Tôi đã thấy mã Java được viết theo kiểu không phải OO (trong đó dữ liệu được tách ra khỏi mã do ORM nhảm nhí) và việc sử dụng lại thực sự rất tồi tệ - nhưng trong OO, các lập trình viên tương tự đã thiết kế tốt hơn ( và tái sử dụng).

Ngoài ra, trong trường hợp chúng tôi sử dụng các mẫu không oo hoặc oo chống patters như setters / getters, switch statement, lớp bên trong ẩn danh, các hàm lớn và giống như tôi đã thấy việc sử dụng lại mã đi xuống và luồn lách đi lên ... đáng kể.

ps. Tôi biết mọi người sẽ có vấn đề với đoạn trước, vì vậy tôi sẽ giải thích một chút.

Setters và getters gây ra các vấn đề OO vì chúng cho phép bạn hoạt động trên các thành viên của một đối tượng (một đối tượng nên thao túng các thành viên OWN của nó) Điều này phân phối mã hoạt động trên lớp của bạn trong các lớp khác yêu cầu bạn sao chép chức năng xung quanh setter / getter . Điều này cũng áp dụng cho Thuộc tính - chỉ vì Thuộc tính dễ dàng hơn không làm cho chúng "Tốt" trong mọi tình huống.

Mã trong các lớp bên trong Ẩn danh hoàn toàn không thể được sử dụng lại và mọi người quên rằng nhiều thứ (như người nghe) có thể và nên là các lớp đầy đủ - điều này cũng áp dụng cho việc đóng cửa! Nếu bạn đã sử dụng một lớp bên trong ẩn danh để triển khai một cái gì đó giống như người nghe, thì nhiều khả năng bạn chỉ cần sao chép và dán bản thực hiện của mình hơn là trích xuất mã vào một phương thức hoặc thay vào đó là lớp riêng. Đóng cửa cũng có thể cải thiện khả năng sử dụng lại - chỉ phụ thuộc vào cách bạn sử dụng chúng.

Trong nhiều trường hợp, các tính năng có sẵn cho bạn định hình cách bạn cấu trúc mã của mình. OO thậm chí còn mạnh mẽ hơn khi giúp bạn hình dung tất cả mã của mình và cách nó tương tác, nhưng đó là một câu hỏi khác.


2

Các đối tượng không có khả năng cung cấp tái sử dụng mã nhiều hơn so với cầu thang hoặc thiết bị thể dục khác có thể giảm cân. Các nhà phát triển phải được thúc đẩy để sử dụng các công cụ đúng cách.

Khi các nhóm phần mềm đặt giá trị cao hơn cho việc sử dụng lại mã đã kiểm tra so với việc giữ tất cả các chi tiết trong đầu, bạn sẽ thấy các đối tượng và phương thức chi tiết hơn rất nhiều và do đó sử dụng lại nhiều mã hơn.


2

Đúng

OOP cung cấp cho bạn nhiều cách hơn để sử dụng lại mã

Không

Không có viên đạn bạc

Nó phụ thuộc

về những gì bạn đặt vào nó, và những gì bạn mong đợi được đáp lại!


1

Đúng. Lập trình hướng đối tượng tốt thúc đẩy phân tách các mối quan tâm, khớp nối thấp, độ gắn kết cao và ẩn thông tin. Những điều này là rất quan trọng đối với mã tái sử dụng.

Tôi cho rằng lợi ích chính của OOP là tính mô đun và khả năng sửa đổi, thay vì sử dụng lại, nhưng đó là một câu hỏi khác.


4
Tôi đồng ý rằng các đối tượng làm cho mã đẹp hơn, nhưng thật không may, một tỷ lệ lớn các đối tượng của tôi không thể tái sử dụng. Thông thường, làm cho một đối tượng có thể tái sử dụng có nghĩa là quá đơn giản hóa tình huống
Casebash

2
@casebase +1 Tuy nhiên, tôi sẽ nói rằng làm cho các đối tượng có thể sử dụng lại có nghĩa là quá phức tạp hóa tình huống (đối tượng).
George Marian

Không phải mọi thứ sẽ được tái sử dụng. Hầu hết mọi thứ sẽ không. Tuy nhiên, khớp nối thấp, ẩn thông tin, v.v., tất cả đều là điều kiện tiên quyết để tái sử dụng và đối tượng thúc đẩy điều đó.
Fishtoaster

2
@Fishtoaster: bạn cũng có thể nói rằng chiếc xe của bạn di chuyển là điều kiện tiên quyết để đi làm, và đường lái xe nghiêng sẽ thúc đẩy điều đó. Về mặt kỹ thuật, nhưng không thể tạo ra sự khác biệt bên ngoài các trường hợp cạnh: nếu bạn cần và muốn sử dụng lại, bạn sẽ nhận được nó, OO hoặc không; nếu bạn không, thì điều kiện tiên quyết sẽ không khiến điều đó xảy ra một cách tình cờ.
Shog9

@Ông. C- Tôi không chắc chắn tôi làm theo quan điểm của bạn. Tôi chỉ đơn thuần nói rằng những thứ mà OOP bồi dưỡng (mô đun hóa, v.v.) làm cho việc tạo ra những thứ như thư viện trở nên dễ dàng hơn. Có rất nhiều cách để làm cho mã có thể được sử dụng lại bằng cách tách các mối quan tâm, vv- OOP là một, thiết kế phương pháp tốt là một cách khác, phân tách vấn đề thích hợp vẫn là một cách khác.
Fishtoaster

1

Các đối tượng cho phép khởi kiện lại mã nhưng như vậy không phải là kỹ thuật nhất cho điều đó. Tôi nghĩ rằng việc sử dụng lại mã được thúc đẩy thông qua các kỹ thuật liên quan đến đối tượng như kế thừa, đa hình, quá tải và các mẫu.


1

Vâng, họ làm, khả năng mở rộng (kế thừa) từ một lớp rõ ràng siêu hạng góp phần tái sử dụng mã, tôi không chắc làm thế nào bất cứ ai có thể tranh luận khác. Bạn có thể chỉ cần mở rộng một lớp và ghi đè một phương thức, trong khi sử dụng phần còn lại từ siêu lớp, nếu điều này không hỗ trợ trong việc sử dụng lại mã thì tôi không biết đó là gì


0

Nếu đó là họ đã thực hiện theo lời hứa của họ về việc tái sử dụng mã cho đến nay? Có, nếu các chương trình được viết bằng OOP trong tâm trí áp dụng các mẫu thiết kế một cách khôn ngoan. Mặt khác, chủ yếu là không. Nhưng nhìn vào sự phổ biến của các chương trình không tầm thường quy mô lớn mà các hệ thống Adobe, Google và tương tự viết bằng C ++ hoặc Java hoặc các ngôn ngữ OOP khác, tôi sẽ nói rằng OOP còn một chặng đường dài trước khi nó bị loại bỏ. Thời gian đó sẽ phù hợp hơn nhiều để đặt câu hỏi này và có thể giúp cung cấp công việc mặt đất cho một mô hình mới.

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.