Làm thế nào để thực hành lập trình hướng đối tượng? [đóng cửa]


13

Tôi đã luôn lập trình bằng các ngôn ngữ thủ tục và hiện tại tôi đang hướng tới hướng đối tượng. Vấn đề chính tôi gặp phải là tôi không thể thấy cách thực hành định hướng đối tượng một cách hiệu quả. Tôi sẽ giải thích quan điểm của tôi. Khi tôi học PHP và C, nó khá dễ thực hành: đó chỉ là vấn đề chọn một cái gì đó và suy nghĩ về một thuật toán cho thứ đó.

Ví dụ, trong PHP, vấn đề là os ngồi xuống và suy nghĩ: "tốt, chỉ để thực hành, hãy để tôi xây dựng một ứng dụng với một khu vực quản trị nơi mọi người có thể thêm sản phẩm". Điều này khá dễ dàng, đó là vấn đề nghĩ đến một thuật toán để đăng ký một số người dùng, đăng nhập người dùng và thêm các sản phẩm. Kết hợp những thứ này với các tính năng PHP, đó là một cách tốt để thực hành.

Bây giờ, trong định hướng đối tượng, chúng ta có rất nhiều điều bổ sung. Đây không chỉ là vấn đề suy nghĩ về một thuật toán, mà là phân tích các yêu cầu sâu hơn, viết các trường hợp sử dụng, tìm ra các sơ đồ, thuộc tính và phương thức lớp, thiết lập phép tiêm phụ thuộc và nhiều thứ.

Điểm chính là trong cách tôi học hướng đối tượng, có vẻ như một thiết kế tốt là rất quan trọng, trong khi trong các ngôn ngữ thủ tục, một ý tưởng mơ hồ là đủ. Tôi không nói rằng trong các ngôn ngữ thủ tục, chúng ta có thể viết phần mềm tốt mà không cần thiết kế, chỉ vì để thực hành nó là khả thi, trong khi theo hướng đối tượng thì dường như không khả thi nếu không có thiết kế tốt, ngay cả khi thực hành.

Đây có vẻ là một vấn đề, bởi vì mỗi lần tôi đi thực hành, tôi cần phải tìm ra hàng tấn yêu cầu, trường hợp sử dụng, v.v., nó dường như không phải là một cách tốt để trở nên tốt hơn trong việc định hướng đối tượng, bởi vì điều này đòi hỏi Tôi có toàn bộ ý tưởng cho một ứng dụng mỗi khi tôi thực hành.

Do đó, cách tốt để thực hành định hướng đối tượng là gì?


1
Trong những năm đầu đại học của tôi, một giới thiệu tuyệt vời về OOP là cuốn sách "Suy nghĩ bằng Java" của Bruce Eckel. Đó là khuyến nghị đọc cả cho người mới lập trình và cho những người đến từ nền tảng phát triển thủ tục - có thể nó sẽ giúp bạn.
Ivaylo Slavov

3
PHP là hướng đối tượng; bạn chưa sử dụng nó php.net/manual/en/lingu.oop5.php
Robert Harvey

Bạn chỉ có thể thực hiện lại cùng một ứng dụng bằng cách sử dụng phương pháp OOP. Rốt cuộc, nó chỉ là một công cụ. Đề xuất từ ​​bên dưới để có một cuốn sách GOF và cố gắng nghĩ lại mã thủ tục hiện tại của bạn theo cách hướng đối tượng cũng có thể là một cách thực hành tốt.
JensG

Tạo các trò chơi nhỏ (không có đồ họa), trò chơi bài hoặc tương tự khi bắt đầu, hãy thử sử dụng lại các lớp trong các trò chơi đó. stackoverflow.com/questions/1301606/
trộm

Câu trả lời:


20

Bây giờ, trong định hướng đối tượng, chúng ta có rất nhiều điều bổ sung.

Không, bạn không ...

Đây không chỉ là vấn đề suy nghĩ về một thuật toán, mà là phân tích các yêu cầu sâu hơn, viết các trường hợp sử dụng, tìm ra các sơ đồ, thuộc tính và phương thức lớp, thiết lập phép tiêm phụ thuộc và nhiều thứ.

Không có những thứ đó là cần thiết để thực hành lập trình hướng đối tượng.

Điều này khá dễ dàng, đó là vấn đề nghĩ đến một thuật toán để đăng ký một số người dùng, đăng nhập người dùng và thêm các sản phẩm.

Tất cả các lập trình hướng đối tượng thay vì nghĩ đến các thuật toán để thực hiện các bước này, bạn nghĩ về những đối tượng cần thiết để thực hiện các bước này - bạn muốn chức năng gì, trạng thái nào là cần thiết để làm điều đó và loại giao diện nào bạn muốn phơi bày cho người dùng. Giống như bạn phải làm trong lập trình thủ tục.

