Chúng ta có nên tìm kiếm mã nói dối?


9

Điều này đề cập đến một cuộc thảo luận trong một câu trả lời và ý kiến ​​của câu hỏi này: Điều gì có ác cảm với tài liệu trong ngành? . Câu trả lời cho rằng "mã không thể nói dối" và do đó nên là vị trí đi đến thay vì tài liệu. Một số ý kiến ​​chỉ ra rằng "mã có thể nói dối". Có sự thật từ cả hai phía, ít nhất một phần là do cách xử lý tài liệu kém và không phù hợp.

Chúng ta có nên đề phòng mã dối trá, so sánh nó với bất kỳ tài liệu hiện có nào không? Hay nó thường là nguồn tốt nhất cho những gì nó cần phải làm? Nếu đó là mã nhanh, thì nó có ít khả năng nói dối hơn, hoặc mã đó có thể không nói dối chút nào không?


1
Bạn có thể vui lòng làm rõ những gì bạn có nghĩa là "nói dối"? Chúng ta không nên tham khảo ý kiến ​​trong một câu hỏi khác để có được bối cảnh của bạn.
dùng16764

@ user16764 Không cần nhìn vào chủ đề khác, điều đầu tiên xuất hiện trong tâm trí là Cuộc thi C
Underhanded

Nếu tài liệu nói rằng mã nên làm foo và mã có thanh, điều đó có nghĩa là thanh đó là những gì mã nên làm? Hoặc chúng ta giả định rằng thanh là hành động chính xác bởi vì chúng ta không bao giờ đọc tài liệu, bởi vì mã luôn luôn đúng?
thứ năm

Nếu mã đã được chấp nhận là thanh, thì tài liệu bị sai và lỗi thời. Nhưng nếu foo và bar có liên quan chặt chẽ với nhau và người dùng không nhận thấy rằng nó không giải quyết được vấn đề của họ như họ mong đợi, thì có lẽ tài liệu về foo không sai? Nói cách khác, mã có thực sự là tất cả và cuối cùng của những gì mã nên làm không?
thứ năm

Câu trả lời:


9

Theo cách nói của giáo dân:

, bạn nên tìm kiếm mã nói dối và làm cho nó nói sự thật. Nhưng không phải bằng cách so sánh nó với các tài liệu. Đó sẽ là một phương pháp để phát hiện tài liệu nói dối.

Có một số cách mã có thể nói dối, trong đó tôi sẽ chỉ đề cập đến một vài cách:

  • Các khối mã không bao giờ được chạy vì các điều kiện không bao giờ được đáp ứng. Các mã đang nói dối bạn về bao nhiêu nó làm.
  • Mã bổ sung sự phức tạp không cần thiết nằm ở mức độ phức tạp của vấn đề.
  • Mã không có quy ước đặt tên bởi vì nó đánh lừa bạn nghĩ rằng nó làm một cái gì đó khác với những gì nó thực sự làm.

Càng ngắn, nó càng ít nói dối. Đó là hiển nhiên.

Mã càng ít phức tạp thì càng minh bạch. Vì vậy, nó nằm ít hơn.

Thủ thuật cú pháp Arcane nói dối rất nhiều. Thích các thuật toán rõ ràng, từng bước. Họ nói dối ít hơn.

Một công cụ phân tích mã tĩnh tốt có thể giúp bạn tìm mã nằm.

Ngoài ra một pin kiểm tra tự động tốt buộc mã phải nói sự thật.


4
The shorter and terser the code is, the less it lies. It's self evident. Tôi hầu như không nói điều đó. Theo kinh nghiệm của tôi, mã càng ngắn và chặt hơn, càng có nhiều cơ hội để quét nằm dưới tấm thảm, nói chung bằng cách ẩn chúng trong các lệnh gọi hàm lừa đảo.
Mason Wheeler

@MasonWheeler Bạn nói đúng. Tôi đã chỉnh sửa phần "ngắn gọn".
Tulains Córdova

