2009-07-21 26 views
6

Code Complete nói rằng thực hành tốt là luôn sử dụng số sử dụng số nhận dạng khối, cả cho rõ ràng và như một biện pháp phòng thủ.Tôi có nên sử dụng số nhận dạng khối ("kết thúc;") trong mã của mình không?

Vì đọc cuốn sách đó, tôi đã làm điều đó một cách tôn giáo. Đôi khi nó có vẻ quá mức mặc dù, như trong trường hợp dưới đây.

Steve McConnell có quyền khăng khăng luôn sử dụng mã định danh khối không? Bạn sẽ sử dụng cái nào trong số này?

//naughty and brief 
with myGrid do 
    for currRow := FixedRows to RowCount - 1 do 
    if RowChanged(currRow) then 
     if not(RecordExists(currRow)) then 
     InsertNewRecord(currRow) 
     else 
     UpdateExistingRecord(currRow); 

//well behaved and verbose 
with myGrid do begin 
    for currRow := FixedRows to RowCount - 1 do begin 
    if RowChanged(currRow) then begin 
     if not(RecordExists(currRow)) then begin 
     InsertNewRecord(currRow); 
     end //if it didn't exist, so insert it 
     else begin 
     UpdateExistingRecord(currRow); 
     end; //else it existed, so update it 
    end; //if any change 
    end; //for each row in the grid 
end; //with myGrid 
+12

Hoàn thành mã cũng có thể đề xuất tiêu đề chính xác hơn cho câu hỏi này. – Smandoli

+3

Cố định tiêu đề cho OP. –

+4

My * God *, ngôn ngữ nào _is_? –

Trả lời

7

Cá nhân, tôi thích cái đầu tiên, như IMHO là "kết thúc"; đừng nói với tôi nhiều, và một khi mọi thứ đã gần, tôi có thể biết bằng cách xác định những gì xảy ra khi nào.

Tôi tin rằng các khối hữu ích hơn khi có các câu lệnh lớn. Bạn có thể thực hiện một cách tiếp cận hỗn hợp, nơi bạn chèn một vài "bắt đầu ... kết thúc;" và nhận xét những gì họ đang kết thúc (ví dụ sử dụng nó cho với và đầu tiên nếu).

IMHO bạn cũng có thể phá vỡ này vào phương pháp hơn, ví dụ, phần

if not(RecordExists(currRow)) then begin 
    InsertNewRecord(currRow); 
    end //if it didn't exist, so insert it 
    else begin 
    UpdateExistingRecord(currRow); 
    end; //else it existed, so update it 

có thể là trong một phương pháp riêng biệt.

+0

Chà, bằng cách sử dụng kiểu mã hóa egyptian (khối mở và đóng "tuyên bố" không có cùng một thụt đầu dòng) có thể thực sự khó hiểu. Có, tôi đang "nói" về dòng "" bắt đầu "" thực sự có thể sử dụng ngắt dòng giữa hai từ khóa. – mg30rg

10

Tôi đã luôn luôn theo sau 'well-behaved và tiết' phong cách, ngoại trừ những ý kiến ​​thêm không cần thiết tại các khối kết thúc. Bằng cách nào đó nó có ý nghĩa hơn để có thể nhìn vào mã và làm cho tinh thần ra khỏi nó nhanh hơn, hơn là phải dành ít nhất vài giây trước khi giải mã mà khối kết thúc ở đâu.

Mẹo: Visual studio KB shortcut cho C# nhảy bắt đầu và kết thúc: Ctrl +]

Nếu bạn sử dụng Visual Studio, sau đó có dấu ngoặc nhọn cho C# ở đầu và cuối của khối cũng giúp bởi thực tế bạn có lối tắt KB để nhảy bắt đầu và kết thúc

+0

Cảm ơn mẹo 'ctrl +]'! Tôi luôn nghĩ rằng có một cách để làm điều này nhưng đã quá lười biếng để tìm kiếm nó! –

