Có ai có thể thách thức chú Bob về tình yêu của mình trong việc loại bỏ những chiếc niềng răng vô dụng không?


94

Tôi ghét tham chiếu nội dung được trả tiền, nhưng video này hiển thị chính xác những gì tôi đang nói. Chính xác là 12 phút ở Robert Martin xem xét điều này:

Một số mã

Và nói "Một trong những điều yêu thích của tôi phải làm là thoát khỏi niềng răng vô dụng" khi anh ấy biến nó thành thế này:

Thêm mã

Cách đây rất lâu, trong một nền giáo dục ở rất xa, tôi đã được dạy không làm điều này bởi vì nó giúp dễ dàng đưa ra một lỗi bằng cách thêm một dòng thụt lề khác nghĩ rằng nó được kiểm soát bởi ifkhi nó không.

Công bằng mà nói với chú Bob, anh ấy đang tái cấu trúc một phương thức Java dài cho đến các hàm nhỏ bé mà tôi đồng ý, dễ đọc hơn nhiều. Khi anh ta thay đổi nó xong, (22,18) nó trông như thế này:

Mã nhiều hơn

Tôi tự hỏi nếu điều đó được cho là để xác nhận loại bỏ niềng răng. Tôi đã quen thuộc với thực tiễn tốt nhất . Bác Bob có thể bị thách thức về điểm này không? Có phải chú Bob đã bảo vệ ý tưởng đó?


6
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì mọi câu trả lời cho câu hỏi này sẽ là "không" hoặc "có, và đây là một trích dẫn."
Blrfl

35
Cho nó một vài năm, có thể anh ta cũng sẽ loại bỏ các ngắt dòng vô dụng, và "nếu (thấy (một cái gì đó)) nói (một cái gì đó);" sẽ thực sự một dòng mã ;-)
Steve Jessop

8
@SteveJessop Rất vui khi biết rằng tôi đang ở phía trước. : D Không có dòng mới, sẽ không có rủi ro về lỗi khét tiếng. Thêm / xóa niềng răng khi cần là một chi phí bổ sung, nhưng sẽ được lưu nhiều hơn khi đọc.
maaartinus

9
Chú Bob đưa ra một số điểm tốt để thực hiện điều đó trong Clean Code, trang 35. Nếu một ifkhối chỉ là một dòng, điều đó không thành vấn đề. Nếu bạn cần thêm nhiều dòng, nó sẽ là một hàm khác làm giảm ifkhối trở lại một dòng (lệnh gọi hàm). Nếu bạn tuân thủ điều đó, thì niềng răng đơn giản là không quan trọng - chút nào .

13
anh ta chỉ nên làm return (page==null) ? "" : includePage(mode,page);nếu anh ta trở nên cực kỳ ... Tôi nghĩ phong cách không có niềng răng là tuyệt vời cho đến khi tôi bắt đầu phát triển ứng dụng một cách chuyên nghiệp. Tiếng ồn khác nhau, lỗi chính tả có thể xảy ra, vv Các niềng răng, luôn luôn ở đó, giúp bạn tiết kiệm thời gian và chi phí bạn cần để giới thiệu chúng sau này.
vaxquis

Câu trả lời:


47

Khả năng đọc là điều không nhỏ.

Tôi có một tâm trí hỗn hợp khi nói đến niềng răng có một phương pháp duy nhất. Cá nhân tôi loại bỏ chúng cho những thứ như tuyên bố hoàn trả một dòng, nhưng bỏ đi những cái niềng răng như vậy thực tế đã cắn chúng tôi rất nhiều ở nơi cuối cùng tôi làm việc. Ai đó đã thêm một dòng mã vào một ifcâu lệnh mà không thêm các dấu ngoặc cần thiết và vì nó là C, nó đã làm sập hệ thống mà không có cảnh báo.

Tôi không bao giờ thách thức bất cứ ai theo tôn giáo về việc luôn luôn sử dụng niềng răng sau khi thất bại nhỏ đó.

