Có một chiến lược tốt hơn là dựa vào trình biên dịch để bắt lỗi?


8

Tôi đã lập trình trong C và C ++ một thời gian, mặc dù tôi sẽ nói rằng tôi không phải là một chuyên gia. Đôi khi, tôi đã sử dụng nhiều chiến lược khác nhau để phát triển mã của mình như kiểm tra đơn vị, thiết kế theo hướng kiểm tra, đánh giá mã, v.v.

Khi tôi viết các chương trình đầu tiên của mình bằng BASIC, tôi đã gõ các khối dài trước khi thấy chúng không chạy và chúng là một cơn ác mộng để gỡ lỗi. Vì vậy, tôi đã học cách viết một chút và sau đó kiểm tra nó.

Những ngày này, tôi thường thấy mình liên tục viết một đoạn mã nhỏ sau đó sử dụng trình biên dịch để tìm tất cả các lỗi. Điều đó ổn nếu nó phát ra một lỗi đánh máy nhưng khi bạn bắt đầu điều chỉnh các loại tham số, v.v. chỉ để làm cho nó biên dịch, bạn có thể làm hỏng thiết kế. Có vẻ như trình biên dịch đang len lỏi vào quá trình thiết kế khi nó chỉ nên được sử dụng để kiểm tra cú pháp.

Có một mối nguy hiểm ở đây là phụ thuộc quá nhiều vào trình biên dịch để làm cho các chương trình của tôi tốt hơn. Có chiến lược nào tốt hơn cái này không?

Tôi mơ hồ nhớ một thời gian trước đây một bài viết về một công ty phát triển một loại trình biên dịch C trong đó một tệp tiêu đề bổ sung cũng chỉ định các nguyên mẫu. Ý tưởng là sự không nhất quán trong định nghĩa API sẽ dễ nắm bắt hơn nếu bạn phải xác định hai lần theo các cách khác nhau.


Dựa vào lập trình viên để bắt lỗi ... thông qua phân tích, hiểu, kiểm tra và biên dịch.
Dietbuddha

Câu trả lời:


13

Đừng điều chỉnh mọi thứ để làm cho nó biên dịch. Điều chỉnh mọi thứ cho chính xác . Nếu nó được "thiết kế" sao cho các loại tham số không khớp, thì nhà thiết kế sẽ không biết họ đang làm gì.

Nếu bạn không muốn dựa vào trình biên dịch, thì hãy nâng cao kiến ​​thức về ngôn ngữ. Nghiên cứu cấu trúc của các định nghĩa và khai báo và kiểm tra những gì bạn viết cho các lỗi trước khi biên dịch. Và sử dụng đánh giá mã.

Đó là ý tưởng nguyên mẫu thêm âm thanh xấu. Nếu bạn thiết kế sai một lần, điều gì ngăn thiết kế thứ hai bị thiết kế sai? Và bằng cách sử dụng các định dạng / mô hình / vv khác nhau cho cùng một thứ, bạn có thể khiến mọi người nhầm lẫn. Tôi sẽ đảm bảo mọi người hiểu định dạng chính để bạn có thể tập trung vào việc thiết kế ngay lần đầu tiên, thay vì tăng gấp đôi công việc thiết kế để bắt lỗi. Giống như mọi thứ khác, các thiết kế nên được tái cấu trúc, nhưng tôi không nghĩ thực hiện hai lần để bắt đầu có ý nghĩa.


Tôi nghĩ rằng nhà thiết kế (tôi) đã không nhớ chính xác tham số cho chức năng khác, có lẽ vì tôi đang nghĩ về một phiên bản trước của thiết kế.
công án

Tệp tiêu đề thứ hai không được viết theo tiêu chuẩn C và tôi nghĩ rằng đó là dạng nguyên mẫu cấp cao hơn. Ý tưởng là nếu hai định nghĩa khác nhau của bạn xác định cùng một điều thì thiết kế của bạn có nhiều khả năng đúng. Đó không phải là hai tệp tiêu đề C tiêu chuẩn nhưng với "cách gõ" khác nhau.
công án

Nhưng đó là ở giai đoạn thực hiện, phải không? Dù bằng cách nào, hãy thay đổi nó để tuân theo thiết kế hoặc thay đổi thiết kế cho chính xác ... đừng chỉ làm cho trình biên dịch hài lòng;). Tôi sẽ cập nhật câu trả lời của tôi để phản ánh lời giải thích của bạn về các nguyên mẫu.
Matthew đọc

Tôi hiểu ý của bạn và tôi nghĩ đó là một câu trả lời hay nhưng ở giai đoạn nào bạn nói "Whoa, tôi cần dừng tất cả việc thực hiện và quay lại để thiết kế đúng", bởi vì "chỉ cần thay đổi thiết kế" cũng có thể được thực hiện nhanh chóng nhanh chóng, triệt để hoặc quá kỹ lưỡng ...
công án

