Làm thế nào để hình dung thiết kế của một động cơ vật lý?


17

Tôi đang chế tạo một động cơ vật lý và nó trở nên khá khó để theo dõi toàn bộ. Thông thường khi tôi lấy lại mã của mình sau giờ nghỉ, tôi không nhớ tại sao nó không hoạt động. Hầu hết các vấn đề không phải là lỗi lập trình đơn giản mà là lỗi thiết kế trong công cụ vật lý của tôi. Đó là lý do tại sao tôi nên hoàn thành thiết kế trước khi lập trình.

Tuy nhiên, tôi cần một cách để viết trên giấy toàn bộ thiết kế của động cơ vật lý của tôi. Khác, tôi sẽ quên nó vào ngày mai và lại bị mất. Một sơ đồ lớp UML hoàn toàn không phù hợp cho việc thiết kế động cơ vật lý. Tôi không thực sự quan tâm đến các lớp học nhưng quá trình. Tôi không thấy sơ đồ quy trình nghiệp vụ là thực sự hữu ích vì việc mô hình hóa một bước (khung) trong quy trình của tôi sẽ không giúp tôi hiểu hành vi cuối cùng của công cụ của mình trên nhiều bước.

Vì vậy, loại sơ đồ nào tôi nên sử dụng để giúp tôi theo dõi quá trình? Những loại sơ đồ chuyên nghiệp sử dụng để làm cho một động cơ vật lý?


4
Đầu tiên, tôi sẽ đề xuất một sơ đồ dòng cấp cao, để cho thấy cách thức động cơ được sử dụng và cách nó đánh giá mọi thứ. Hoặc có thể một cái gì đó tương tự như sơ đồ đường ống OpenGL ( openglinsights.com/pipeline.html ). Sau đó, tôi sẽ thực hiện tìm kiếm Google Images cho "sơ đồ động cơ vật lý" để xem người khác làm như thế nào! ;)
Thất

4
Theo "sơ đồ UML", bạn có thể có nghĩa là một sơ đồ lớp? Sơ đồ lớp là một trong 7 sơ đồ cấu trúc trong UML. Ngoài ra còn có 7 loại sơ đồ hành vi.
ĐẾN TỪ

Trước hết, bạn phải có một sự hiểu biết rất tốt về động cơ vật lý; từng chi tiết nhỏ và cách mọi thứ làm việc cùng nhau. Không có gì để làm với lập trình. Sau đó, bạn cố gắng mô hình hóa nó trong các thực thể lập trình (các lớp) và các tương tác. Bạn có thể sử dụng bất kỳ công cụ nào bạn thích (thậm chí là bản phác thảo và ghi chú viết tay). Sau đó, bạn tạo cho bạn các lớp một lần. Bắt đầu bằng cách viết một ứng dụng giao diện điều khiển. Bạn có thể sử dụng các bài kiểm tra đơn vị / lớp để đảm bảo rằng các lớp nhỏ của bạn hoạt động và làm những gì bạn mong đợi
John Kouraklis

6
Theo kinh nghiệm của tôi, các lập trình viên chuyên nghiệp không sử dụng tài liệu thiết kế hoặc sơ đồ để thiết kế mọi thứ. Có lẽ trên một bảng trắng. Với các ngôn ngữ lập trình đương đại, các thiết kế nằm trong đầu và trong mã. Tài liệu thiết kế hoặc sơ đồ thường được sử dụng để liên lạc. Dựa trên mô tả của bạn, tôi đoán là thiết kế của bạn cần được phân tách.
JimmyJames

1
"Một sơ đồ lớp UML hoàn toàn không phù hợp với thiết kế của một công cụ vật lý." Tại sao không? Các lớp học là tất cả về tách mối quan tâm. Bất kỳ hệ thống nào cũng có thể được chia thành các thành phần có vai trò riêng biệt và những thành phần đó thường có thể được tạo thành các lớp.
Tanner Swett

Câu trả lời:


29

Danh sách TO DO là những điều tuyệt vời.

Tôi không nói về // #TODO: blah blah bình luận. Tôi có nghĩa là có được một trung thực với máy tính xách tay của Thiên Chúa.

Bạn không bao giờ biết khi nào bạn sẽ nhớ một việc quan trọng cần làm. Một cuốn sổ sẽ lặng lẽ ngồi đó và để bạn suy nghĩ mà không phàn nàn về cách viết tay của bạn sẽ không được biên dịch. Một số ý tưởng hay nhất của tôi xảy ra trong phòng tắm (vâng tôi sở hữu một cuốn sổ tay chống nước nhưng bạn không cần phải đi quá xa).

