Mã vô nghĩa trong nguồn của bạn


34

Tôi đã nghe những câu chuyện về điều này từ các lập trình viên cao cấp và tôi đã nhìn thấy một vài trong số đó. Dường như có nhiều hơn một vài trường hợp lập trình viên viết mã vô nghĩa. Tôi sẽ thấy những thứ như:

  • Phương thức hoặc hàm gọi mà không làm gì có giá trị.
  • Kiểm tra dự phòng được thực hiện trong một tệp lớp, đối tượng hoặc phương thức riêng biệt.
  • if báo cáo luôn luôn đánh giá là đúng.
  • Chủ đề mà quay đi và không có gì đáng chú ý.

Chỉ để một vài tên. Tôi đã được thông báo rằng điều này là do các lập trình viên muốn cố tình làm cho mã khó hiểu để nâng cao giá trị của chính họ cho tổ chức hoặc đảm bảo kinh doanh lặp lại trong trường hợp làm việc theo hợp đồng hoặc thuê ngoài.

Câu hỏi của tôi là. Có ai khác nhìn thấy mã như thế này? Kết luận của bạn là tại sao mã đó lại ở đó?

Nếu bất cứ ai đã viết mã như thế này, bạn có thể chia sẻ lý do tại sao?


4
if (false) {...}khối là tuyệt vời để bình luận ra mã! </ mỉa mai>
dlras2

18
Không bao giờ gán cho ác ý được giải thích thỏa đáng bởi sự ngu ngốc , đặc biệt là trong phát triển phần mềm nơi việc hack nhanh tạm thời hiếm khi là tạm thời.
wildpeaks

1
@ dlras2 xoắn cốt truyện: #DEFINE sai đúng :)
Silviu Burcea

Câu trả lời:


17

Tôi đã nghe các nhà phát triển cố gắng làm cho thành tích mã hóa của họ nghe có vẻ phức tạp hơn thực tế. Tôi chưa bao giờ nghe ai thừa nhận điều này, nhưng tôi đã thấy mã đáp ứng các tiêu chí của bạn được tạo ra một cách cố ý vì sự vội vàng hoặc thực hành kém và không phá hoại. Mã xung quanh mã sai có thể đã bị thay đổi đến mức mà một chức năng cụ thể không còn hữu ích.

Ai đó thực sự sẽ phải xem tận mắt mã này trước khi đi đến kết luận rằng chỉ nhà phát triển này mới có thể quản lý sự phức tạp. Hầu hết các nhà quản lý và những người kinh doanh khác chỉ đi đến kết luận này vì họ không hiểu bất kỳ loại mã nào và không muốn bổ sung vị trí.


2
Tôi có xu hướng cung cấp cho bạn câu trả lời chính xác trong trường hợp này bởi vì một số mã tôi thấy đơn giản là không thể vô tình ... trừ khi có ai đó cao khi họ mã hóa và nghĩ rằng nó sẽ rất buồn cười! Tôi tin rằng những người khác cũng có lý do liên quan đến mã vô dụng, nhưng mã tôi thấy là trên các dự án mà một vài người đã làm việc và tôi là người đầu tiên bên ngoài nhóm phát triển ban đầu làm việc về nó. Tôi phải nói rằng có vẻ như một trường hợp phức tạp được thêm vào gây sốc và sợ hãi.
Ali

18
@Ali: Không bao giờ gán cho ác ý những gì được giải thích tốt hơn bởi sự bất tài. Nói cách khác - mã có thể phát triển thành loại lộn xộn này bởi vì không ai đủ can đảm dành thời gian để thực sự nhìn vào nó và xem những gì nó thực sự làm. Tất cả điều này nghe giống như một loạt các sửa chữa nhanh chóng được áp dụng, lặp đi lặp lại, cho đến khi tất cả những gì còn lại là một bó yuck.
quick_now

1
+1 cho @quickly_now. Đó thường là những gì kết thúc xảy ra; mọi người đều sợ chạm vào bất cứ thứ gì "hoạt động" vì sợ phá vỡ nó (hoặc, Trời cấm, mất nhiều thời gian hơn để thực hiện cải tiến mã! Thật kinh dị!). Vì vậy, mã thối và lễ hội và cuối cùng sụp đổ nhiều năm xuống đường.
Wayne Molina

