Báo cáo dòng đơn & Thực tiễn tốt


11

Gần đây tôi đã có được một thói quen mà nhiều người trong số các bạn có thể cau mày, nhưng cuối cùng, điều đó giúp tôi theo dõi cấu trúc mã toàn cầu thay vì cấu trúc của một phương pháp lặp đi lặp lại (đôi khi): nhóm một số các câu lệnh trong một dòng duy nhất, như thế này:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

như trái ngược với

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Tôi sử dụng để làm điều đó cho các nhiệm vụ lặp đi lặp lại để duy trì mã "vẻ đẹp" tổng thể và để giúp tôi theo dõi cấu trúc chương trình một cách dễ dàng, nhưng tôi thừa nhận nó có thể không phải là một thực hành tốt. Tôi thực sự sử dụng nó rất nhiều, vì vậy tôi muốn biết suy nghĩ của bạn về điều này là gì. Ngoài ra, bạn có nghĩ rằng bất cứ ai sẽ phải duy trì mã của tôi đều gặp vấn đề với cách tiếp cận này không?


5
Đây có thể là một câu hỏi hay cho codereview.stackexchange.com

1
Tôi sẽ có vấn đề nếu tôi phải duy trì. Điều đầu tiên tôi sẽ làm là thực hiện CTRL + F cho ";" và đặt một ngắt dòng. Nhưng đó là tôi :-). Tôi chỉ thích một dòng nếu tôi có reasson, ví dụ khởi tạo các thuộc tính được kích hoạt của một vài hộp văn bản với giá trị mặc định là false: textBox1.Enables = textBox2.Enables = false;
Arun

2
Nếu bạn đang hỏi một câu hỏi về phong cách mã hóa, sẽ hữu ích nếu bạn chỉ định ngôn ngữ.
Caleb

3
Mặc dù nó có thể không phát sinh trong ví dụ đã cho, làm thế nào bạn sẽ đặt một điểm dừng trên câu lệnh thứ hai hoặc thứ ba hoặc ... nếu bạn đặt tất cả chúng trên một dòng?
Marjan Venema

1
Ngoài ra, tôi đã quen với định dạng tự động (Java), trong đó mã vẫn có giao diện thống nhất.
Kwebble

Câu trả lời:


22

Tôi thực sự nghĩ rằng khả năng đọc sẽ ảnh hưởng rất lớn cho cả bạn và chắc chắn bất kỳ ai khác đang đọc mã. Tất cả đều có ý nghĩa khi bạn viết nó lần đầu tiên vì nó chủ động trong tâm trí bạn. Sẽ khác khi bạn quét mã để xem biến và chức năng là gì ... bạn đang tự hủy khả năng quét mã của chính mình. Đó là một khổng lồ không có-không, và xa hơn nữa xấu nếu bất cứ ai khác đã từng có để đọc mã của bạn.

Ngoài ra, hãy suy nghĩ về cách bạn đọc mã. Nó luôn luôn từ trên xuống, cuộn xuống. Phương pháp của bạn không phù hợp với điều này và thậm chí còn giới thiệu một trong những vấn đề xấu nhất có thể xảy ra trong việc đọc mã; cuộn theo chiều ngang . Đừng bao giờ đánh giá thấp mức độ khó mà có thể làm cho việc đọc mã. Bạn không bao giờ cuộn theo chiều ngang, bạn không bao giờ khiến mọi người cuộn theo chiều ngang, trong hầu hết mọi bối cảnh, điều đó cực kỳ không tự nhiên.

Ngoài ra, nếu vấn đề của bạn là nhập mã lặp đi lặp lại ... đừng quên Ctrl-C. Từ mã ví dụ của bạn, có thể hiệu quả hơn khi nhập tất cả bằng tay, nhưng nếu bạn phải sao chép một loạt các dòng nhiều lần thì có vẻ như việc sao chép dòng một cộng với một dòng mới sẽ hiệu quả hơn x lần và thực hiện các thay đổi, ít có khả năng mắc lỗi đánh máy.