Bạn có thể lấy những cái có kích thước bỏ túi được may (không dán) để chúng không bị rơi ra trong túi của bạn. Không quản lý để có được một cái ưa thích với một dấu sách được xây dựng? Băng, kéo, ruy băng và sẽ không ai biết.

Khi một ý tưởng đạt được chỉ cần ghi lại nó. Vẽ các ô nhỏ bên cạnh mỗi ý tưởng và bạn có thể dễ dàng đánh dấu nó là xong. Đặt một hộp ở đầu trang và bạn biết khi nào trang được hoàn thành.

Truy cập tuần tự nào không đủ tốt cho bạn? Vâng, họ làm cho chất kết dính túi là tốt. Tất cả điều này có vẻ như hơi nhiều nhưng tốt hơn là đắm chìm trong bài đăng ghi chú hoặc cố gắng nắm bắt mọi thứ trong Jira.

Đừng để những thứ được thực hiện một nửa

Giữ những cải tiến của bạn nhỏ và có thể đạt được. Đừng bắt đầu bất cứ điều gì không thể kết thúc trong một lần ngồi. Nếu nó lớn cho điều đó thì hãy chia nó thành các bước nhỏ hơn. Luôn để lại mã biên dịch và vượt qua các bài kiểm tra của nó. Oh và đừng bỏ qua các bài kiểm tra mà bạn chưa từng thấy thất bại. Làm một bài kiểm tra cả vượt qua và thất bại là cách bạn kiểm tra bài kiểm tra.

Ngừng suy nghĩ bạn cần toàn bộ thiết kế trên giấy

Những gì bạn cần làm là nắm bắt kế hoạch phát triển của bạn. Bạn không biết mọi thứ sẽ diễn ra như thế nào khi bạn hoàn thành nên hãy ngừng giả vờ. Nắm bắt những gì bạn đã tìm ra cũng như bạn có thể. Sử dụng khăn ăn và bút màu nếu bạn phải. Ít người hiểu 90% UML. Sử dụng bất cứ cách nào bạn có thể để hiển thị những gì bạn cần thể hiện. Tôi tập trung vào việc hiển thị các giao diện của tôi và những gì biết về những gì.

Viết ghi chú khi bạn ngừng mã hóa

Khoảnh khắc bạn rút ngón tay ra khỏi phím là lần cuối cùng bạn sẽ hiểu những gì bạn đã làm (và những gì bạn đã lên kế hoạch) cũng như bạn làm bây giờ. Nắm bắt sự hiểu biết đó tốt nhất bạn có thể trong một số ghi chú. Nếu tất cả những gì bạn có là những bình luận thì bạn vẫn bị trói vào máy tính và có khả năng để lại một vũng nước trên ghế. Một lần nữa, có một cuốn sổ tay là một điều tuyệt vời.

Bằng cách này, bạn có thể hạ cánh não một cách duyên dáng, cứu bàng quang và cất cánh lại sau đó mà không cần dùng đến caffeine và nghiến răng.


. hình ảnh, thật tuyệt trong khi suy nghĩ.)
9000

6
+1 cho Don't start anything that can't be finished in one sitting. If it's to big for that then break it down into smaller steps.. Đó là một trong những điều quan trọng nhất tôi học được trong ngành công nghiệp.
Akshat Mahajan

8

"Mọi thứ nên được xây dựng từ trên xuống, ngoại trừ lần đầu tiên", họ nói.

Tôi bắt đầu từ cấp độ thấp nhất (ví dụ toán học vectơ cơ bản) và đảm bảo rằng tôi hiểu rõ về nó và nó có phạm vi kiểm tra tốt. Sau đó, tôi sẽ xây dựng thêm một lớp trên đó, cho phép thực hiện các hoạt động trừu tượng hơn (ví dụ: nhóm / thực thể, phát hiện va chạm, cơ học va chạm). Một lần nữa, tôi sẽ bao gồm nó bằng các bài kiểm tra; nó sẽ giúp tôi suy nghĩ về các trường hợp sử dụng thực sự của những trừu tượng này trong động cơ.

Trừ khi bạn có hiểu biết rất rõ về toàn bộ động cơ (ví dụ: khi bạn triển khai lại một công cụ hiện có nổi tiếng), thì thường là tốt để có các lớp này; nó cho phép bạn suy nghĩ về một lớp cụ thể theo các lớp trước đó và thường không sâu hơn nhiều. Bạn có thể thử nghiệm và xây dựng một lớp với các tóm tắt hữu ích mới; những gì chứng tỏ là thực tế trong thực tế thường đi lệch khỏi những ý tưởng ban đầu.