@Ali, đã có trường hợp mã có vẻ ngữ nghĩa và hợp lý nhất đã được mô tả vì tôi có thể nghĩ rằng điều này là buồn cười hoặc thể hiện. Và ngược lại với tôi thấy một số mã của người khác. Bạn không bao giờ biết ai điên, và hầu hết thời gian chỉ để trải nghiệm và sở thích. (không nói về mã xấu khách quan ở đây, chỉ là những mô tả như vậy dễ dàng bị ném xung quanh)
Mihail Malostanidis

73

Tôi chưa thấy mã như thế này nhưng tôi đã thấy mã trông vô nghĩa hoặc vô nghĩa vì những lý do khác:

  1. Tương thích ngược. Bạn đã tìm thấy cách tốt hơn để làm mọi thứ nhưng bạn phải giữ API / chức năng cũ (và bây giờ không hữu ích lắm) vì một số mô-đun của bên thứ ba ngoài kia có thể đang sử dụng API / chức năng này cho một cái gì đó. Ngay cả khi hàm không làm gì hữu ích, sự vắng mặt của nó có thể phá vỡ một số mã.

  2. Mã hóa phòng thủ. Bạn biết các kiểm tra trong mã này là vô nghĩa vì điều này đã được kiểm tra ở nơi khác. Nhưng điều gì sẽ xảy ra nếu ai đó thay đổi mã này ở nơi khác và xóa hoặc thay đổi séc để chúng không còn phù hợp với điều kiện tiên quyết của bạn?

  3. Tăng trưởng hữu cơ. Trong các dự án lớn, qua nhiều năm, nhiều thứ thay đổi, và hóa ra một số phương pháp đã được sử dụng trước đó không được sử dụng nữa, nhưng không ai bận tâm loại bỏ chúng vì không ai theo dõi liệu phương pháp cụ thể này có được sử dụng hay không, chúng chỉ tái cấu trúc các đoạn mã của họ và tình cờ nó đã xảy ra, tất cả họ đã dừng sử dụng phương pháp này. Hoặc các điều kiện đã từng có ý nghĩa nhưng ứng dụng được tái cấu trúc ở những nơi khác để điều kiện đó luôn luôn đúng nhưng không ai bận tâm để loại bỏ nó.

  4. Thiết kế quá mức. Mọi người có thể mã hóa một số thứ "chỉ trong trường hợp chúng tôi cần nó" và không bao giờ thực sự cần nó. Giống như "hãy tạo ra một luồng trong trường hợp chúng ta phải thực hiện một số công việc ngoại tuyến" và sau đó không ai yêu cầu làm bất cứ điều gì ngoại tuyến và lập trình viên quên nó và chuyển sang các dự án khác (hoặc thậm chí là một công ty khác) và mã đó vẫn ở đó mãi mãi bởi vì không ai biết tại sao nó ở đó hoặc nếu nó an toàn để loại bỏ nó.

Vì vậy, trong khi tôi chưa bao giờ thấy nó được thực hiện theo cách tiếp cận sai lầm hoặc sai lầm trong bảo mật công việc, tôi đã thấy hàng tấn lần khi nó xảy ra như là kết quả tự nhiên của phát triển phần mềm.


22
Tôi nghĩ # 3, Tăng trưởng hữu cơ giải thích một phần lớn Bộ luật vô dụng mà tôi đã thấy trong công việc. Nhưng cả 4 lý do này đều cho rằng một lập trình viên thông minh. Một số mã vô dụng xuất phát từ một người không hiểu những gì cần phải xảy ra, và những gì không, và để lại rất nhiều mã hoàn toàn vì sợ thay đổi những gì (loại) hoạt động.
Bruce Ediger

