Đó có phải là một dấu hiệu xấu mà tôi thường thiết kế lại khi tôi phát triển một dự án?


39

Khi tôi mới bắt đầu lập trình, tôi đã giả định rằng một ngày nào đó tôi sẽ đến điểm mà tôi sẽ bắt đầu một dự án bằng cách ngồi xuống và phác thảo một sơ đồ UML của tất cả các lớp, sau đó khá dính vào đó. Bây giờ tôi đã lập trình được một vài năm và nó không diễn ra như vậy. Khi tôi đi qua một dự án, tôi thường nói

  • "Này, tôi cần một lớp để làm _ _. Tôi không nghĩ về điều đó trước đây."
  • "Đợi đã, chức năng này thực sự nên ở trong lớp đó thay vì cái này. Tôi sẽ chuyển nó qua."
  • "Đây thực sự nên là hai lớp thay vì một. Tôi sẽ chia nó ra."
  • "Tôi nên làm cho ba lớp độc lập này đều được kế thừa từ một lớp trừu tượng."
  • Etcetera, vân vân.

Có phải đó là một dấu hiệu xấu mà tôi thường thiết kế lại như thế này khi tôi đi cùng? Điều này có nghĩa là tôi là một lập trình viên nghèo hay điều này là bình thường?

Câu trả lời:


41

Đây là một phần bình thường của sự phát triển. Hai trong số các nguyên lý cốt lõi của Thiết kế liên tục là:

  1. Bạn không phải là người toàn diện, bạn không thể biết toàn bộ hệ thống từ đầu đến cuối trước khi bạn bắt đầu.
  2. Thiết kế không tĩnh. Điều này phổ biến hơn khi một dự án đã được sử dụng trong một thời gian dài và những vấn đề hiện đang giải quyết không phải là những vấn đề mà nó đã được giải quyết khi nó được viết lần đầu tiên.

Quan điểm cá nhân của tôi về vấn đề này là bạn nên có một ý tưởng tốt về thiết kế vĩ mô , nhưng cho phép thiết kế vi mô phát triển. Một cách khác để thể hiện nó là thiết kế cấp cao (theo như tôi đi với các công cụ mô hình hóa / UML) rất có thể sẽ vẫn khá tĩnh trong suốt vòng đời của một dự án. Thiết kế chi tiết về phương thức nào làm gì và hệ thống phân cấp lớp cần được tự do để có thể dễ uốn.

Khi bạn thực sự không biết nhiều về vấn đề bạn đang giải quyết, bạn sẽ thực hiện nhiều bước sai lầm ban đầu. Tuy nhiên, sau khi bạn đã làm việc với nó đủ lâu, thiết kế tổng thể sẽ bắt đầu ổn định và các cấu trúc lại mà bạn đang nói đến là tất cả những gì sẽ cần để giữ cho mã gọn gàng.


3
+1, đây là lý do tại sao tôi luôn co rúm người khi nói về việc tuần tự hóa các đối tượng vào cơ sở dữ liệu -> và nếu ngày mai lớp của bạn bị nổ tung ở nhiều phần, làm thế nào để bạn giải trừ mà không giữ mã cũ xung quanh? Tôi rất thích giải pháp thay thế Protobuf (các lớp dành riêng cho lưu trữ / trao đổi thông điệp) trong đó các lớp cốt lõi của bạn được tự do phát triển và bạn chỉ cần điều chỉnh lớp tuần tự hóa / giải tuần tự hóa.
Matthieu M.

@Matthieu - bạn viết di chuyển cơ sở dữ liệu. Điều này hiếm khi mất hơn một giờ để viết và kiểm tra. Ruby on Rails có một cơ sở rất đẹp để di chuyển cơ sở dữ liệu.
kevin cline

1
@kevin: chúng tôi không có cùng cơ sở dữ liệu như tôi đoán, của tôi chứa vài trăm triệu dòng. Di chuyển không phải là một lựa chọn.
Matthieu M.

