2010-11-21 22 views
6

Câu hỏi này đến phiền sau khi nhìn thấy mảnh này mã đơn giản: (? K & R)Các phím tắt, ngắn gọn và thông minh có bị bỏ qua thường xuyên theo hướng rõ ràng không?

if (!x%y) 
{ 
    // do something 
} 

Có thể đó là sự ảnh hưởng của cuốn sách C sớm, nhưng không phải là sau luôn ưa thích, nếu không muốn nói là dễ thương ?

if (x%y != 0) 
{ 
    // do something 
} 
+3

Tuyệt đối, chỉ cần cẩn thận bạn có được quyền logic, vì ví dụ đầu tiên của bạn không tương đương với ví dụ thứ hai của bạn. –

+1

yeah, hãy chú ý theo thứ tự hoạt động. –

+0

Nó làm cho không có sự khác biệt cho trình biên dịch và mã được tạo ra sẽ hoàn toàn giống hệt nhau. Vì vậy, bạn nên viết nguồn của bạn để rõ ràng với con người nhất có thể. –

Trả lời

7

This quote trả lời câu hỏi của bạn.

"Gỡ lỗi là chăm chỉ gấp đôi như viết mã ở nơi đầu tiên. Do đó, nếu bạn viết mã như khéo léo càng tốt, bạn đang có, bởi định nghĩa, không đủ thông minh để gỡ lỗi nó . " - Brian W. Kernighan

+0

Không, không. OP không nói về mã hóa "khéo léo nhất có thể", thay vào đó, anh ta nói về trường hợp cụ thể này của việc sử dụng '!' So với '! = 0'. (Ngoài ra, nó sẽ là quá khó khăn để thực sự đặt báo ở đây?) –

+0

Tôi nghĩ (do tiêu đề) rằng OP nói về sự thông minh và ngắn gọn nói chung, và sử dụng biểu thức modulo làm ví dụ. –

+0

@Billy - Tôi nghĩ vậy. Đọc chính câu hỏi, rõ ràng là anh ấy đang nói về việc thông minh nói chung. Phần thân của bài viết chỉ là một ví dụ cụ thể. Mặc dù tôi đồng ý rằng anh ta chỉ nên đặt báo giá ở đây, cố định. –

2

Ưu tiên rõ ràng hơn ngắn gọn. Ví dụ thứ hai x % y != 0 rõ ràng hơn.

Tất nhiên, những gì cấu thành rõ ràng là hơi chủ quan, nhưng tôi muốn đặt trước toán tử ! đơn nhất cho các biến boolean hoặc hàm trả về boolean.

Cách tôi thường cố gắng đánh giá độ rõ ràng khi viết mã là tự hỏi mình: liệu tôi có thể dễ dàng đọc và hiểu dòng này nếu 1) người khác viết hay 2) Tôi đã đọc lại 2 năm xuống dòng.

2

Thông minh nên được bỏ qua. Nó không phải là thông minh ... hoặc quan trọng hơn là duy trì được.

Phím tắt và ngắn gọn có thể hoặc không thể chấp nhận được: tất cả chúng ta đều có lối tắt nhưng gần như có phím tắt "tiêu chuẩn công nghiệp" vì tất cả chúng ta đều làm điều đó. Không có phím tắt thông minh nào mặc dù

5

Bạn có chắc chắn về mã đó không? !x%y có nghĩa là (!x)%y! liên kết chặt chẽ hơn %.

(Vì lý do đó một mình, tôi sẽ thích x % y != 0.)

1

Độ rõ ràng sẽ vượt qua ngắn gọn mỗi ngày theo ý kiến ​​của tôi. Đôi khi tôi cảm thấy rằng mã viết như:

if(!(x = func(y)) && ++z == x) 

... tương đương với các sọc đi nhanh hơn trên xe hơi. Nó có thể cảm thấy nhanh chóng, nhưng nó không phải là. Tôi cũng không nghĩ rằng việc sử dụng các tên biến không thể hiểu được (chẳng hạn như trong ví dụ trên) để tiết kiệm khi gõ là một ý tưởng hay.

là gì tốt hơn ở đây:

for(int x(0) x < managers.size(); ++x) 
    managers[x]->initialise(); 

hay:

for(int mgr(0); mgr < managers.size(); ++mgr) 
    managers[mgr]->initialise(); 