2
Tôi đã thấy số 4 trong dự án của mình: thường thì không có mục đích để có thêm quyền lực trong công ty, thay vào đó có những người luôn cố gắng tạo ra một giải pháp tổng quát hơn, ngay cả khi không cần thiết. Về phần 2, tôi sử dụng nó rất nhiều vì lý do chính xác mà bạn đã giải thích: IMHO ngay cả hàm hoặc phương thức nhỏ nhất cũng không nên đưa ra bất kỳ giả định nào về cách phần còn lại của mã hoạt động hoặc sẽ thay đổi. Thay vào đó, mã của tôi tuân theo mẫu đơn giản: "nếu đầu vào OK thì lỗi đầu ra khác". Điều này tuân theo nguyên tắc thiết kế chung để giảm thiểu phụ thuộc.
Giorgio

3
Bạn cũng quên: nhà phát triển xấu. Một số người đang viết mã, không nên và các quy trình đánh giá tốt không tồn tại ở nhiều cửa hàng.
Joe

20

Câu hỏi của tôi là. Có ai khác nhìn thấy mã như thế này? Kết luận của bạn là tại sao mã đó lại ở đó?

1) Có.

2) Trong các trường hợp tôi đã thấy, tôi sẽ đặt nó xuống:

  • Thiếu kinh nghiệm lập trình viên
  • Lập trình viên không hiểu một thiết kế đặc biệt phức tạp và / hoặc được thực hiện kém mà anh ta đang cố gắng sửa đổi
  • Lập trình viên bị gián đoạn ở giữa (nói) một bộ tái cấu trúc.
  • Sự bất cẩn

Bây giờ có lẽ tôi đang từ thiện về nó, nhưng cách tiếp cận chung của tôi là tốt hơn là tha thứ / không đối đầu về những điều này, hơn là chỉ tay và tiếp tục về chất lượng kém. Rõ ràng, mọi thứ có thể nhận được đủ xấu rằng cái gì đã được thực hiện , nhưng một di chuyển nhẹ nhàng đi đúng hướng là đủ.

Tất nhiên, bạn không thể thực hiện một cách tiếp cận như vậy nếu chất lượng / sai lầm sẽ ảnh hưởng nghiêm trọng đến "doanh nghiệp". Nhưng trong tình huống đó, bạn cần đánh giá mã bắt buộcsiêng năng về mọi thứ, kết hợp với một quy trình kiểm tra toàn diện.


Theo kinh nghiệm của tôi, mọi người có xu hướng "chặt chẽ" về mã chất lượng kém (ít nhất là một phần) vì nó vi phạm các tiêu chuẩn cá nhân của họ. Tất cả đều rất tốt để (cá nhân) phấn đấu cho sự hoàn hảo, nhưng hơi bất hợp lý khi chiếu tiêu chuẩn cá nhân của bạn lên người khác. Bằng âm thanh của sự vật (ví dụ từ bản chất của các ví dụ của bạn), đây là những gì bạn đang làm.

IMO, điều này không hiệu quả, và không có lợi cho mối quan hệ làm việc tốt với đồng nghiệp của bạn.


+1 Đang gõ một phản hồi và thấy bạn liệt kê khá nhiều lý do tôi sẽ đề cập.
canadiancreed

+1 để được từ thiện. Sửa lỗi của ai đó mà không chỉ tay và đồng nghiệp của bạn sẽ tôn trọng cả kỹ năng kỹ thuật và kỹ năng con người của bạn. Harangue tác giả cho mã ngu ngốc của họ và đồng nghiệp của bạn sẽ phẫn nộ với cách tiếp cận của bạn và giảm khả năng của bạn.
Caleb

13

Tất cả những điều đó thường là triệu chứng của một dự án bao nhiêu tuổi.

 1. Phương thức hoặc hàm gọi mà không làm gì có giá trị. Có rất nhiều lần khi một số mã chỉ đơn giản là như vậy (hy vọng với một cảnh báo không được chấp nhận lớn , nhưng vì hầu hết các ngôn ngữ không có cảnh báo đó, nên nó không luôn luôn tuân theo ...) bởi vì, tại một thời điểm, nó đã phục vụ một số mục đích thực sự và không ai biết điều gì có thể xảy ra nếu các dòng vi phạm bị xóa.

Tôi dường như nhớ điều này từ Dailywtf:

@deprecated // he might have been crazy enough to use reflection...
boolean getTrue() {
    return false; 
}

 2. Kiểm tra dự phòng được thực hiện trong một tệp lớp, đối tượng hoặc phương thức riêng biệt. Các lớp giao tiếp cũng không hoàn hảo (đã từng đọc Tháng người đàn ông thần thoại? Nếu không, bạn đang làm gì trên máy tính!? Đi! ĐỌC!). Thông thường, một người sẽ làm việc với một cái gì đó và sau đó rời khỏi dự án, và sau đó anh chàng tiếp theo, tìm thấy một số lỗi kỳ lạ, ném một kiểm tra thêm ở đây và ở đó để cố gắng loại bỏ nó. Khi lỗi được xóa, kiểm tra sẽ không bởi vì, nếu nó không bị hỏng, đừng sửa nó.

 3. nếu tuyên bố luôn luôn đánh giá là đúng. Oh, tôi đã làm điều này. Tôi đã nhận được một dự án một lần, nó có một loạt các khối có thể là 10-15 nếu / khác . Để thay đổi hành vi, tôi chỉ cần đặt một true||khối ở khối đầu tiên. Mãi đến tháng (năm?) Sau đó tôi mới quay lại và nói: "Ồ, wow, mã này được cho là đã bị phá hủy nhưng không bao giờ được"

 4. Chủ đề quay vòng và không có gì đáng chú ý. Tôi có thể tưởng tượng một dòng suy nghĩ sẽ như thế này:

  1. Tôi biết! Tôi có thể xử lý hai vấn đề này một cách đồng bộ! Tôi sẽ tạo chủ đề foo và thanh.
  2. (hai tháng sau) Huh, bạn biết đấy, chức năng từ thanh tốt hơn một chút trong foo. Tôi sẽ chuyển một số.
  3. (một năm sau) Bạn biết đấy, việc đưa những thứ khác từ quán bar vào foo có ý nghĩa.
  4. (nhiều, nhiều năm sau) "Này, barchủ đề này không giống như nó đang làm gì cả, chúng ta có thể gỡ bỏ nó không?" "Tốt hơn không, nó đã ở đó nhiều năm rồi ..."

5
+1 cho "Tốt hơn là không, nó đã ở đó nhiều năm rồi ..." - điều này xảy ra lặp đi lặp lại. Sợ loại bỏ vì sợ hậu quả ("Làm thế nào để chúng tôi kiểm tra rằng chúng tôi đã không phá vỡ một cái gì đó" - đặc biệt là nếu không có thử nghiệm đơn vị xung quanh).
quick_now

11

Tôi là một người lạc quan hơn một chút. Tôi nghĩ rằng những gì bạn đã giải thích thường xảy ra khi mã được tái cấu trúc một cách bất cẩn.


13
Mặc dù khó, nhưng Đừng bao giờ gán cho Malice những gì có thể được giải thích bằng Sự ngu ngốc.
Bruce Ediger

8

Các nghiên cứu sinh cũ kể cho tôi về một thời gian khi các chuyên gia tư vấn trả tiền bằng số dòng mã họ sản xuất. Và do đó, họ tối đa hóa lợi nhuận bằng cách sử dụng các công trình dài hơi đáng kinh ngạc.

Ngày nay tôi luôn cho rằng anh chàng vẫn đang học ngôn ngữ trong khi làm việc. Và anh ấy đang vội.


Nói về việc cắt mũi để làm cay khuôn mặt của bạn. Tôi đoán nó ổn nếu bạn không bao giờ phải xem lại mã.
JeffO

6

Hầu hết các câu trả lời đều tập trung vào hai sự kiện đơn giản sau:
[1] Mã phản ánh lịch sử của mã và
[2] Mã phản ánh tương lai dự kiến ​​của mã.

Tôi có các chức năng bằng văn bản không có giá trị gì, TRONG MÔI TRƯỜNG ỨNG DỤNG HIỆN TẠI được đưa ra CÁC THÔNG SỐ KỸ THUẬT HIỆN TẠI, nhưng có thể cần thiết trong tương lai.