Sự khác biệt duy nhất là thay vì tập trung vào các chức năng bạn cần và cách chúng hoạt động, bạn tập trung vào cách chức năng và trạng thái được nhóm thành trách nhiệm và cách các trách nhiệm đó tương tác.

Làm thế nào để thực hành? Giống như cách bạn thực hành lập trình thủ tục: chọn một vấn đề và giải quyết vấn đề bằng cách sử dụng các lớp của lớp. Tìm hiểu làm thế nào mà hút, lặp lại với bài học kinh nghiệm.


3
+1 "Tìm hiểu làm thế nào mà bị hút" Đó là cách tôi viết mã: Tràn đầy sự xấu hổ và tự ghê tởm ... luôn luôn chiến đấu để học hỏi từ các dự án trước đó.
WernerCD

1
Tôi thích cách tiếp cận. Thay vì quá phức tạp và cố gắng học mọi thứ cùng một lúc, hãy bắt đầu với các bước nhỏ hơn và lặp đi lặp lại áp dụng tất cả kiến ​​thức bạn có được.
superM

6

Câu hỏi hay. Tất nhiên, những gì bạn đang nói là thực hành OOP thực sự có nghĩa là thực hành tất cả những điều này (phân tích yêu cầu, trường hợp sử dụng, mẫu thiết kế, v.v.), điều này đúng và lúc đầu có vẻ khó xử.

Lời khuyên của tôi sẽ là bắt đầu các buổi thực hành của bạn bằng cách ghi nhớ hai điều: phát triển dựa trên thử nghiệmnguyên tắc trách nhiệm duy nhất .

Sau đó, hãy bắt đầu như bạn đã làm với PHP / C: đưa ra một ý tưởng, suy nghĩ về những gì bạn cần cho việc đó và thực hiện từng thứ một. Tuy nhiên, hãy nhớ rằng bạn cần bắt đầu từ các thử nghiệm (điều này buộc bạn phải xác định các giao diện phù hợp, vì nếu không thì khả năng kiểm tra ngay lập tức bị ảnh hưởng) và TDD ngụ ý chu trình tái cấu trúc màu đỏ-xanh. Nói cách khác, bạn có một chút chức năng nhỏ, và một khi nó hoạt động, bạn tái cấu trúc để có được một thiết kế OO phù hợp nếu bạn không làm nó từ đầu (mà bạn sẽ không làm).

Khi thực hiện bước tái cấu trúc này luôn nhắc nhở bản thân về SRP. Nếu bạn đã thêm một trách nhiệm thứ hai cho đối tượng của mình, đã đến lúc tạo ra một cái gì đó mới.

Khi bạn phát triển như thế này, bạn cần lưu ý rằng giải pháp cuối cùng của bạn sẽ khác xa so với những gì bạn bắt đầu. Đường cong học tập của bạn cũng sẽ khá dốc. Ví dụ, bạn sẽ không tìm hiểu mô hình Factory là gì, nhưng thay vào đó, bạn sẽ nhận ra sự cần thiết của thứ gì đó tạo ra các thể hiện của lớp theo những cách khác nhau. Vì vậy, nếu bạn chưa từng nghe về các mẫu thiết kế hướng đối tượng, thì tốt nhất là bạn nên đọc một chút về các mẫu song song.


1
Vì vậy, về cơ bản, bạn đang nói "học TDD và GOF"
Robert Harvey

3

Nếu bạn mới bắt đầu tham gia OOP, bạn có thể tự giải trí và "thực hành" ngoại tuyến bằng cách xem xét bất kỳ hệ thống trong thế giới thực nào và xem xét các đối tượng là gì và mối quan hệ giữa chúng là gì và phương thức / giao diện nào chúng có thể hỗ trợ và làm thế nào bạn đại diện cho chúng trong một hệ thống phân cấp lớp và như một tập hợp các đối tượng được khởi tạo và mối quan hệ sở hữu đối tượng sẽ như thế nào (lưu ý: Tôi hoàn toàn không đề cập đến từ "thuật toán" ở trên). Vẽ nhiều sơ đồ (tìm hiểu một chút về UML hoặc tương tự) trước khi bạn nghĩ về việc mã hóa bất cứ điều gì.

Điều này sẽ giúp bạn phát triển ý thức tốt hơn về mối quan hệ IS-A và HAS-A , đây có lẽ là phân loại quan trọng nhất trong bất kỳ thiết kế OOP nào (và mặc dù vậy, nó dường như vẫn là thứ mà nhiều lập trình viên ngôn ngữ OOP dày dạn đấu tranh ). Nếu bạn thành thạo IS-A / HAS-A thì cũng có IS-IMPLMENTED-IN-TERMS-OF (mà tôi cũng đã thấy được mô tả là IS-KIND-OF-A: ^)