Ồ, và lỗi chính tả! Làm hại tính dễ đọc của mã của bạn như thế có thể khiến nó trở thành cơn ác mộng khi tìm ra khai báo nào trong số 50 khai báo biến bạn đặt sai. Bây giờ hầu hết các trình biên dịch đều đưa ra lỗi ở số hàng VÀ số cột, nhưng việc tìm lỗi tại một hàng dễ dàng hơn nhiều so với tìm cột.


2
a) Đọc / Quét mã - Hầu hết mọi người khi quét mã đều đọc một vài ký tự đầu tiên của dòng sau đó tiếp tục trừ khi nó "thú vị", sau đó họ đọc thêm một vài ký tự. Lỗi trình biên dịch: Hầu hết thời gian tôi diễn giải lỗi trình biên dịch là "Sự cố với dòng <x>". chỉ khi tôi không thể xử lý nó ngay lập tức (hiếm), thì tôi mới thực sự đọc được lỗi.
mattnz

19

Một tuyên bố trên mỗi dòng cũng giúp dễ dàng hơn để xem những gì đã thay đổi trong một khác biệt bên cạnh.


2
Đây có lẽ là lý do lớn nhất, nếu ai đó phải hợp nhất mã đó, gần như tất cả các công cụ hợp nhất sẽ giúp dễ dàng cách ly và di chuyển các dòng hơn là các chuỗi con.
anon

@anon Điểm tốt về các công cụ hợp nhất là tốt; một tuyên bố trên mỗi dòng có nghĩa là ít xung đột hợp nhất để dọn sạch.
Hugo

10

Trong khi ví dụ không cho thấy điều này, có một vấn đề khác với việc nhóm nhiều câu lệnh trên một dòng. Điều gì sẽ xảy ra nếu một trong năm câu lệnh bạn có trên một dòng ném một ngoại lệ?

Theo dõi ngăn xếp của bạn sẽ nói "EBazaki tại dòng N" ... và bây giờ bạn không biết trong số năm câu lệnh đó đã ném ngoại lệ.

(Điều tương tự xảy ra với một tuyên bố quá dài của bất kỳ loại nào.)


2
Khái niệm tương tự áp dụng cho gỡ lỗi, trong đó một lần nữa độ chi tiết thường là số dòng.
David Hammen