Tôi đã viết if-statement rằng, TẠI HIỆN TẠI, luôn luôn đánh giá là đúng. Nhưng có lẽ trong quá khứ nó có thể là sai.

Đối với séc dự phòng, hey, tôi không tin tưởng vào mã khác, tôi thậm chí không tin mã của riêng mình. Nếu một mô-đun phụ thuộc vào N là 1 hoặc 2 hoặc 3, thì tốt hơn hết là đảm bảo điều đó, và sụp đổ một cách không chính thức nếu không. Đó là bất hợp pháp cho Mô-đun B phát nổ vì Mô-đun A bị hỏng; Mô-đun B khá phàn nàn rằng Mô-đun A bị hỏng. Và hãy nhớ rằng, vào tháng tới, tham số đó có thể đến từ Mô-đun chưa được đăng ký C.


1
Tôi gọi đó là mã hóa xấu. Bạn hy vọng rằng bạn sẽ cần nó trong tương lai, nhưng điều đó hiếm khi xảy ra. YAGNI. Viết một cái nếu luôn luôn đánh giá là đúng là lãng phí công sức và làm cho người đó phải thêm chức năng hoàn toàn khác nhau để bắt đầu. Thông số đó đến vào tháng tới có thể đợi đến tháng sau để được thêm vào. Mã lộn xộn NGAY BÂY GIỜ là vô nghĩa.
Andy