7

Tôi sẽ sử dụng bất kỳ công ty nào của tôi đã đặt cho các tiêu chuẩn mã hóa của công ty.

Điều đó đang được nói, tôi muốn sử dụng khối thứ hai, tiết kiệm hơn. Nó dễ đọc hơn nhiều. Tôi có thể, tuy nhiên, để lại các ý kiến ​​kết thúc khối trong một số trường hợp.

1

Nếu tôi nhớ chính xác, CC cũng đã đưa ra một số lời khuyên về nhận xét. Đặc biệt là về việc không viết lại nào có trong nhận xét, nhưng giải thích lý do tại sao nó hoạt động như thế nào.

+1

+1 cho điều này. "Cái gì" nên được phân biệt bằng cách đọc dòng mã. Các ý kiến ​​là cho "tại sao". – Omniwombat

1

Tôi muốn nói rằng anh ấy đúng với mục đích là mã vẫn có thể được giải thích chính xác nếu thụt đầu dòng không chính xác. Tôi luôn muốn có thể tìm thấy các số nhận dạng khối đầu và cuối cho các vòng khi tôi lướt qua mã và không dựa vào sự thụt lề thích hợp.

1

Không bao giờ luôn có cách này hay cách khác. Bởi vì tôi tin tưởng bản thân mình, tôi sẽ sử dụng phong cách ngắn hơn, ngắn gọn hơn. Nhưng nếu bạn đang ở trong một môi trường nhóm mà không phải tất cả mọi người đều có cùng kỹ năng và khả năng bảo trì là quan trọng, bạn có thể muốn lựa chọn thứ hai.

2

Số nhận dạng khối không chỉ dễ đọc hơn mà ít bị lỗi hơn nếu bạn thay đổi thứ gì đó trong logic khác hoặc chỉ cần thêm một dòng và không nhận ra rằng dòng không nằm trong cùng một khối logic phần còn lại của mã.

Tôi sẽ sử dụng khối mã thứ hai. Người đầu tiên trông đẹp hơn và quen thuộc hơn nhưng tôi nghĩ rằng đây là vấn đề của ngôn ngữ và không phải là số nhận dạng khối

Nếu có thể, tôi sử dụng kiểu kiểm tra để đảm bảo rằng dấu ngoặc được sử dụng.

0

cho ý kiến ​​cuối cùng là thực sự hữu ích cho các ngôn ngữ html như vậy làm mã C bị thay đổi giống như một kế vô hạn của if/else/if/else

0

thường xuyên // bình luận ở phần cuối của dòng mã (mỗi Vâng bạn Ví dụ Behaved và Verbose) làm cho mã khó đọc hơn - khi tôi nhìn thấy nó, tôi sẽ quét các nhận xét 'hiển nhiên' tạo thành một cái gì đó đặc biệt mà thường không có ở đó.

Tôi chỉ thích nhận xét nơi hiển nhiên không phải là (nghĩa là tổng thể và/hoặc chức năng độc đáo)

5

Tôi nghĩ điều đó phụ thuộc phần nào vào tình huống. Đôi khi bạn chỉ cần có một phương pháp như thế này:

void Foo(bool state) 
{ 
    if (state) 
     TakeActionA(); 
    else 
     TakeActionB(); 
} 

Tôi không thấy như thế nào làm cho nó trông như thế này:

void Foo(bool state) 
{ 
    if (state) 
    { 
     TakeActionA(); 
    } 
    else 
    { 
     TakeActionB(); 
    } 
} 

Cải thiện về khả năng đọc cả.

+2

Tôi nghĩ lý do tôi vẫn thích ví dụ thứ hai là nhất quán. Bạn nói đúng, đối với những tuyên bố rất ngắn gọn và ngắn gọn, nó không thêm nhiều giá trị, nhưng nó cho các câu lệnh phức tạp hơn và tôi cố gắng giữ phong cách mã hóa của mình nhất quán nhất có thể. –