Vì vậy, tôi thấy lợi ích của khả năng đọc, nhưng tôi nhận thức sâu sắc về các vấn đề có thể phát sinh khi bạn rời khỏi những niềng răng đó.

Tôi sẽ không cố gắng tìm một nghiên cứu hoặc ý kiến ​​được công bố của ai đó. Mọi người đều có một (một ý kiến, đó là), và vì đó là một vấn đề về phong cách, một ý kiến ​​cũng tốt như bất kỳ ý kiến ​​nào khác. Hãy tự suy nghĩ về vấn đề này, đánh giá những ưu và nhược điểm và tạo nên tâm trí đáng nguyền rủa của chính bạn. Nếu cửa hàng bạn làm việc có một tiêu chuẩn mã hóa bao gồm vấn đề này, chỉ cần làm theo điều đó.


7
Gần đây tôi đã cắn một chút, khi vết lõm bị tắt và gây hiểu lầm.
Andy

12
Bởi vì đó là C mà không có GCC 6-Wmisleading-indentation .
wchargein

2
@CandiedOrange: Đó là chú Bob đang thách thức giáo điều đã được thiết lập.
Robert Harvey

1
@RobertHarvey Tôi không nói rõ điều đó sao? Vâng, anh ấy thách thức giáo điều. Anh ta thách thức giáo điều của tôi. Tôi chỉ đang cố gắng trở thành một học sinh giỏi và ít nhất là xem xét nó. Nhưng chú Bob rất lôi cuốn, nó khiến tôi tự hỏi liệu tôi có đang mất đi sự khách quan không. Vì vậy, tôi đang cầu xin sự giúp đỡ để tìm thuốc giải độc trước khi tôi uống koolaid.
candied_orange

1
@CandiedOrange: Nó hoàn toàn là một điều bối cảnh. Những người chỉ mù quáng chấp nhận giáo điều không xem xét bối cảnh; họ là những người vẫn sử dụng quy tắc "một lần duy nhất" trong các ngôn ngữ được quản lý, rất lâu sau khi quy tắc này vượt xa tính hữu dụng của nó và thực sự đã trở thành một trở ngại.
Robert Harvey

133

Bạn có thể tìm thấy một số chương trình khuyến mãi được công bố hoặc từ chối các kiểu không có nẹp tại đây hoặc ở đây hoặc bất cứ nơi nào nhà để xe đạp được sơn.

Bước ra khỏi nhà để xe đạp, bạn có nhớ lỗi SSL OS X / iOS tuyệt vời của năm 2014 không?

if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
    goto fail;

Đúng, "gây ra" bởi các khối không có nẹp https://www.imperialviolet.org/2014/02/22/appleorms.html

Sở thích có thể phụ thuộc vào phong cách cú đúp. Nếu tôi phải viết

if (suiteSetup)
{
    includePage(mode, suiteSetup);
}

Tôi có thể có xu hướng tiết kiệm không gian quá. Nhưng

if (suiteSetup) {
    includePage(mode, suiteSetup);
}

chỉ sử dụng một dòng "phụ".


Tôi biết bạn đã không hỏi, nhưng nếu tôi làm việc một mình, tôi là một kẻ dị giáo. Nếu tôi loại bỏ niềng răng, tôi thích

if (suiteSetup != null) includePage(mode, suiteSetup);

Nó không có vấn đề về hình ảnh giống như lỗi kiểu SSL của iOS, nhưng tiết kiệm được nhiều dòng "không cần thiết" hơn chú Bob;) Đọc tốt nếu bạn đã quen với nó và có cách sử dụng chính trong Ruby ( includePage(mode, suiteSetup) unless suiteSetup.nil?). Oh tốt, chỉ cần biết rằng có rất nhiều ý kiến.