Nghiêm túc mà nói, chuyến đi tới siêu thị tiếp theo, hãy tưởng tượng ai đó đã giao cho bạn công việc viết mô phỏng OOP của nơi này ...


Nếu bạn đang viết phần mềm để giúp các nhà sinh vật học theo dõi những con hổ được gắn thẻ radio, thì thực tế là một con hổ là - một con vật và có một sọc không quan trọng và sẽ không được phản ánh trong phần mềm. Nhưng nếu bạn nghĩ về một con hổ trong bản tóm tắt và về nghĩa là-a và có-a, đó là những gì bạn nhận được.
Michael Shaw

1
Nhưng đó là lý do tại sao tôi đề xuất loại bài tập này, bởi vì nó sẽ nhanh chóng trở nên rõ ràng rằng hổ và sọc không liên quan đến một giải pháp tốt, trong khi những thứ như liệu tọa độ được theo dõi có bắt nguồn từ (đoán) GPS, nagivation quán tính hoặc tam giác vô tuyến có thể là thứ mà một thiết kế OOP theo dõi nên nắm bắt. Khi tôi nói "nhìn vào một hệ thống thế giới thực" tôi có nghĩa là nhìn xa hơn các thuộc tính vật lý thuần túy. ví dụ mô phỏng siêu thị chắc chắn sẽ cần bao gồm các khái niệm trừu tượng hơn như "hàng đợi", không chỉ là "xe đẩy" và "người mua hàng" rõ ràng.
timday

1

Những gì tôi nhớ từ thời C của tôi (xa xưa trong quá khứ), chúng tôi đã sử dụng để tách các chức năng và quy trình thành các tệp khác nhau dựa trên trách nhiệm của họ. Tôi không khẳng định điều đó là hoàn hảo hay bất cứ điều gì, nhưng đó là điểm khởi đầu tốt khi tôi thực sự bắt đầu lập trình bằng các ngôn ngữ hướng đối tượng. Vì vậy, có lẽ, bạn có thể bắt đầu với việc chuyển đổi tập tin thành các đối tượng.

Theo như OOP, đó thực sự là tất cả về thực hành và phấn đấu để cải thiện. Hiếm có ai có được nó ngay từ đầu. Do đó, lặp đi lặp lại trong suốt vòng đời của dự án.


0

Chúng ta hãy thêm một số thuật ngữ, phân tích hướng đối tượngthiết kế hướng đối tượng , như Peter Coad đã làm trong những năm 1990.

Cùng nhau tạo thành một kỷ luật kỹ thuật phần mềm OOAD có thể (thực hiện đúng) hỗ trợ lập trình viên tại điểm viết mã và kiểm tra mã. Lập trình hướng đối tượng sau đó có thể có mức độ chi tiết phù hợp, sử dụng khéo léo các tính năng ngôn ngữ lập trình để đáp ứng các mục tiêu chức năng và yêu cầu thiết kế được chỉ định ở cấp độ dự án.

Đôi khi, đó là dự án một người, và sau đó bạn phải đội tất cả các mũ (nhưng không nhất thiết phải tất cả cùng một lúc). Tôi là một fan hâm mộ lớn của phát triển dựa trên thử nghiệm cho các dự án cá nhân của riêng tôi (xem khuyến nghị của Frank), nhưng nó không chỉ liên quan đến phát triển phần mềm hướng đối tượng.

Trong một dự án nhóm có sự phân chia trách nhiệm tốt là chìa khóa để thực hiện thành công. Sử dụng khéo léo các mẫu thiết kế hướng đối tượng giúp nhóm hiểu biết bằng cách giới hạn các giao diện hiển thị cần thiết cho phân tích, nguồn cấp dữ liệu và logic nghiệp vụ để chia sẻ một khung có thể sử dụng.


0

"Tốt, chỉ để thực hành, hãy để tôi xây dựng một ứng dụng với khu vực quản trị nơi mọi người có thể thêm sản phẩm". Điều này khá dễ dàng, đó là vấn đề nghĩ đến một thuật toán để đăng ký một số người dùng, đăng nhập người dùng và thêm các sản phẩm.

Tại sao không làm điều tương tự chỉ lần này với các đối tượng người dùng và đối tượng sản phẩm? Ngoài ra nếu bạn đang sử dụng ngôn ngữ hỗ trợ cả thủ tục và OO thì bạn có thể thử triển khai các đối tượng dựa trên thư viện chuẩn thủ tục, như đối tượng tệp.

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.