1
if (ngôn ngữ = 'en' hoặc ngôn ngữ = th ') - có thể tháng tới chúng tôi sẽ thử tiếng Trung? if (! isset ($ TITLE)) - tất cả các mô-đun được CUNG CẤP để đặt $ TITLE, nhưng có thể ai đó một ngày nào đó đánh vần sai. if (file_exists ($ TARGET)) - mã tốt sẽ tạo tệp rồi, nhưng có thể có lỗi hệ thống và nó không được tạo. Mã giao diện PHP / MySQL tiêu chuẩn của tôi luôn kiểm tra lỗi, mặc dù tôi chưa bao giờ bắt gặp lỗi nào.
Andy Canfield

3

Tôi đã thấy điều này một vài lần, trên thực tế chỉ mới ngày hôm qua, tôi đã hợp nhất một số mã của ông chủ vào ứng dụng mới của mình. Trong trường hợp của anh ta, đó chỉ là sự thiếu kỹ năng và hiểu biết chung và niềm tin rằng anh ta nghĩ rằng anh ta là một nhà phát triển lành nghề.

'Phương thức hoặc hàm gọi mà không làm gì có giá trị.' và 'nếu các câu lệnh luôn luôn đánh giá là đúng' là một vấn đề lớn với mã của anh ấy.


3

Tôi nghi ngờ rằng mặc dù nhiều người đã nhìn thấy mã có những vấn đề này, nhưng rất ít người muốn viết giống như vậy. Trong tất cả khả năng, những gì bạn đang thấy là phần mềm bị tích lũy - ai đó thêm vào một thứ gì đó không thực sự hoạt động, nhà bảo trì tiếp theo thêm mã bảo vệ trong chuỗi để bảo vệ chống lại tình trạng không được kiểm tra chính xác trong lần đầu tiên địa điểm; sau đó ai đó nhận được một báo cáo vấn đề và thêm nhiều bộ giáp hơn chống lại một trường hợp cụ thể của một vấn đề; một người khác thêm kiểm tra tổng quát hơn và quên xóa một số mã cũ đã thêm trước đó, xử lý các triệu chứng cụ thể hơn, v.v.

Sau đó, có vấn đề về dọn dẹp mã: không có khuyến khích cụ thể nào để loại bỏ mã dường như là mã chết và khuyến khích rất lớn là không làm điều đó, bởi vì nếu bạn không hiểu mã hoàn toàn, đánh giá của bạn rằng mã "đã chết" sẽ thiếu sót, và bạn sẽ phá vỡ hệ thống.


2
  • Phương thức hoặc hàm gọi mà không làm gì có giá trị.

Không hẳn là xấu. Các phương thức trong một lớp cơ sở thường gọi các phương thức rỗng có nghĩa là các điểm ghi đè cho các lớp con. Ví dụ: UIView của Cốc Cốc có một -didAddSubview:phương pháp được ghi nhận là không làm gì trong phiên bản mặc định. -addSubview:Phương thức của UIView phải gọi -didAddSubview:ngay cả khi nó không làm gì cả vì các lớp con có thể thực hiện nó để làm một cái gì đó. Các phương pháp không làm gì và lý do cho chúng nên được ghi lại, tất nhiên.

Nếu một chức năng / phương thức trống rỗng hoặc vô dụng rõ ràng là có lý do lịch sử, thì nó nên được loại bỏ. Hãy xem các phiên bản trước của mã trong kho lưu trữ mã nguồn của bạn nếu bạn không chắc chắn.

  • Kiểm tra dự phòng được thực hiện trong một tệp lớp, đối tượng hoặc phương thức riêng biệt.

Thật khó để nói nếu điều đó ổn mà không có bối cảnh. Nếu việc kiểm tra được thực hiện rõ ràng vì cùng một lý do, điều đó có nghĩa là không có sự phân tách trách nhiệm rõ ràng và một số tái cấu trúc được yêu cầu, đặc biệt là khi cả hai kiểm tra đều dẫn đến cùng một hành động. Nếu hành động do cả hai kiểm tra không giống nhau, thì hai kiểm tra có thể được thực hiện vì những lý do khác nhau ngay cả khi điều kiện giống nhau và điều đó có thể ổn.

  • nếu báo cáo luôn luôn đánh giá là đúng.

Có một sự khác biệt lớn giữa:

if (1) {
    // ...
}

và:

if (foo() == true) {
    // ...
}

nơi foo()luôn xảy ra để trở về true.

Trường hợp đầu tiên xảy ra rất nhiều khi mọi người đang gỡ lỗi. Thật dễ dàng để sử dụng một if (0) {...để tạm thời loại bỏ một đoạn mã trong khi bạn đang cố gắng để cô lập một lỗi, và sau đó thay đổi 0để 1khôi phục lại mã đó. Tất nhiên, ifnên xóa đi một khi bạn đã hoàn thành, nhưng thật dễ dàng để quên bước đó hoặc bỏ lỡ một hoặc hai nếu bạn đã thực hiện ở một vài nơi. (Đó là một ý tưởng tốt để xác định các điều kiện như vậy với một nhận xét mà sau này bạn có thể tìm kiếm.) Tác hại duy nhất là sự nhầm lẫn mà nó có thể gây ra trong tương lai; nếu trình biên dịch có thể xác định giá trị của điều kiện tại thời điểm biên dịch, nó sẽ loại bỏ hoàn toàn.

Trường hợp thứ hai có thể được chấp nhận. Nếu điều kiện được biểu thị bằng foo()cần phải được kiểm tra từ một số vị trí trong mã, thì việc đưa nó vào một hàm hoặc phương thức riêng biệt thường là điều nên làm ngay cả khi foo()luôn luôn đúng. Nếu nó có thể hiểu được foo()cuối cùng có thể quay trở lại false, thì cách ly điều kiện đó trong một phương thức hoặc hàm là một cách để xác định tất cả các vị trí mà mã dựa vào điều kiện đó. Tuy nhiên , làm điều đó sẽ tạo ra một số rủi ro rằng foo() == falsetình trạng này sẽ không được kiểm chứng và có thể dẫn đến các vấn đề sau này; giải pháp là đảm bảo rằng bạn thêm các bài kiểm tra đơn vị kiểm tra rõ ràng falsetrường hợp.

  • Chủ đề mà quay đi và không có gì đáng chú ý.

Điều này nghe có vẻ như là một tạo tác của lịch sử và một cái gì đó có thể được xác định hoặc trong quá trình xem xét mã hoặc thông qua hồ sơ định kỳ của phần mềm. Tôi cho rằng nó có thể được tạo ra một cách có chủ ý, nhưng tôi có một thời gian khó tưởng tượng rằng ai đó thực sự sẽ làm điều đó trên mục đích.


1

Nó xảy ra. Khá thường xuyên thực sự.

Đôi khi những ngõ cụt mã hóa này giống như những con đường mòn cũ đã bị phá hủy khi một đường cao tốc hiệu quả / hiện đại / nhanh hơn đã được lắp đặt xung quanh chúng.

Trong các trường hợp khác (và tôi có thể phạm tội về điều này), chúng là nền tảng để mở rộng phần mềm khi yêu cầu một bộ tính năng / chức năng ngắn gọn nhưng chưa được xác nhận. (Đôi khi đưa vào một chút công việc trong bản dựng ban đầu cung cấp tay cầm và tương tự cho công việc sau này mà bạn dự định "chốt" có thể giúp cuộc sống dễ dàng hơn, khi nó xảy ra, hoặc khó khăn / lộn xộn hơn nếu công việc tiếp theo không quyết định.)

Và, rất nhiều điều trực tiếp là do "Nếu nó không bị hỏng, không phù hợp với nó." Đôi khi, việc xé mã mà bạn không hiểu hoặc tin là không được sử dụng có thể gây ra phiên bản lập trình của "Hiệu ứng cánh bướm". Đã có điều đó xảy ra một hoặc hai lần quá.


1

Đôi khi tôi sẽ có một boolean toàn cầu được đặt thành true và sau đó trong mã của tôi là if (bool), sau đó trong thời gian chạy, tôi có thể đặt một điểm dừng tại câu lệnh if và chuyển boolean để kiểm tra cái gì đó.


0

Tôi phản đối các if truetuyên bố được phân loại bừa bãi là "mã vô nghĩa".

Có một trường hợp hợp pháp để sử dụng một if (1) { ... }khối trong mã C muốn tương thích với tiêu chuẩn C đã khăng khăng các định nghĩa biến là ở đầu hàm hoặc chỉ muốn các biến cục bộ được xác định là cục bộ nhất có thể.

switch (i) {
    case 23:
        if (1) {
            /* I can declare a local var here! */
        }
        break;
}

5
Không cần 'nếu (1)', tại sao không chỉ có khối?
FigBug

3
Cả C / C ++ và C # và tôi khá chắc chắn Java (cũng như nhiều ngôn ngữ tương tự khác) cho phép các khối câu lệnh ẩn danh; Không cần cho một if, whilehoặc cấu trúc tương tự. Nó không chắc là rất sạch sẽ, nhưng nó chắc chắn được cho phép theo thông số ngôn ngữ.
một CVn

0

Một giáo sư của tôi liên quan đến một câu chuyện với chúng tôi vào một ngày mà một chủ nhân trước đó sẽ trả cho họ dựa trên số lượng dòng họ đã hoàn thành. Vì vậy, họ đã viết một vài chục hàm xếp hàng không bao giờ được gọi. Có vẻ như một lý do tuyệt vời để viết mã vô nghĩa.


0

Như @Andy đã đề cập, một thành phần lớn mà tôi đã thấy đang phá vỡ YAGNI .

Ai đó bắt đầu với một giả định về tất cả các yếu tố sẽ thay vì những gì nhiều yếu tố có thể cần , đó là một sự nhầm lẫn của các mối quan hệ "là một""có" .

Sự nhầm lẫn này dẫn đến một cấu trúc thừa kế cứng nhắc và sau đó chúng là các phương thức không được thực hiện bởi vì chúng không bao giờ thực sự được gọi, logic lặp đi lặp lại trong đó các phần cần phải điều chỉnh và chỉ là các quy trình công việc kỳ lạ không phù hợp với mô hình kinh doanh.

Giống như nhiều người khác ở đây, tôi chưa thấy điều này được thực hiện một cách ác ý, nhưng vì thiếu kiến ​​thức về thiết kế tốt và nỗ lực để làm cho nó trông giống như vậy với người khác. Thật buồn cười, có vẻ như các nhà phát triển thậm chí ít hiểu biết hơn dường như làm tốt hơn về vấn đề này, bởi vì ít nhất mã của họ không kết thúc quá nhiều quảng cáo được thiết kế quá mức. ( Nguyên tắc KISS )

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.