+1 - quá tự hào / bướng bỉnh khi thừa nhận bạn đã phạm sai lầm không phải là một điều tốt. Một số người coi việc thừa nhận sai lầm của bạn là dấu hiệu của tuần, nhưng hầu hết có thể sẽ tôn trọng bạn vì điều đó, và chắc chắn nếu chiến lược đối phó với một sai lầm nghiêm trọng của bạn là phủ nhận rằng đó là một sai lầm, thì sai lầm thứ hai rất có thể gây tử vong.
Steve314

12

Những gì bạn đang làm được gọi phổ biến là "tái cấu trúc". Nếu bạn ngừng làm điều đó thì bạn sẽ gặp rắc rối.

Thực tế là hầu hết các mã rất phức tạp và con người, ngay cả những người khá thông minh, không thể tìm ra tất cả cùng một lúc.



5

Điều đó hoàn toàn tốt (trừ khi các thiết kế lại này luôn luôn đại tu lớn, hoặc xây dựng lại từ đầu). Đừng lo lắng. Có thể tốt khi bắt đầu với một sơ đồ UML khi bắt đầu dự án, nhưng đừng khắc nó vì bạn hầu như sẽ luôn phát hiện ra rằng mọi thứ thay đổi khi bạn làm việc. Bạn có thể học các kỹ thuật mới mà bạn chưa biết lúc đầu, bạn có thể muốn tìm hiểu một số tính năng theo cách mà bạn đã không mặc dù trong thiết kế ban đầu, các yêu cầu kinh doanh thay đổi, đôi khi có những ẩn số trong thiết kế ban đầu chỉ có thể được tính sau, v.v ...

Có gì quan trọng là để đi và cập nhật các văn bản UML ban đầu để họ phản ánh bất kỳ thay đổi đáng kể trong thiết kế, các nhà phát triển trong tương lai khác (bao gồm cả bản thân) có thể sẽ rất bối rối. Điều này có thể khó khăn, và thường đòi hỏi dendsline tốt (và thời gian).

Nó rất rất rất hiếm để bắt đầu với một thiết kế, và tuân thủ nó 100% cho đến khi thực hiện. Cá nhân tôi chưa bao giờ thấy một điều như vậy xảy ra, ngoại trừ các chương trình rất nhỏ và tầm thường.


6
Bước 1: Tạo sơ đồ UML. Bước 2: Viết mã. Bước 3: Vứt sơ đồ UML đi để không ai từng thấy nó và bối rối về cách mã thực sự hoạt động.
kubi

4

Những gì bạn đang làm là hoàn toàn bình thường (với điều kiện bạn không hoàn toàn bắt đầu lại từ đầu mỗi lần). Tôi đã ở đây hơn hai mươi năm và nó vẫn là một quá trình lặp đi lặp lại.

Lần duy nhất bạn sẽ có thể thiết kế mọi thứ ở phía trước và tuân thủ nó là nếu bạn đang giải quyết chính xác vấn đề mà bạn đã giải quyết lần trước, và thậm chí sau đó bạn có thể tìm thấy sự cải thiện.


2

Tôi không có nghĩa là một nhà phát triển có kinh nghiệm cao nhưng tôi cũng làm điều này. Trong vài năm qua, khả năng xây dựng kiến ​​trúc cần thiết của tôi đã được cải thiện rất nhiều. Tuy nhiên, khi tôi viết một phần mềm, cho dù tôi có lập kế hoạch bao nhiêu đi chăng nữa, luôn có những nơi cần thiết kế lại một chút. Các điểm mà tôi đã không nhận ra tôi đang lặp lại chính mình cho đến khi mã thực sự được viết.

Quan điểm của tôi về bài đăng này là nói rằng tôi làm mọi thứ trong danh sách của bạn và tôi không cảm thấy những điều đó nhất thiết là xấu trừ khi chúng xảy ra liên tục và có ảnh hưởng tiêu cực thực sự đến năng suất của bạn.


0

Điều đó được gọi là quá trình lặp và đó là một khái niệm cơ bản trong tất cả các kỹ thuật phát triển phần mềm hiện đạ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.