Cả hai đều thực hiện được điều tương tự và người ta có thể tranh luận rằng không có điểm làm mgr rõ ràng hơn (thậm chí còn có lý lẽ khác để nói mgr phải là rõ ràng hơn :)).Nhưng nếu từng phần này của thói quen trở nên phức tạp hơn, nó có thể là rất quan trọng:

for(int mgr(0); mgr < managers.size(); ++mgr) 
{ 
    for(int dependentMgr(0); dependentMgr < managers[mgr].dependents().size(); ++dependentMgr) 
    { 
     // init these first 
    } 
} 

Rõ ràng, đây không phải là một cuộc thảo luận về việc có nên sử dụng vòng lặp hay không, chỉ đơn thuần là cho dù chúng ta nên sử dụng tên rõ ràng hay không.

Khi tôi nhìn vào một đoạn mã mà tôi chưa từng thấy trước đây, tên biến là tất cả. Tôi co rúm khi tôi thấy tmptempt2vec2. Họ có nghĩa là không có gì.

Nghiêm túc người, nếu bạn đang lo lắng về số tiền bạn đang gõ, có một IDE với autocomplete hoặc đi nuôi gà ở Fiji :)

+1

1 sọc đi nhanh hơn. Nhắc tôi về "lỗ tốc độ" của Simpsons khi Homer bị bắn. – Konerak

1

Trên thực tế, nếu bạn muốn mã của bạn để được tự chủ tài liệu (Martin Fowler Style), bạn có thể sử dụng tiết hơn:

every_player_gets_equal_points = x%y; 
if (!every_player_gets_equal_points) { //Some players get more: now base on completion time 
0

mã đầu tiên đoạn mã bạn hiện tại, ...

if (!x%y) 
{ 
    // do something 
} 

... là vô nghĩa và do đó rất có thể không chính xác, kể từ !x%y tương đương với !x ngoại trừ các trường hợp y bằng -1, 0 hoặc 1 và trong trường hợp y bằng 0 trường hợp Hành vi không xác định (tức là, %y thường là vô nghĩa).

Những người khác đã nhận xét rằng đoạn đầu tiên không tương đương với đoạn trích dài thứ hai. Nhưng sau đó người ta có thể tự hỏi đoạn trích nào thể hiện ý định. Quan điểm của tôi là đoạn đầu tiên không tương đương với bất kỳ thứ gì có khả năng đúng.

Và vì vậy điều này minh họa độc đáo rằng sự rõ ràng là một ý tưởng hay.

Cheers & hth,

5

Trước hết, đạo cụ để mọi người nhận thấy rằng (!x%y) không tương đương với (!(x%y)), nhưng quan trọng hơn, cả hai đều không tương đương với:.

if (x % y != 0) 

trong đó có một nhiều hình thức đẹp hơn:

if (x % y) 

Cá nhân tôi cố gắng không viết ==0 khi nó c được thay thế bằng cách sử dụng ! mà không giới thiệu quá nhiều dấu ngoặc đơn, và tôi tuyệt đối không bao giờ sử dụng !=0, nhưng đây là một cuộc thảo luận sẽ bắt đầu flamewars. :-)

+3

Điều này. Số không là sai, tất cả mọi thứ khác ngữ nghĩa thực sự là * sâu * nhúng trong ngôn ngữ có nguồn gốc c và * là * cực kỳ rõ ràng, nhưng mất '!' Của phân tích cú pháp. – dmckee

+0

Đôi khi tôi sử dụng "!!" như một toán tử giả để chuyển đổi khác 0 và 0 thành các giá trị 1 và 0, tương ứng. Tôi sử dụng "!!" đôi khi ở những nơi không cần thiết, để nhấn mạnh rằng biểu thức bằng số có thể trả lại giá trị khác 0 hoặc 1, nhưng giá trị khác 0 sẽ được ánh xạ tới 1. Tôi cũng sử dụng nó khi ví dụ: Tôi muốn một hàm trả về một 'int' để trả về khác 0 nếu giá trị kiểu 'long' không khác (không có "!!", "int" có thể trả về số không ngay cả khi giá trị dài không khác ; trên thực tế, nếu kiểu trả về được ký, nó thậm chí có thể kích hoạt các mũi quỷ). – supercat

+0

@supercat: Vâng, tôi cũng vậy. Những người đang hạnh phúc không hỗ trợ các trình biên dịch trước C99 có thể chỉ viết '(bool) '. –

Các vấn đề liên quan