Tôi không bị thuyết phục bởi "Mã không có quy ước đặt tên". Nó chắc chắn là xấu, nhưng làm sao có thể nói dối nếu nó không nói gì với bạn? "Tôi không nói với bạn!" là cứng đầu cản trở và không thông tin nhưng không lừa dối. Chắc chắn "lời nói dối" là khi tồn tại một quy ước đặt tên, nhưng được sử dụng theo cách không khớp với những gì mã thực sự làm - ví dụ nếu bạn đang sử dụng tiếng Hungary (yuck!) Nhưng đôi khi có tiền tố pcho một biến không phải là một con trỏ
Steve314

2
Trên thực tế, những gì bạn đề xuất có thể được mô tả tốt hơn là "ngụy biện" thay vì chỉ đơn giản là "dối trá". Ngụy biện có xu hướng dài dòng và phức tạp chính xác đến nỗi khó nhìn thấy các lỗ hổng logic, và thông minh và tự tin đến mức khiến mọi người sợ hãi khi đặt câu hỏi trong trường hợp chúng trông thật ngu ngốc.
Steve314

Một ví dụ khác: Mã thay đổi các thuộc tính ngôn ngữ hoặc thời gian chạy cơ bản, ví dụ: xác định lại hoặc che dấu hành vi nguyên thủy.
JustinC

6

Mã không thể nói dối.

Những gì trong mã là những gì chương trình của bạn hiện đang làm - bất kể tài liệu, QA, hoặc khách hàng nói gì. Đặc biệt nếu mã của bạn đã được phát hành và ở trong lĩnh vực này trong một thời gian, hành vi dự kiến ​​đó không nên bị bỏ qua.

Mã chắc chắn có thể không chính xác . Nó chắc chắn có thể gây hiểu nhầm trong việc đặt tên hoặc tổ chức của nó. Nó chắc chắn có thể không thể đọc được.

Nhưng nếu bạn muốn nguồn sự thật cho những gì mã của bạn đang làm , không phải những gì nó phải làm, không phải những gì nó được thiết kế để làm, không phải những gì bạn nghĩ nó đang làm ... nếu bạn cần biết nó thực sự đang làm gì, đi đến mã


Có một trường phái cho rằng nếu bạn cố tình lừa dối nhưng đúng về mặt giáo dục, thì bạn không nói dối. Đó không phải là trường phái duy nhất. Ví dụ, tôi có một phiên bản cũ của Phát hiện những lời nói dối và lừa dối của Aldert Vrij . Một trong những điều đầu tiên này là xem xét các định nghĩa khác nhau về nói dối và lừa dối, lựa chọn đưa vào các tuyên bố sai lầm về mặt giáo dục nhưng cố tình một phần vì dù sao đó cũng là một cách hiểu phổ biến.
Steve314

Xin lỗi, nhưng nói "nhưng nó đúng về mặt giáo dục" không có nghĩa là bạn không thể được gọi là kẻ nói dối - ngay cả khi mọi người không tranh luận lại, họ vẫn biết điều đó.
Steve314

@ steve314 - pssh. Câu hỏi ban đầu là xung quanh ý kiến. Xây dựng một người rơm cho các kịch bản hiếm hoi này, nơi mã được đặt tên sai lệch để tranh luận ủng hộ bình luận (và bỏ qua kịch bản phổ biến xa của các bình luận đã lỗi thời) là vô lý.
Telastyn

1
Tôi đồng ý với điều đó - Tôi không tranh luận về điểm bạn đưa ra, chỉ có định nghĩa rõ ràng về "lời nói dối" bạn sử dụng trong khi thực hiện nó. Mã có thể nói dối - không phải cho trình biên dịch, nhưng chắc chắn cho độc giả của con người. Thậm chí, đó còn là một mục tiêu có chủ ý trong một số trường hợp - những thứ như cuộc thi C bị xáo trộn sẽ là một ví dụ tương đối lành tính. Ngụy biện, như tôi đề nghị trong bình luận của tôi cho người dùng61852. Chỉ vì một trình biên dịch nhìn xuyên qua lời nói dối không có nghĩa là nó không phải là lời nói dối.
Steve314

@Telastyn Tôi đoán bạn chưa bao giờ có bộ lọc thực hiện chuyển hướng gây ra một bước thực sự xảy ra trên khoảng trắng và sau đó đi vào mã không được gọi từ phương thức đó, không bao giờ quay lại, phải không? Chúa tôi ghét các nhà phát triển Java! @ # $ Làm với Java.
Erik Reppen