1

Phản ứng đầu gối của tôi sẽ là danh sách thứ hai (với các nhận xét lặp đi lặp lại từ cuối dòng, như mọi người đã nói), nhưng sau khi nghĩ về nó sâu hơn hoặc hai dòng bình luận hữu ích trước khi giải thích những gì đang diễn ra (nếu cần). Rõ ràng trong ví dụ đồ chơi này, ngay cả những bình luận trước câu trả lời ngắn gọn có lẽ sẽ không cần thiết, nhưng trong các ví dụ khác nó có thể.

Có ít (nhưng vẫn có thể đọc được) và dễ hiểu mã trên màn hình giúp giữ cho bộ não của bạn miễn phí cho các phần trong tương lai của mã IMO.

4

Tôi là một nhà phát triển Python, vì vậy tôi không thấy cần phải có số nhận dạng khối. Tôi khá hạnh phúc nếu không có họ. Thụt lề là đủ của một chỉ số cho tôi.

+0

Có, nhưng trong Python thụt đầu dòng là dấu hiệu cho trình biên dịch. – JosephStyons

+1

Điểm của tôi là: Nếu số nhận dạng khối là tùy chọn trong bất kỳ ngôn ngữ nào, thụt đầu dòng là một chỉ báo đầy đủ, bất kể khoảng trắng có quan trọng hay không. – aehlke

1

Tôi với những người thích mã súc tích hơn.

Và có vẻ như thích một phiên bản dài hơn cho một phiên bản ngắn gọn là một lựa chọn cá nhân hơn là sự phù hợp toàn cầu. (Vâng, trong một công ty, nó có thể trở thành quy tắc chung (nhỏ).

Giống như dấu ngoặc đơn quá mức: một số người thích nó như (F1 and F2) or ((not F2) and F3) hoặc (A - (B * C)) < 0 và không nhất thiết vì họ không biết về các quy tắc ưu tiên. Nó chỉ rõ ràng hơn cho họ theo cách đó.

1

Tôi bỏ phiếu cho một phương tiện vui vẻ. Quy tắc tôi sẽ sử dụng là sử dụng từ khóa đặt giá thầu bất kỳ lúc nào nội dung là nhiều dòng. Trong hành động:

// clear and succinct 
with myGrid do begin 
    for currRow := FixedRows to RowCount - 1 do begin 
    if RowChanged(currRow) then begin 
     if not(RecordExists(currRow)) 
     InsertNewRecord(currRow); 
     else 
     UpdateExistingRecord(currRow); 
    end; // if RowChanged 
    end; // next currRow 
end; // with myGrid 
0

Cá nhân tôi khuyên bạn nên luôn sử dụng mã định danh theo ngôn ngữ hỗ trợ (nhưng tuân theo tiêu chuẩn mã hóa của công ty bạn, như @ Muad'Dib gợi ý).

Lý do là ở các ngôn ngữ không phải Pythonic, khoảng trắng (thường) không có ý nghĩa đối với trình biên dịch nhưng nó là con người.

Vì vậy

with myGrid do 
    for currRow := FixedRows to RowCount - 1 do 
    if RowChanged(currRow) then 
     Log(currRow); 
     if not(RecordExists(currRow)) then 
     InsertNewRecord(currRow) 
     else 
     UpdateExistingRecord(currRow);    

dường như làm một việc nhưng làm điều gì đó hoàn toàn khác.

Tôi sẽ loại bỏ các nhận xét cuối dòng. Sử dụng một IDE làm nổi bật các khối. Tôi nghĩ rằng Castalia sẽ làm điều đó cho Delphi. Bạn có thường xuyên đọc bản in mã không?

+0

Castalia làm nhiều hơn các khối đánh dấu - là các khối đánh dấu và dòng mã của các công cụ sửa đổi mã. CnPack cũng làm nổi bật các khối - nhưng AFAIK, không phải là dòng mã. –

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