Hy vọng rằng mỗi lớp đủ nhỏ để bạn không cần một sơ đồ phức tạp cho nó, hoặc nó dễ dàng đưa ra một sơ đồ hữu ích.

Tôi chưa bao giờ gặp phải một sơ đồ mã phức tạp hữu ích. Biểu đồ tương tácvòng đời là hữu ích, mặc dù. Thông thường, một sơ đồ như thế bị giới hạn trong 1-2 lớp, và do đó rất đơn giản.

Những gì tôi thường thấy có giá trị nhất là mô tả giao diện và đảm bảo được cung cấp bởi mỗi cấp. Ví dụ, định dạng của toán học vectơ và những gì xảy ra với các lỗi số; định dạng của các mô tả đối tượng lớn hơn (luôn luôn lồi? luôn luôn theo chiều kim đồng hồ?, làm thế nào để giao nhau? v.v.), các tham số cơ học của sự tương tác (làm thế nào tiến bộ? khối lượng được xử lý như thế nào? Động lượng luôn được bảo toàn? tương tác thích hợp (làm thế nào để xử lý ma sát? biến dạng? phân mảnh? là biến năng lượng cơ học thành tổn thất nhiệt một điều?).

Mỗi lớp phải đủ nhỏ để có một lượng có thể quan sát được những thứ nó giới thiệu và đảm bảo nó cung cấp. Mô tả này thậm chí có thể được soạn thảo mà không có bất kỳ mã thực hiện nào được viết (chưa). Điều này làm giảm cơ hội xác định rằng bạn đã làm điều gì đó cực kỳ sai lầm sâu ba lớp; nếu bạn đã làm, nó sẽ hiển thị ở nhiều nhất là hai lớp sâu.


Tôi thích việc xây dựng mã từ dưới lên, làm cho các lớp ngày càng trở nên biểu cảm hơn cho vấn đề của bạn. Nhưng đừng nghĩ rằng bạn sẽ có được chúng ngay lần đầu tiên. Khi bạn bắt đầu sử dụng một lớp để triển khai công cụ cao hơn, bạn sẽ thấy các vấn đề với API của mình và sẽ phải quay lại và thay đổi nó. Không sao đâu
Jowersalt

4

Lập sơ đồ kiến ​​trúc! Các sơ đồ đường ống OpenGL FrustratedWithFormsDesigner được đăng trong các bình luận là một ví dụ tuyệt vời cho dòng chương trình , nhưng đó chỉ là một loại sơ đồ có thể hữu ích.

Khi thiết kế sơ đồ, bạn muốn làm cho việc hiểu mã đơn giản và trực quan; điều này có thể bao gồm cả các khái niệm cấp cao (như dòng nút trên cùng trong sơ đồ đường ống OpenGL, nói điều gì đó) hoặc các chi tiết kỹ thuật rất chi tiết (như biểu đồ gọi hàm đầy đủ).

Lý tưởng nhất, tài liệu của bạn cũng nên làm cho mã dễ hiểu cho người khác; điều này có thể làm cho những thứ như đánh giá mã hoặc cộng tác nguồn mở trở nên dễ dàng. Hãy tìm đến các dự án lớn để xem cách họ thực hiện điều này - khi làm việc với hàng trăm nghìn hoặc hàng triệu dòng mã, hiểu cách chương trình hoạt động mà không cần phải đọc nó là rất quan trọng để theo dõi codebase hoặc giới thiệu nó với người khác . Kho lưu trữ Vim, với 1,3 triệu LỘC, có tài liệu cấp cao (IMO) khá tuyệt vời cho điều này trong /src/README.txt . Nó giới thiệu:

  • Mã nào trong mỗi tệp
  • Các biến toàn cầu quan trọng và giá trị của chúng
  • Điều gì xảy ra trong vòng lặp chính và chức năng mà nó gọi là gì
  • Điều gì xảy ra trong mỗi chế độ và các chức năng chính xử lý chúng
  • Các tính năng gỡ lỗi riêng là gì

Nếu tôi muốn đóng góp một bản vá, tôi thường biết tôi cần sửa đổi tập tin nào để hoàn thành mục tiêu của mình mà không cần đào nhiều.

Một trong những tính năng tốt nhất về Vim /src/README.txtlà cách dễ dàng tìm thấy và mức độ toàn diện của nó; Nó không phải là chi tiết theo bất kỳ ý nghĩa nào, nhưng nếu bạn nhấp vào srcthư mục trên Github, nó sẽ tự động tải và nó đưa ra hướng tìm kiếm mã hoặc tài liệu khác. Ngược lại với repo Powershell, ví dụ mà tôi đã tìm kiếm nhưng không thể tìm thấy bất kỳ tệp hoặc tệp tương đương nào với Vim's /src/README.txt. (Một dấu hiệu xấu cho một dự án với 988 nghìn LỘC!)

Một số điều bạn có thể muốn lập sơ đồ hoặc tài liệu bao gồm:

  • Luồng chương trình khái niệm (Chương trình hoàn thành cái gì và theo thứ tự nào?)
  • Biểu đồ cuộc gọi hàm / luồng chương trình đã thực hiện (Chương trình thực hiện mục tiêu của nó như thế nào? Hàm nào được gọi hoặc lớp được tạo?)
  • Mã nào trong tập tin nào? Sơ đồ tổ chức là gì và bạn có những quy tắc nào để xác định chức năng mới đi đâu? Nếu bạn có một sơ đồ tổ chức mạnh mẽ, việc biết tập tin nào cần tìm một chức năng hoặc lớp nhất định sẽ dễ dàng, ngay cả khi không có tính năng IDE hoặc IDE giống như IDE tìm thấy tính năng trên toàn dự án.
  • Liên quan, tập tin nào bao gồm tập tin nào khác (liên quan đến biểu đồ gọi hàm)?
  • Những lớp nào kế thừa từ các lớp khác? Mục đích của mỗi lớp là gì?

Làm thế nào bạn có thể làm cho những sơ đồ? Ở cấp độ của bạn, và đối với bản nháp đầu tiên, bút chì và giấy có lẽ là phương pháp tốt nhất / nhanh nhất. Khi sơ đồ và tài liệu trở nên tinh tế hơn, bạn có thể xem xét:

  • Dot / Graphviz, một bộ chương trình để tạo đồ thị từ .dotcác tệp.
  • LaTeX / TikZ, một công cụ rất phức tạp và dài dòng để tạo đồ thị hoặc hình ảnh thuộc bất kỳ loại nào - nó có thể quá nặng cho nhu cầu của bạn, đặc biệt là vì tất cả các định vị nút đều là thủ công, nhưng nên ghi nhớ, đặc biệt nếu bạn dự định viết một giấy hoặc bất cứ thứ gì thuộc loại đó sau này
  • Đối với C, gson's egyptmóc vào gccvà đưa ra .dotbiểu đồ cuộc gọi. Có thể được tự động hoặc nhúng trong một makelệnh, đó là tốt đẹp!
  • Liên quan, GNU cflowcó thể tạo các biểu đồ cuộc gọi chỉ văn bản cho C. Các công cụ tương đương có thể tồn tại cho các ngôn ngữ khác, mặc dù bạn có thể muốn đi lạc khỏi các công cụ tự động nói chung - không tạo biểu đồ theo cách thủ công có thể cản trở sự hiểu biết về mã của bạn hoặc cung cấp không phù hợp mức độ chi tiết phức tạp (biết chức năng gọi nào printf()thường không hữu ích).

Tôi thực sự lo lắng về việc có tài liệu tốt nhưng hiện tại, tôi đã ngừng làm tài liệu vì mã của tôi liên tục thay đổi để đặt các thuật toán mới và cố gắng làm một cái gì đó. Ví dụ, trong mã phát hiện phát hiện va chạm liên tục, tôi đã chuyển đổi nhiều lần từ việc lưu trữ các vị trí trước đó trong các lớp Body sang tính toán vị trí trước đó từ chuyển động của Cơ thể. Sự thiếu chuyên nghiệp này là do tôi thiết kế mọi thứ trong khi lập trình bởi vì khi tôi thiết kế một cái gì đó trong động cơ vật lý của mình, tôi muốn kiểm tra xem nó có thực sự khả thi hay không.
Mùa đông

Tôi đoán tôi nên xem xét dự án này và sau đó viết lại từ đầu với nguyên mẫu tôi đã tạo nhưng tôi đã nỗ lực rất nhiều để làm cho nó đủ sạch để giữ cho nó mà không phải viết lại mọi thứ.
Mùa đông

0

Hãy thử sử dụng sơ đồ dựa trên Petri Nets. Có thể dịch sơ đồ sang các chương trình máy tính một cách có hệ thống và có thể tích hợp các sơ đồ cấp cao với các sơ đồ cấp thấp.

Người giới thiệu

Các yếu tố và chú thích ròng: Một ngôn ngữ lập trình trực quan có mục đích chung (2016). Có sẵn tại https://www.academia.edu/31341292/Net_Elements_and_Annotations_A_General-Purpose_Visual_Programming_L Language .

Các yếu tố và chú thích ròng cho lập trình máy tính: Tính toán và tương tác trong PDF (2014). Có sẵn tại https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interilities_in_PDF .

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.