13
Ngoài ra, nếu bạn sử dụng } else[if(...)] {, điều đó không thêm bất kỳ dòng bổ sung nào, do đó, nó chỉ thêm tối đa một dòng bổ sung trên toàn bộ.
Random832

12
Tôi rất vui khi bạn đưa ra lỗi SSL SSL. Kể từ đó, tôi đã thấy mình sử dụng niềng răng trong những tình huống như vậy ngày càng nhiều.
Zach Lipton

4
Liên quan đến lỗi "goto fail", đáng chú ý là các khía cạnh khác trong phong cách mã hóa của chú Bob cũng sẽ ngăn chặn nó, quan trọng nhất là sự ưa thích mạnh mẽ của ông đối với các phương pháp cực ngắn. Anh ta sẽ không bao giờ chấp nhận phương pháp 79 dòng ngay từ đầu và phương thức này đã bị phá vỡ thành các phương pháp nhỏ hơn (a) xung đột hợp nhất gây ra sự trùng lặp có thể sẽ không bao giờ xảy ra và (b) điều khiển luồng đơn giản hơn trong phương pháp có thể có nghĩa là các cảnh báo của trình biên dịch cho mã không thể truy cập sẽ được tạo ra nên đã ngăn chặn sự cố.
Jules

16
"Goto fail" không phải do các dòng đơn gây ra, nguyên nhân là do lập trình cẩu thả, thậm chí là xem xét mã sloppier và thậm chí không một lần bước qua mã theo cách thủ công.
gnasher729

35
Meh, thiếu niềng răng không gây ra lỗi đó. Các lập trình viên kinh khủng (và thiếu bất kỳ đánh giá, kiểm tra mã có ý nghĩa) đã làm. Khắc phục sự cố bằng cách sa thải những người có trách nhiệm, không phải bằng cách trói tay những người còn lại trong chúng ta!
Các cuộc đua nhẹ nhàng trong quỹ đạo

62

Chú Bob có nhiều lớp phòng thủ chống lại một sai lầm không phổ biến khi "luôn luôn sử dụng niềng răng" là sự khôn ngoan phổ biến:

  1. Một sở thích cá nhân mạnh mẽ cho các điều kiện một dòng, vì vậy những người nhiều dòng nổi bật và nhận được sự giám sát thêm.
  2. Một trình soạn thảo tự động lỗi thời khi bạn chèn một dòng thứ hai.
  3. Một bộ hoàn chỉnh các bài kiểm tra đơn vị mà anh ta chạy liên tục.
  4. Một bộ đầy đủ các bài kiểm tra tích hợp.
  5. Một đánh giá ngang hàng được thực hiện trước khi mã của anh ta được hợp nhất.
  6. Chạy lại tất cả các bài kiểm tra của một máy chủ tích hợp liên tục.
  7. Kiểm tra được thực hiện bởi một bộ phận chất lượng sản phẩm.

Tôi nghĩ rằng nếu ai đó đã xuất bản một thử thách cho chú Bob, anh ta sẽ có một phản bác khá tốt với những điểm trên. Đây là một trong những sai lầm dễ mắc phải sớm nhất.


16
Tôi chưa bao giờ sợ đổ vỡ theo cách tôi sợ những thứ thất bại âm thầm. Ít nhất bạn biết khi một vụ tai nạn xảy ra. Mặt sau não tôi râm ran khi tôi nhìn thấy thứ này. Nó râm ran giống như khi tôi nhìn thấy while(true);{break;}. Nếu thực sự có một bối cảnh hợp lệ cho điều này, nó sẽ khiến tôi mất một thời gian để vượt qua nó.
candied_orange

9
Chúng ta có cách kiểm tra tự động includePage()không phải là một macro được viết xấu với nhiều hơn một tuyên bố không?
Martin York

51
@LokiAstari Vâng, nó được gọi là "Java không có macro".
Svick

11
Tất cả những điều trên là "nhiều cách để tránh những nhược điểm liên quan đến chính sách 'niềng răng vô dụng' làm tổn thương tôi" hơn là "lý do thực sự sử dụng" chính sách niềng răng vô dụng ". Những sự thật mà bạn cần những điều đó (đặc biệt là số 1) nên được coi là một sự hủy hoại hơn là một lợi thế.
SJuan76

16
@Jules ơi! TẤT CẢ các sản phẩm tôi đã nhận hoặc phát hành tại nơi làm việc có phạm vi kiểm tra 100% (ít nhất), được đánh giá ngang hàng (nhiều lần) và tất cả các doanh nghiệp xung quanh đều có bộ phận QA Phần mềm. Đúng. Tôi đoán bạn đã tìm thấy điều tương tự trong sự nghiệp chuyên nghiệp của mình, bởi vì mọi doanh nghiệp đều có đội ngũ lập trình viên thay vì lập trình viên duy nhất và họ cho họ quá nhiều thời gian để thực hiện tất cả các thử nghiệm họ muốn làm. Vâng, mô tả tất cả các nơi làm việc hoàn hảo. Tại sao phải lo lắng về việc thêm một số lỗi bổ sung khi chúng tôi chắc chắn phần mềm của chúng tôi LUÔN gửi miễn phí 100% lỗi?
SJuan76

31

Đối với hầu hết các phần này là sở thích cá nhân, tuy nhiên có một số điều cần xem xét.

Lỗi có thể

Trong khi nó có thể lập luận rằng lỗi do quên add-in niềng răng là rất hiếm, từ những gì tôi đã nhìn thấy rằng họ làm xảy ra thỉnh thoảng (không quên nổi tiếng goto IOS không lỗi). Vì vậy, tôi nghĩ rằng đây phải là một yếu tố khi xem xét phong cách mã của bạn (một số công cụ cảnh báo về sự thụt lề sai lệch , vì vậy nó cũng phụ thuộc vào chuỗi công cụ của bạn) .

Mã hợp lệ (đọc giống như nó có thể là một lỗi)

Ngay cả khi giả định rằng dự án của bạn không gặp phải các lỗi như vậy, khi đọc mã, bạn có thể thấy một số khối mã trông giống như chúng có thể là lỗi - nhưng không, thực hiện một số chu kỳ tinh thần của bạn.

Chúng tôi bắt đầu với:

if (foo)
    bar();

Một nhà phát triển thêm một nhận xét hữu ích.

if (foo)
    // At this point we know foo is valid.
    bar();

Sau đó, một nhà phát triển mở rộng về nó.

if (foo)
    // At this point we know foo is valid.
    // This never fails but is too slow even for debug, so keep disabled.
    // assert(is_valid(foo));
    bar();

Hoặc thêm một khối lồng nhau:

if (foo)
    while (i--) {
        bar(i);
        baz(i);
    }

Hoặc sử dụng macro:

if (foo)
    SOME_MACRO();

"... Vì các macro có thể xác định nhiều dòng mã, macro có sử dụng do {...} while (0)cho nhiều dòng không? Có phải vì nó nằm trong hướng dẫn kiểu của chúng tôi nhưng tôi nên kiểm tra tốt hơn trong trường hợp!"


Các ví dụ trên đều là mã hợp lệ, tuy nhiên càng nhiều nội dung trong khối mã, bạn càng cần phải đọc để đảm bảo không có bất kỳ lỗi nào.

Có thể kiểu mã của bạn xác định rằng các khối nhiều dòng yêu cầu một dấu ngoặc (không có vấn đề gì, ngay cả khi chúng không phải là mã) , nhưng tôi đã thấy các loại nhận xét này được thêm vào trong mã sản xuất. Khi bạn đọc nó, có một số nghi ngờ nhỏ rằng bất kỳ ai sửa lần cuối những dòng đó đều quên thêm dấu ngoặc, đôi khi tôi cảm thấy cần phải kiểm tra lại có hoạt động như dự định không (đặc biệt là khi điều tra một lỗi trong khu vực của mã này) .

Tiếng ồn khác

Một lý do thực tế để sử dụng niềng răng cho các đường đơn là để giảm nhiễu khác nhau .

Đó là, thay đổi:

if (foo)
    bar();

Đến:

if (foo) {
    bar();
    baz();
}

... Làm cho dòng điều kiện hiển thị trong một khác biệt khi được thay đổi, điều này thêm một số chi phí nhỏ nhưng không cần thiết.

  • các dòng hiển thị như được thay đổi trong đánh giá mã, nếu các công cụ phân biệt của bạn dựa trên từ bạn có thể dễ dàng thấy rằng chỉ có niềng răng thay đổi, nhưng sẽ mất nhiều thời gian hơn để kiểm tra nếu dòng đó không thay đổi.
    Phải nói rằng, không phải tất cả các công cụ đều hỗ trợ diffing dựa trên từ, diff (svn, git, hg ... vv) sẽ hiển thị như thể toàn bộ dòng thay đổi, ngay cả với các công cụ ưa thích, đôi khi bạn có thể cần phải nhanh chóng nhìn qua một dòng đơn giản dựa trên diff để xem những gì đã thay đổi.
  • các công cụ chú thích (chẳng hạn như git blame) sẽ hiển thị dòng đang được thay đổi, làm cho việc theo dõi nguồn gốc của một dòng nhiều bước hơn để tìm ra thay đổi thực sự.

Cả hai đều nhỏ và phụ thuộc vào thời gian bạn xem xét mã hoặc theo dõi xuống mà cam kết thay đổi dòng mã.

Một sự bất tiện hữu hình hơn khi có thêm các dòng thay đổi trong một khác biệt, khả năng thay đổi mã cao hơn của chúng sẽ gây ra xung đột khi hợp nhất và cần được giải quyết thủ công .


Có một ngoại lệ cho điều này, đối với các cơ sở mã có {trên dòng riêng - đó không phải là vấn đề.

Đối số nhiễu khác không giữ nếu bạn viết theo kiểu này:

if (foo)
{
    bar();
    baz();
}

Tuy nhiên đây không phải là một quy ước chung, vì vậy chủ yếu thêm vào câu trả lời cho đầy đủ (không đề xuất các dự án nên sử dụng phong cách này) .


8
Tôi thích giảm nhiễu khác biệt nhận xét đó là một định nghĩa cộng.
Martin York

2
Nếu chỉ có tất cả những ai đang phát cuồng vì JSON có bất kỳ cân nhắc nào về nhiễu khác nhau! Tôi đang nhìn bạn, quy tắc không dấu phẩy cuối cùng.
Roman Starkov

1
Huh, tôi đã không xem xét lợi ích khác biệt của phong cách {-on-it-own-line. Tôi thực sự ghét phong cách đó, và không thích làm việc trong các dự án đòi hỏi phong cách đó. Có lẽ với suy nghĩ đó, tôi sẽ thấy bớt bực bội hơn khi phải viết mã theo cách đó. Mật độ mã là quan trọng. Nếu bạn có thể thấy tất cả các chức năng trên màn hình của mình cùng một lúc, bạn có thể dễ dàng mò mẫm toàn bộ. Tôi thích để các dòng trống giữa các khối mã riêng biệt bên trong một hàm để dễ đọc (với các câu lệnh liên quan đến nhóm) và bị buộc phải lãng phí không gian ở những nơi khác làm cho ý định bị phá vỡ yếu hơn.
Peter Cordes

1
@ peter-cordes, cũng không phải là một fan hâm mộ của {phong cách -on-it-own-line, chỉ bao gồm nó cho các câu trả lời đầy đủ. Đối với việc tin tưởng các macro để sử dụng do{}while(0), tôi thấy vấn đề với điều này là bạn có thể tin tưởng nó gần như mọi lúc. Vấn đề là tai nạn xảy ra, lỗi có thể xảy ra khi xem lại mã ... và lỗi có thể được đưa ra mà không phải là khác.
ideaman42

2
Nếu chúng tôi liệt kê các lỗi tiềm ẩn, khả năng nhận xét các dòng riêng lẻ là một điều tốt. Tôi đã theo dõi một lỗi được gây ra bởi ai đó bình luận một cách mù quáng về phần thân của câu lệnh if-line. Câu lệnh sau đó được thực hiện có điều kiện, thay vì được thực hiện vô điều kiện.
Pho mát Eldritch

15

Nhiều năm trước, tôi đã được đưa vào để gỡ lỗi một số mã C. Con bọ rất khó tìm, nhưng cuối cùng nó cũng biến thành một câu như:

if (debug)
   foo (4);

Và hóa ra người viết nó đã được định nghĩa foolà một vĩ mô. Một macro có hai dòng mã trong đó. Và tất nhiên, chỉ có dòng đầu tiên trong hai dòng đó là đối tượng if. (Vì vậy, dòng thứ hai đã được thực hiện vô điều kiện.)

Điều này có thể hoàn toàn độc đáo đối với C và bộ tiền xử lý của nó - vốn thay thế trước khi biên dịch - nhưng tôi chưa bao giờ quên nó. Điều đó để lại dấu ấn cho bạn, và tại sao không chơi nó an toàn - đặc biệt là nếu bạn sử dụng nhiều ngôn ngữ và công cụ khác nhau và không thể chắc chắn những kẻ lừa đảo như vậy không thể ở nơi khác?

Bây giờ tôi thụt lề và sử dụng niềng răng khác với mọi người, rõ ràng. Đối với một dòng duy nhất if, tôi sẽ làm:

if (debug) { foo (4); }

do đó, không cần thêm bất kỳ dòng nào để bao gồm cả niềng răng.


6
Trong trường hợp đó, bất cứ ai đã viết macro đó là người có lỗi.
gnasher729

6
Viết macro tiền xử lý C chính xác có thể không trực quan, nhưng nó có thể được thực hiện. Và nó nên được thực hiện, như gnasher729 chỉ ra. Và ví dụ của bạn là lý do tại sao bất kỳ macro nào chứa nhiều hơn một câu lệnh phải bao gồm phần thân của nó trong một do { ... } while(0)vòng lặp. Điều này sẽ không chỉ đảm bảo rằng nó sẽ luôn được xử lý chính xác bằng cách kèm theo các if()câu lệnh mà còn cả dấu chấm phẩy ở cuối câu lệnh được nuốt chính xác. Bất cứ ai không biết về các quy tắc đơn giản như vậy, đơn giản là không nên viết các macro tiền xử lý. Bảo vệ tại các trang web gọi là nơi sai lầm để bảo vệ.
cmaster

18
@cmaster: Đúng, nhưng cách các macro (hoặc các tính năng ngôn ngữ khác) được viết bởi người khác nằm ngoài tầm kiểm soát của tôi. Làm thế nào tôi sử dụng niềng răng là dưới sự kiểm soát của tôi. Tôi chắc chắn không nói đây là một lý do sắt thép để bao gồm cả niềng răng, nhưng đó là điều mà tôi có thể làm để tự bảo vệ mình trước những sai lầm của người khác nên tôi làm điều đó.
Wayne

@ gnasher729, ai quan tâm nếu đó là lỗi của người khác? Nếu bạn đang thực hiện đánh giá mã và tuân theo một số tiêu chuẩn mã hợp lý, đó cũng có thể là lỗi nhóm của bạn. Và nếu nó đến tay người dùng, họ sẽ đổ lỗi cho tổ chức phát hành phần mềm lỗi.
ideaman42

1
Bất cứ ai đến với macro là người có lỗi.
Neme

14

"Chú Bob" được phép có ý kiến ​​của mình, bạn được phép có ý kiến ​​của mình. Không cần phải thách thức anh ta.

Nếu bạn muốn kháng cáo lên chính quyền, hãy dùng Chris Lattner. Trong Swift, nếu các câu lệnh bị mất dấu ngoặc đơn, nhưng luôn đi kèm với dấu ngoặc nhọn. Không có thảo luận, đó là một phần của ngôn ngữ. Vì vậy, nếu "Chú Bob" bắt đầu gỡ bỏ dấu ngoặc, mã sẽ ngừng biên dịch.

Vượt qua mã của người khác và "thoát khỏi niềng răng vô dụng" là một thói quen xấu. Chỉ gây ra việc làm thêm khi mã cần được xem xét và khi xung đột được tạo không cần thiết. Có lẽ "Chú Bob" là một lập trình viên cực kỳ giỏi đến nỗi anh ta không cần đánh giá mã? Tôi đã lãng phí một tuần của cuộc đời mình vì một lập trình viên hàng đầu đã thay đổi "if (p! = NULL)" thành "if (! P)" mà không xem xét mã, ẩn ở nơi tồi tệ nhất có thể.

Đây chủ yếu là một cuộc tranh luận phong cách vô hại. Niềng răng có lợi thế là bạn có thể chèn một dòng mã khác mà không cần thêm dấu ngoặc. Giống như một tuyên bố đăng nhập, hoặc một bình luận (nếu theo sau là bình luận theo sau là tuyên bố chỉ là khủng khiếp). tuyên bố trên cùng một dòng như thể có nhược điểm thực tế là bạn có vấn đề với nhiều trình gỡ lỗi. Nhưng làm bất cứ điều gì bạn thích.


1
Tôi đoán đó là về "thử thách" bởi vì UB (sic!) Trình bày ý kiến ​​của anh ấy như là sự thật - ít nhất nó cũng gây ấn tượng với tôi khi tôi lắng nghe anh ấy.
vaxquis

3
Nói "Làm bất cứ điều gì bạn thích" thực sự là đồng ý với chú Bob về điều này bởi vì đó là điều ông cho rằng "không thành vấn đề". Trong nhiều ngôn ngữ, đây không phải là vấn đề. Trước đây tôi đã nghĩ rằng trong tất cả những vấn đề mà bạn nên LUÔN LUÔN sử dụng niềng răng và chưa thấy ai thách thức điều đó. Bây giờ đây là chú Bob thách thức nó và tôi tự hỏi liệu anh ta có thoát khỏi nó không bởi vì anh ta làm việc theo những phương pháp nhỏ bé được tái cấu trúc như vậy hoặc vì anh ta có đầy đủ. Tôi đã không nghĩ nó là vô hại chính xác vì các loại lỗi @PaulDraper đề cập đến trong câu trả lời của anh ấy.
candied_orange

Re luôn : tiếng ồn cú pháp là mất tập trung và thêm "blank" dòng cho cú đúp gần thêm một tách hình ảnh trong đoạn mà dòng không nên tách ra, tiếp tục cản trở khả năng đọc. Điều này đặc biệt quan trọng trong các khối nhỏ súc tích mà bạn đề cập.
JDługosz

9

Lý do của tôi để không loại bỏ niềng răng là:

  1. giảm mệt mỏi quyết định. Nếu bạn luôn sử dụng niềng răng, bạn không bao giờ phải quyết định liệu bạn sẽ cần niềng răng hay không.

  2. giảm lực cản phát triển: ngay cả khi bạn cố gắng cuối cùng trích xuất tất cả nhiều dòng logic để phương pháp này, cần phải chuyển đổi một braceless nếu đến một chuẩn bị tinh thần nếu để thêm logic là một chút khó chịu của sự phát triển kéo. Vì vậy, có nỗ lực loại bỏ các dấu ngoặc nhọn và nỗ lực thêm chúng một lần nữa khi bạn cần thêm mã. Nhỏ xíu, nhưng phiền phức.


0

Một đồng nghiệp trẻ đã nói rằng niềng răng mà chúng ta thấy là dư thừa và thừa thãi thực sự hữu ích cho anh ta. Tôi không nhớ chính xác lý do tại sao, nhưng nếu nó cho phép anh ta viết mã tốt hơn nhanh hơn, thì đó là lý do để giữ chúng.

Fwiw, chúng tôi đã đồng ý về một thỏa hiệp rằng đặt chúng trên một dòng không làm cho các điều kiện tiên quyết ngắn như vậy không thể đọc / làm tôi mất tập trung. Ví dụ

if (!param) { throw invalid_argument (blahblah); }
if (n < 2) { return 0; }
// real code for function starts here...

Tôi cũng chỉ ra rằng các điều kiện tiên quyết giới thiệu này thường là các câu lệnh kiểm soát dòng chảy đối với cơ thể (ví dụ a return) vì vậy nỗi sợ phải thêm một câu lệnh thứ hai có nghĩa là trong cùng điều kiện và quên viết niềng răng là điều cần thiết. Một tuyên bố thứ hai trong điều kiện sẽ là mã chết và không có ý nghĩa.

Tôi nghi ngờ rằng sự trôi chảy trong vấn đề đọc là do trình phân tích cú pháp não của người đó có dây để có niềng răng như một phần của tuyên bố có điều kiện. Đó không phải là một đại diện chính xác về ngữ pháp của C ++, nhưng có thể là tác dụng phụ của việc học một số ngôn ngữ khác trước, trong trường hợp đó là trường hợp.


1
Chú Bob có lẽ nghĩ rằng ông viết mã tốt hơn nhanh hơn mà không có chúng.
djechlin

2
Tôi cũng như những người khác thông thạo C ++.
JDługosz

1
"Nếu nó cho phép anh ta viết mã tốt hơn nhanh hơn, thì đó là lý do để giữ chúng" ++ Tôi có một người nói như vậy, do đó, chúng tôi giữ họ.
RubberDuck

... và đó là lý do một mình làm theo cách mà chú Bob muốn.
djechlin

-1

Vừa xem video đó, tôi nhận thấy rằng việc loại bỏ niềng răng giúp dễ dàng hơn trong việc xem mã vẫn cần được tái cấu trúc. Nếu bạn cần niềng răng, mã của bạn có thể sạch hơn một chút.

Phải nói rằng, khi bạn ở trong một đội, việc loại bỏ niềng răng có thể sẽ dẫn đến hành vi bất ngờ vào một ngày nào đó. Tôi nói hãy giữ chúng, và bạn sẽ tự cứu mình rất nhiều vấn đề đau đầu khi mọi thứ trở nên tồi tệ.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 10 câu trả lời trước
gnat

-3

Tôi được dạy không làm điều này bởi vì nó giúp dễ dàng đưa ra một lỗi bằng cách thêm một dòng thụt lề khác với suy nghĩ nó được kiểm soát bởi nếu không.

Nếu mã của bạn được kiểm tra đơn vị tốt , loại "lỗi" này sẽ phát nổ ở mặt.

Làm sạch mã bằng cách tránh bất kỳ dấu ngoặc vô dụng và xấu xí là một thực hành tôi làm theo.


9
Tất nhiên, điều ngược lại cũng đúng: nếu mã của bạn không có lỗi, bạn không cần bất kỳ bài kiểm tra đơn vị nào. Thực tế là chúng ta sống trong một thế giới không hoàn hảo, nơi đôi khi có những sai lầm trong mã và đôi khi sai lầm trong các bài kiểm tra. (Theo kinh nghiệm của tôi, cái sau thực sự phổ biến hơn.) Vì vậy, trong khi các xét nghiệm chắc chắn làm giảm nguy cơ lỗi, đây không phải là lý do để tìm cách khác để tăng rủi ro trở lại.
ruakh

3
Để thêm vào nhận xét của ruakh: không thể kiểm tra 100% đơn vị mã.
BЈовић

Vui lòng đến xem mã của tôi;) Trong khi thực hành TDD, bạn luôn có thể hiển thị loại lỗi này rất nhanh.
Mik378

@ Mik378 điều đó không đúng. Vấn đề là, nếu bạn đã sử dụng niềng răng, bạn thậm chí sẽ không phải lo lắng về nó.
DêInTheMachine
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.