0

Bạn hỏi vài câu.

Chúng ta có nên đề phòng mã dối trá?

Tất nhiên!

Chúng ta có nên so sánh [mã] với bất kỳ tài liệu hiện có nào không?

Điều đó không bao giờ có thể làm tổn thương, mặc dù như được đề cập trong các câu trả lời khác, thường xuyên hơn là điều này sẽ dẫn bạn tìm thấy các vấn đề trong tài liệu , không phải trong .

Hay [code] thường là nguồn tốt nhất cho những gì nó cần phải làm?

Nó luôn là nguồn tốt nhất cho những gì nó đang làm. Nguồn tốt nhất cho những gì mã nên làm có thể là (sự kết hợp của) những thứ khác nhau, mặc dù, những thứ chính là:

  • Bản thân mã;
  • Mã gọi;
  • Nhận xét trong mã đó;
  • Tài liệu;
  • Bài kiểm tra đơn vị;
  • Kiểm tra tích hợp và hồi quy;
  • Lập trình viên;
  • Người dùng cuối cùng;

Nguồn "tốt nhất" (hoặc kết hợp của chúng) phụ thuộc vào tình huống của bạn.

Nếu đó là mã nhanh, thì nó có ít khả năng nói dối hơn, hoặc mã đó có thể không nói dối chút nào không?

Tôi không chắc ý của bạn về "mã nhanh", AFAIK "nhanh nhẹn" thường đề cập đến quá trình mã hóa. Giả sử bạn có nghĩa là "mã được tạo trong một quy trình lập trình nhanh" thì tôi nghĩ an toàn khi nói rằng nó vẫn có thể nói dối. Khả năng nói dối như thế nào, so với mã được tạo ra trong các dự án kiểu thác nước là vấn đề chủ quan (cá nhân tôi không nghĩ có mối liên hệ lớn).


Chú thích
Tất cả những điều trên nằm dưới giả định rằng mã có thể nói dối và đây là một ví dụ cơ bản (mặc dù có chút hạn chế):

public int DivideByTwo(int input) 
{
    return input / 3;
}

Đây chỉ là một ví dụ mà tôi nói "mã nằm", @ user61852 có một vài ví dụ khác (mã không thể truy cập, độ phức tạp của mã không khớp với độ phức tạp của vấn đề, đặt tên xấu) và tôi nghĩ còn nhiều điều nữa. Wikipedia có một bản tóm tắt khá hay về những lời nói dối , nhiều trong số chúng có thể được tìm thấy mã.

Lưu ý rằng nếu bạn đang tranh cãi với ai đó, hãy chắc chắn rằng người khác không có nghĩa là "mã không thể nói dối" rằng "mã làm những gì nó làm". Về bản chất, người khác ở đây đang định nghĩa bằng cách sử dụng định nghĩa cho "lời nói dối" hẹp đến mức có thể tuyên bố câu "mã không thể nói dối" là một tiên đề / sự thật cơ bản. Trong trường hợp này, có lẽ tốt nhất là đồng ý với tiên đề của anh ấy / cô ấy.


0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

Bạn có thể tranh luận về việc từ "nói dối" có phù hợp về mặt kỹ thuật hay không, nhưng mã này ngụ ý khá rõ ràng rằng x đôi khi sẽ lớn hơn 5 và đôi khi không. Nếu bạn xem toàn bộ chương trình và phát hiện ra rằng hàm này chỉ được gọi ở một nơi và x luôn được đặt thành hằng số 6, thì đó là một lời nói dối.

Hơn nữa, trình biên dịch có thể đã nhận thấy điều này và thay thế khối mã này bằng cách đơn giản

doSomething()

Nếu doADifferentThing không được gọi ở bất kỳ nơi nào khác trong chương trình của bạn, nó có thể bị xóa hoàn toàn khỏi chương trình.

Nếu ngôn ngữ của bạn hỗ trợ một assertloại nào đó, bị tắt trong các bản dựng sản xuất, thì mỗi assertcâu có khả năng là một lời nói dối. Một typecast là một khẳng định khác có thể là một lời nói dố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.