2
Ồ vâng, đây có thể là một vấn đề. Một yêu thích của người Viking là khi bạn nhận được một con trỏ rỗng trong một cái gì đó như foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(cú pháp Java / C #). Sắp xếp thông qua loại mớ hỗn độn đó luôn tốt hơn với các dòng bổ sung (và các biến tạm thời, và một 2D6 Brick Of Clue cho nhà phát triển ban đầu).
Donal Fellows

7

One-statement-per-line là một kiểu mã hóa được sử dụng rộng rãi. Do đó, hầu hết các nhà phát triển nhìn vào mã của bạn trong tương lai có thể sẽ nhăn nhó khi họ thấy nhiều câu lệnh trên mỗi dòng. Khi bạn đã từng nhìn thấy một cái gì đó một cách, nó có thể mất phương hướng để nhìn thấy nó theo một cách khác.

Vì lý do này, tôi khuyên chống lại nó, ngoại trừ trong những trường hợp hiếm hoi.


4

Lần cuối cùng tôi đã làm điều này 25 năm trước bằng cách sử dụng các ngôn ngữ được giải thích trên các micrô nhỏ chạy với tốc độ xung nhịp thấp, trong đó mọi khoảng trống hoặc vận chuyển trở lại bị loại bỏ đều làm tăng hiệu suất.

Bây giờ tôi nhăn nhó khi nghĩ về nó (mặc dù nó đã được thực hiện vì một lý do tốt).

Thật không may, mã như vậy rất khó đọc, và do đó khó duy trì.


1
Vì vậy, bạn viết nó đúng cách, sau đó tước khoảng trắng và bất kỳ chuẩn bị nào khác cho "bản sao máy" của bạn. Giống như giảm bớt javascript ngày nay.
CaffGeek

1
Vâng - tôi đã viết một chương trình để xử lý lại mã nguồn như vậy - vào năm 1986. Một điều nữa tôi hy vọng sẽ không bao giờ cần phải làm lại.
quick_now

1

Về mặt cú pháp, thực sự không có gì sai với nó. Nó thực sự phụ thuộc vào phong cách mã hóa của nhóm của bạn.

Vì hầu hết các mã tôi đã thấy (bao gồm cả mã nằm trong các tiêu đề c ++ tiêu chuẩn) được thực hiện theo cách này, tôi sẽ thực hiện theo phương pháp đầu tiên của bạn.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

0

Đây thực sự là phong cách mã hóa bất thường.

Tôi sẽ khuyên bạn nên sử dụng các dòng trống để phân định các phần logic của mã thay thế.


0

Đi quá xa về bên phải có thể tạo ra nhiều vấn đề như nhiều dòng.

Tôi đã phải đối phó với một số báo cáo sql với hàng chục lĩnh vực. Thông thường, tôi đặt một dòng trên mỗi dòng, nhưng trong một vài lần, tôi đã hợp nhất 3 hoặc 4 thành một hàng. Đây có vẻ là một ý tưởng tốt trong quá trình phát triển khi bạn phải cuộn lên xuống nhiều lần.

Tôi rất tiếc khi quay lại mã này. Có thêm hàng dường như không tạo ra nhiều vấn đề nên tôi thường dọn dẹp.


0

Ngoài ra, bạn có nghĩ rằng bất cứ ai sẽ phải duy trì mã của tôi đều gặp vấn đề với cách tiếp cận này không?

Sau khi đặt tay lên đầu trong một phút, anh ta sẽ sử dụng các chức năng IDE Regex yêu thích của mình để tự động tách tất cả các mã không thể đọc thành một câu lệnh trên mỗi dòng.

Chỉ cần nhìn nhanh vào ví dụ bạn đã trình bày là đủ để hiểu cách tiếp cận thứ hai dễ đọc hơn bao nhiêu.

Việc theo dõi dòng trang dọc sẽ dễ dàng hơn nhiều mà không cần phải di chuyển theo chiều ngang mãi mãi.

Nhìn vào ví dụ của bạn: bạn biết ngay mã là tất cả về thuộc Texttính của các textBoxđối tượng khác nhau và chúng chứa chuỗi dưới dạng giá trị. Khá đơn giản.


0

Cá nhân tôi sẽ không sử dụng một phong cách như vậy. Tóm tắt

Ưu

  • Ít dòng mã hơn để cuộn qua
  • có thể được sử dụng để mã nhóm ngữ nghĩa để diễn đạt: "rất nhiều công cụ chuyển nhượng". NHƯNG bạn luôn có thể cấu trúc lại một khối như vậy thành một hàm nếu nó làm phiền bạn quá nhiều.

Nhược điểm

  • khó đọc, thường dễ đọc mã theo chiều ngang (đọc lướt, không chuyển động mắt, ...)
  • khác biệt dễ dàng trở thành một cơn ác mộng, bao gồm cả sáp nhập
  • khó thay đổi hơn (sao chép và dán, bình luận, ...)
  • gỡ lỗi có thể là một vấn đề trong nhiều IDE khi chúng hoạt động trên các dòng thay vì các biểu thức riêng lẻ.

Một số "khuyết điểm" đôi khi có thể là ưu. Ví dụ: giả sử một đoạn mã có tám thao tác liên tiếp của biểu mẫu if (x > maxX) {x=maxX; peggedAny = true;}. Nếu mỗi thao tác như vậy sẽ dễ dàng khớp trên một dòng, tôi thà có tám dòng như thế hơn là hàng chục dòng phân tách các câu lệnh. Nếu so sánh như vậy được sử dụng ở những nơi đủ, bốn tuyên bố về hình thức peggedAny |= pegValueMinMax(ref x, minX, maxX);có thể tốt hơn, nhưng ai đó đọc sẽ phải đọc pegValueMinMaxđể xem những gì nó làm.
supercat

Hơn nữa, nếu một phần nhỏ của một dòng thay đổi, một "khác biệt" sẽ coi đó là một thay đổi cho toàn bộ dòng. Nếu dòng nên hoạt động chức năng như một đơn vị, đó sẽ là một điều tốt. Mặt khác, nếu một hoạt động ngữ nghĩa được phân chia giữa nhiều dòng, thay đổi đối với một số dòng có thể ảnh hưởng đến hoạt động theo những cách không rõ ràng.
supercat
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.