Đó là một câu hỏi thực sự khó trả lời. Tôi nghĩ rằng đó là một cảm giác dựa trên kinh nghiệm hơn bất cứ điều gì khác, ngoại trừ khi bạn gặp phải "whoa, chúng tôi hoàn toàn hiểu sai vấn đề này, cần phải làm lại thiết kế".
Matthew Đọc

4

Thành thật mà nói, tôi tin rằng mục tiêu của bạn LUÔN LUÔN là viết một chương trình biên dịch lần đầu tiên. Tôi nhận ra rằng điều này là khó khăn và có thể sẽ không xảy ra thường xuyên, nhưng nó vẫn nên là mục tiêu của bạn. Hãy nghĩ về phần mềm như một phần cứng. Hãy tự tin rằng việc biên dịch lại mã của bạn một cách phi thực tế (như tái sản xuất bảng aa). Một trình biên dịch không phải là một trình sửa lỗi và nó không nên được xử lý như vậy.


+1 cho "trình biên dịch không phải là trình sửa lỗi"
Joris Meys

Hấp dẫn. Tôi luôn cảm thấy thoải mái hơn nhiều nếu tôi tìm thấy một lỗi vì chắc chắn chúng tồn tại trong mã của tôi, chỉ là tôi chưa tìm thấy chúng. Câu hỏi của tôi không phải là quá nhiều về gỡ lỗi mặc dù; Tôi đang tìm kiếm các chiến lược để thiết kế hoặc viết mã hiệu quả hơn trong việc tạo ra mã tốt. Ví dụ, nếu trình biên dịch của bạn cung cấp nhiều hơn X thông báo lỗi không tầm thường, bạn nên dừng và suy nghĩ lại về thiết kế; hoặc một cái gì đó.
công án

Tôi nghĩ rằng đặt cược tốt nhất của bạn về việc học cách viết mã tốt là đọc một cuốn sách về. Tôi đề nghị Mã hoàn thành. Đó là cuốn sách hay nhất mà cá nhân tôi đã đọc về phần mềm nói chung.
Pemdas

Tôi cảm thấy bạn đang cố gắng vô hiệu hóa vấn đề bằng cách không có nó ở nơi đầu tiên. Điều đó không có gì xấu, nhưng cuối cùng sẽ có những vấn đề nảy sinh trong quá trình biên dịch, rốt cuộc không có ai là hoàn hảo cả.
công án

1
Mặc dù trình biên dịch không phải là trình gỡ lỗi - một trong những cách ưa thích của tôi để thực hiện các phép tái cấu trúc nhất định là làm cho nó sao cho mã cũ sẽ không biên dịch được (bằng cách đổi tên có lẽ). Làm cho nó dễ dàng để tìm thấy những thứ đã bị bỏ lỡ.
sdg

3

Trình biên dịch không thể tìm thấy tất cả các lỗi nên không có lý do gì để giả vờ. Tất cả những gì nó có thể tìm thấy là các lỗi cú pháp và lỗi chính tả. Nó đủ tốt để tôi cho phép nó thực hiện một phần công việc đó (mặc dù ngày nay môi trường bắt 99% chính nó trước khi bạn biên dịch) nhưng tôi hoàn toàn biết rằng đó không phải là tất cả các lỗi.

Lần duy nhất tôi dựa vào loại thông tin đó để cho tôi biết nên viết gì là khi tôi nhận được những thứ như nó nói với tôi rằng nó không thể tự động chuyển đổi thành một số nổi - nếu bạn gửi dữ liệu sẽ trôi nổi (và kể từ đó những gì tôi hiện đang làm là chơi với thư viện XNA thực hiện chính xác điều này) và nguồn trả về gấp đôi (như trường hợp của thư viện toán học C #) thì bạn chỉ cần chuyển đổi.


1

Trình biên dịch là một công cụ. Như với tất cả các công cụ, chúng có thể bị lạm dụng.

Khi bạn lần đầu tiên bắt đầu với một ngôn ngữ, không có gì sai khi sử dụng trình biên dịch một cách mù quáng để kiểm tra chương trình của bạn. Đó vốn dĩ là cách học tập, đoán và kiểm tra. Tuy nhiên, điều đó không có nghĩa là bạn nên tiếp tục viết mã như vậy.

Bạn nên hiểu ngôn ngữ đủ tốt để bạn có thể biên dịch chương trình của mình trong đầu. Sau đó, bạn sẽ mất ít thời gian hơn để chờ trình biên dịch kết thúc.

Tôi nói có lẽ tốt nhất là chương trình luôn nằm trong một vài dòng / khối mã có thể biên dịch được.


0

Hầu hết các IDE hiện đại đều nắm bắt được rất nhiều vấn đề về trình biên dịch và tôi đoán tôi cũng đã trở nên khá phụ thuộc vào vấn đề này.

Có thể di chuyển trở lại tập tin văn bản và trình biên dịch dòng lệnh?


Tôi không sử dụng IDE! Có lẽ tôi nên bắt đầu? Tôi đã luôn nghĩ rằng tôi nên nhưng không bao giờ tìm thấy một người mà tôi hài lòng.
công án
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.