Tiêu chuẩn mã hóa tồi tệ nhất bạn từng phải tuân theo? [đóng cửa]


77

Bạn đã bao giờ phải làm việc theo các tiêu chuẩn mã hóa rằng:

  • Giảm đáng kể năng suất của bạn?
  • Ban đầu được bao gồm vì lý do tốt nhưng được giữ lâu sau khi mối quan tâm ban đầu trở nên không liên quan?
  • Đã ở trong một danh sách dài đến mức không thể nhớ hết tất cả?
  • Làm bạn nghĩ rằng tác giả chỉ đang cố gắng để lại dấu ấn của họ hơn là khuyến khích thực hành mã hóa tốt?
  • Bạn không biết tại sao chúng được bao gồm?

Nếu vậy, quy tắc yêu thích ít nhất của bạn là gì và tại sao?


Một số ví dụ ở đây


4
Trước đây, tôi đã hỏi một câu hỏi tương tự (nhưng không hoàn toàn giống nhau) trên SO: stackoverflow.com/questions/218123/ợi
Brian R. Bondy

@Brian, cảm ơn, tôi đã thấy câu hỏi của bạn nhưng quên nó.
Finnw

4
Vấn đề thực sự với các tiêu chuẩn mã hóa là thời gian và công sức lãng phí khi tranh luận về việc liệu chúng có đúng hay không. Không gì có thể đánh bại một cuộc chiến tóc xoăn tốt để tạo ra xung đột nội bộ ...
MZB

Câu trả lời:


97

Điều này có thể xù một vài chiếc lông vũ, nhưng các tiêu chuẩn bắt buộc các bình luận khối templated ở đầu mỗi phương pháp luôn làm tôi khó chịu.

1) Chúng luôn bị lỗi thời vì chúng ở quá xa mã thực hiện công việc thực tế cần chú ý khi bạn cập nhật mọi thứ. Bình luận xấu tệ hơn là không có bình luận.

2) Họ thường chỉ lặp lại thông tin đã có sẵn công cụ kiểm soát nguồn, chỉ kém chính xác. Ví dụ: Sửa đổi lần cuối bởi, danh sách ngày / lý do sửa đổi.


12
Tôi thấy (ít nhất là bây giờ, trước đó ở trường có vẻ kỳ lạ) rằng Nhận xét hoàn toàn là một thực hành tồi
Shady M. Najib

14
Không chỉ vậy mà tôi còn thấy rằng chi phí liên quan đến việc tạo một tệp lớp mới khi bạn phải đặt một khối nồi hơi ở trên cùng thực sự ngăn cản các nhà phát triển tạo ra các lớp mới và khuyến khích các lớp khó sử dụng và do đó thiết kế tồi.
Gaz

13
Không đồng ý! Chúng tôi không thêm thông tin reduntand quặng vô dụng, nhưng một lời giải thích bằng văn bản thực tế về chức năng làm gì (trong tệp .h) và nó rất hữu ích! Tất nhiên chúng tôi cam kết duy trì nó đồng bộ với mã.

5
@Shady M Najib xấu luôn hay xấu khi được phép đi không kiểm soát / không rõ ràng? Nói chung, mã tốt sẽ làm cho mục đích của nó đủ rõ ràng để tránh sự cần thiết phải bình luận - nhưng điều đó không phải lúc nào cũng đúng và tôi cảm thấy rằng trong các kịch bản này, việc bình luận là rất quan trọng. Tôi không thể nghĩ ra một lý do xấu nào để đưa vào các bình luận XMLDoc.
Nathan Taylor

7
Một khối giải thích những gì nó làm là tốt. Một khối chỉ đơn giản lặp lại các loại và tên của các đối số và giá trị trả về là xấu. Khi tôi phải làm việc với một tiêu chuẩn bắt buộc sau này, tôi đã viết một tập lệnh emacs để tự động tạo ra phần lớn của nó.
HỎI

130

Có một giáo sư đã từng yêu cầu chúng tôi có ít nhất một nhận xét cho mỗi dòng mã.

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

Nó thật là nực cười.


10
Đây không phải là chỉ để giáo sư biết rằng bạn biết chính xác những gì đang xảy ra?
John MacIntyre

80
Tôi nghĩ rằng nó rõ ràng những gì đang xảy ra, và nó không phải là giáo dục.
Dan Ray

18
Ví dụ bạn có ở trên là rõ ràng, nhưng nếu một sinh viên sao chép một số chức năng gọi từ một ứng dụng khác hoặc một cuốn sách hoặc những gì đã từng và không thực sự hiểu nó thì sao? Làm thế nào các prof sẽ biết? Quy tắc ngu ngốc này không cho phép bất kỳ khu vực màu xám nào (mà trong phòng thủ của anh ta, có lẽ đã bị lạm dụng trước đó). Đó là cách tôi diễn giải điều này. ... phiền bạn nếu tôi thấy điều này trong một môi trường phi học thuật, nó có thể làm tôi sợ một chút. ;-)
John MacIntyre

4
Vâng, ngoại trừ bạn luôn có thể viết bình luận chỉ lặp lại mã và không thể hiện bất kỳ sự hiểu biết nào. Anh ấy có làm bạn đúng "// Kết thúc cú đúp" trước khi kết thúc cú đúp không?
thay thế

6
Điều gì nếu bạn vô tình có một nhận xét hữu ích trong mã của bạn? Bạn có cần phải đặt // commenttrên dòng trước đó?
cấu hình

103

Tiêu chuẩn mã hóa của công ty chúng tôi (C #) được yêu cầu sử dụng rộng rãi #REGIONs (đối với những người không biết, nó đánh dấu các khối mã nguồn sẽ được ghép vào một dòng trong Visual Studio). Kết quả là, bạn luôn mở một thứ có vẻ là một lớp có cấu trúc độc đáo, chỉ để tìm những đống rác được quét dưới những tấm thảm được xây dựng sâu của các công trình #REGION. Bạn thậm chí có các vùng xung quanh các dòng đơn, ví dụ: phải gấp ra một vùng LOG để tìm một khai báo của Logger. Tất nhiên, rất nhiều phương pháp được thêm vào sau khi một số khu vực được thực hiện, cũng được đặt trong phạm vi khu vực "sai". Kinh dị. Kinh dị.

Khu vực là một trong những tính năng tồi tệ nhất từng được thêm vào Visual Studio; nó khuyến khích cấu trúc bề mặt hơn là cấu trúc OO thực tế.

Ngày nay, tôi giết #REGIONs trong tầm nhìn.


11
Tôi đã cố gắng bỏ phiếu này hàng chục lần ...
TGnat

22
Nếu bạn nghĩ rằng bạn cần #REGION, tôi nghĩ bạn cần cấu trúc lại.
Jay Bazuzi

23
Tôi thường tổ chức mã theo vùng thành các hàm tạo, thuộc tính, sự kiện, phương thức và thành viên. Nó làm cho việc quản lý và điều hướng nguồn trở thành một cinch (đặc biệt là trong một số lớp tiện ích tĩnh có thể phát triển khá lớn). Tôi sẽ không sử dụng chúng nhiều hơn thế.
Evan Plaice

26
Chúng tôi có một tiêu chuẩn mã hóa đơn giản: không bao giờ làm tổ. Chỉ cần sử dụng chúng để nhóm các phương thức liên quan (khởi tạo, tuần tự hóa, thuộc tính, v.v.)
Jason Williams

6
Mục đích tốt duy nhất của #regions là ẩn mã không cần chỉnh sửa . Đó có thể là mã được tạo hoặc mã với thuật toán khó lấy đúng mà bạn muốn mọi người không chạm vào hoặc có thể là các khối mã gỡ lỗi xấu. Nhưng không phải mã mà mọi người sẽ làm việc. Đối với những người bị mắc kẹt trong một cửa hàng #region, tôi có một macro thu gọn các định nghĩa nhưng mở rộng các vùng. Xem tại đây: stackoverflow.com/questions/523220/awclaw-visual-studio-macros/
mẹo

80

Trong một công việc, chúng tôi buộc phải sử dụng một số dạng ký hiệu Hungary kỳ lạ trong cơ sở dữ liệu.

Tôi không thể nhớ chi tiết, nhưng từ bộ nhớ, mỗi tên trường phải chứa:

  • Không có nguyên âm
  • Tất cả chữ in hoa
  • Tham chiếu đến bảng
  • Một chỉ báo loại dữ liệu
  • Độ dài dữ liệu
  • Một chỉ số vô hiệu

Ví dụ: cột chứa tên của một người có thể được gọi là: PRSNFRSTNMVC30X(Bảng người, cột Tên, 30 ký tự, Không phải là số không)


14
Xin lỗi, nhưng điều gì xảy ra khi bạn cấu trúc lại cơ sở dữ liệu hoặc khi bạn quyết định rằng độ dài của VARCHAR cần phải khác nhau. Đột nhiên, bạn phải duyệt tất cả mã của mình và thay đổi ... trời ơi. Trông thật kinh khủng.
Tom Morris

71
Không có nguyên âm ??! Bạn đang đùa phải không?
Daniel Cassidy

39
Có phải những người thực thi tiêu chuẩn này có những đường vân trên trán và thường thảo luận về danh dự và trận chiến?
Ryan Roberts

10
Haha, họ là DBA, nên ...;)
Damovisa

14
Bạn nên gửi tên cột của mình thông qua một công cụ rút gọn url. PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover

48

Nhấn mạnh rằng tất cả các niềng răng được theo sau bởi nhận xét cho những gì niềng răng kết thúc:

ví dụ:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
Đáng tin cậy hơn: nếu bạn cần một bình luận để nói phần đầu của khối là gì, thì khối đó quá dài hoặc nội dung của nó quá phức tạp => refactor.
Richard

5
Tôi muốn bỏ phiếu xuống, bởi vì các khối dài, lồng nhau sâu có thể khó sắp xếp, và những bình luận này có thể giúp ích. Tôi muốn bỏ phiếu, vì những bình luận đó sẽ trở nên sai (và rất khó hiểu) khá sớm, và bởi vì các khối dài, lồng nhau sâu là một dấu hiệu bạn cần để cấu trúc lại, không thêm bình luận.
Jay Bazuzi

7
đó là một ý tưởng tuyệt vời cho một thế giới không có IDE mạnh mẽ.
IAd CHƯƠNG

9
@Jay trong bất kỳ IDE tốt nào bạn có thể làm nổi bật một dấu ngoặc nhọn và nó sẽ làm nổi bật dấu ngoặc tương ứng khác. Cá nhân tôi rất ghét khi mọi người làm điều này.
Evan Plaice

3
Mặc dù ví dụ của bạn là một chút về khía cạnh điên rồ (vì chúng không đủ dài để nó quan trọng và sẽ làm bạn chậm lại khi thay đổi logic), nhưng điều này không phải lúc nào cũng là điều xấu. Nhận xét như thế thực sự hữu ích cho việc đóng khai báo không gian tên / endif bao trùm toàn bộ tệp.
jsternberg

38
#define AND  &&
#define OR   ||
#define EQ   ==

'nuff nói.


9
Sẽ không #include <iso646.h> là sự lựa chọn tốt hơn nhiều?
AndrejaKo

3
@AndrejaKo: điều này có trước <iso646.h>; đây là một nỗ lực để làm cho C trông giống FORTRAN.
Niall C.

2
Đây thực sự là một tiêu chuẩn mã hóa? tức là có một chính sách công ty chống lại việc viết các nhà khai thác trực tiếp?
vây

21
Nó cũng có #define BEGIN {#DEFINE END }?
JBRWilkinson

3
Điều đó làm tôi nhớ đến một bài báo WTF hàng ngày mà tôi thấy rằng có một số lập trình viên C ++ có rất nhiều định nghĩa để làm cho nó trông giống như Visual Basic (hoặc có thể chỉ là Basic, một số phương ngữ). #define void Sub, #define} Kết thúc, những thứ như thế.
Wayne Molina

37
  • Tên biến cục bộ đều là chữ thường không có dấu gạch dưới

Ví dụ thực tế: paymentmethodtotalshtml, contracttypechangecontexts, customsegmentspectexts,potentialmsceventref

Thời báo New York có trọng lượng :

Không gian Word Word không nên được chấp nhận. Tiếng Hy Lạp cổ đại, bảng chữ cái đầu tiên có nguyên âm, có thể được giải mã mà không có không gian từ nếu bạn phát âm ra và không có chúng. [Hoài] Tiếng Latin cũng vậy, đã ngừng phân tách các từ vào thế kỷ thứ hai. Mất mát là khó hiểu, bởi vì mắt phải làm việc nhiều hơn để đọc văn bản không tách rời. Nhưng như nhà cổ sinh vật học Paul Saenger đã giải thích, thế giới cổ đại không mong muốn 'làm cho việc đọc trở nên dễ dàng và dễ dàng hơn.'

3
+1. Những phiền toái nhỏ cộng lại. Ngoài ra, họ rất khó để tranh luận vì trình soạn thảo hoặc PM tiêu chuẩn mã hóa có thể nói "Đó không phải là gánh nặng lớn nên không đáng để thay đổi nó."
vây

1
Chính xác. (Mặc dù trong trường hợp này, việc đọc nhiều từ khóa giống như điều này có thể là adduptoquitoea greatburden.)
John Siracusa

57
Tự giải trí bằng cách phát minh ra tên hơn được phân tích hai cách. trang, dương vật, vv
Jay Bazuzi

4
@Jay * sexchange
cấu hình

2
@configurator: Khi nhóm trình gỡ lỗi Visual Studio đang làm việc trên một tính năng để cho bạn thấy ngoại lệ hiện đang bay trong cửa sổ đồng hồ, họ sẽ thêm một biến giả có tên là "$ ex". Chúng tôi đã không thông báo trong một thời gian dài. Sau đó, chúng tôi đổi tên thành "$ ngoại lệ", nhưng tôi vẫn đọc nó là có 's'.
Jay Bazuzi

36

Tôi đã hỏi bởi các nhà lãnh đạo phần mềm của một công ty để làm " đơn giản, tái n đang dundant ". Chẳng hạn, việc thêm một tham số mới vào một hàm hiện có đã bị cấm. Thay vào đó, bạn phải nhân đôi chức năng, để nguyên bản gốc không bị ảnh hưởng để tránh hồi quy. Không có thử nghiệm chính thức của khóa học (lãng phí thời gian).

Chúng tôi cũng bị cấm sử dụng phần mềm hợp nhất; mỗi tệp chỉ có thể được sửa đổi bởi một lập trình viên tại một thời điểm. Phần mềm kiểm soát sửa đổi là khoa học viễn tưởng, tất nhiên.

Ngày hạnh phúc nhất trong cuộc đời tôi là khi anh ấy bị sa thải (xem xét rằng việc sa thải ai đó ở Ý là rất, rất khó khăn).


anh ta có thể không bao giờ nghe thấy từ 'tái cấu trúc'
nanda

3
Anh ta chưa bao giờ nghe thấy nhiều từ khác ...
Wizard79

Chà, bạn không cần thử nghiệm chính thức vì bạn chưa bao giờ thay đổi phương pháp ...
cấu hình

36

Tất cả các tương tác với cơ sở dữ liệu phải được thực hiện thông qua các thủ tục được lưu trữ . Nó có thể có ý nghĩa nếu chúng ta sống vào năm 1997 chứ không phải năm 2010.

Tôi chỉ nhận ra rằng điều này thực sự bao gồm tất cả các tiêu chí của câu hỏi ban đầu:

  • Giảm đáng kể năng suất của bạn? KIỂM TRA. Vui lòng - chỉ cần sử dụng ORM .
  • Ban đầu được bao gồm vì lý do tốt nhưng được giữ lâu sau khi mối quan tâm ban đầu trở nên không liên quan? KIỂM TRA. Người quản lý là nhà phát triển cho một máy chủ cơ sở dữ liệu 1000 năm trước và đưa tiêu chuẩn mã hóa này vào.
  • Đã ở trong một danh sách dài đến mức không thể nhớ hết tất cả? KIỂM TRA. Điều này bao gồm 'càng nhiều logic nên được lưu trữ trong cơ sở dữ liệu càng tốt'.
  • Làm bạn nghĩ rằng tác giả chỉ đang cố gắng để lại dấu ấn của họ hơn là khuyến khích thực hành mã hóa tốt? KIỂM TRA. Tiếp tục quay trở lại người quản lý là một nhà phát triển máy chủ cơ sở dữ liệu cũ.
  • Bạn không biết tại sao chúng được bao gồm? KIỂM TRA.

2
Chúng tôi đã có một số người trong trại này tại nơi làm việc của tôi. Thật buồn cười khi họ cố gắng chơi thẻ hiệu suất và chứng minh sự hiểu biết của họ đã lỗi thời như thế nào
Tái lập lại

3
chờ đã .. trong tất cả sự nghiêm túc, tôi nghĩ SP của WERE tốt hơn, hiệu quả hơn so với các cuộc gọi SQL trực tiếp từ, nói, C #?
Sk93

3
Âm thanh như bạn biết chính xác lý do tại sao chúng được bao gồm. : P
Mason Wheeler

4
Khi tôi lớn lên, cuối cùng tôi cũng hiểu tại sao mọi thứ phải trải qua DB :) Nói một cách nghiêm túc, điều này đơn giản hóa rất nhiều thứ, đừng thử và phát minh lại bánh xe.
Jé Queue

3
Tôi đã nghe lý do đáng yêu "Chúng tôi không thể sử dụng OR / M vì tất cả các tương tác phải sử dụng SP". Như vậy là lãng phí sức người.
cấu hình

33

Không được phép sử dụng STL hoặc các thư viện C ++ tiêu chuẩn khác vì CTO tin rằng 'chúng tôi' có thể làm điều đó tốt hơn và nhanh hơn. Ngay cả các cấu trúc cơ bản như danh sách và lớp chuỗi.


5
Lần duy nhất tôi từng nghe nói về bất kỳ ai không sử dụng STL vì nó không đủ nhanh và đúng, là dành cho các trò chơi. EA đã tự thực hiện STL cho các trò chơi của họ. Tôi rất nghi ngờ nó còn quan trọng nữa (các trò chơi hiện đại bị hạn chế GPU) và tôi nghi ngờ họ sử dụng nó. Nhưng ngay cả khi đó, nó vẫn là một triển khai của STL, không phải là một thư viện hoàn toàn mới. Bạn vẫn đang sử dụng STL khi sử dụng EASTL.
Matt Olenik

1
@Matt: để thêm vào điều này, khiếu nại của EA tập trung vào việc sử dụng và khởi tạo bộ nhớ. Việc thực hiện riêng của họ tiêu tốn ít bộ nhớ hơn, giải phóng nó sớm hơn và tránh khởi tạo các đối tượng sẽ được khởi tạo sau đó.
Matthieu M.

Tôi sẽ bảo anh ta tự viết mã.
đúng vào

31

Ký hiệu Hungary

Mẫu được trích từ " Charles Simonyi khám phá quy ước đặt tên ký hiệu Hungary " trên MSDN.

1 #incolee làng sy.h
2 bên ngoài int * rgwDic;
3 bên ngoài int bsyMac;
4 cấu trúc SY * PsySz (char sz [])
6 {
7 char * pch;
8 int cch;
9 cấu trúc SY * psy, * PsyCreate ();
10 int * pbsy;
11 int cwSz;
12 dấu không dấu wHash = 0;
13 pch = sz;
14 trong khi (* pch! = 0
15 wHash = (wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy = & rgbsyHash [(wHash & 077777)% cwHash];
18 cho (; * pbsy! = 0; pbsy = & psy-> bsyNext)
19 {
20 char * szSy;
21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz;
22 pch = sz;
23 trong khi (* pch == * szSy ++)
24 {
25 nếu (* pch ++ == 0)
26 trở về (psy);
27}
28}
29 cwSz = 0;
30 nếu (cch> = 2)
31 cwSz = (cch-2 / sizeof (int) +1;
32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) - rgwDic;
33 Không ((int *) psy, cwSY);
34 bltbyte (sz, psy-> sz, cch + 1);
35 trở lại (psy);
36}

5
Ow ow ow ow ow ow ow!
Tái lập lại

22
Vấn đề lớn nhất với mẫu này là các tên biến vô nghĩa. Loại bỏ các tiền tố Hungary và một số trong số chúng dài 1 hoặc thậm chí 0 ký tự.
vây

8
Đây là Hệ thống, rất hữu ích trong các ngôn ngữ được gõ yếu (vì nó mã hóa thông tin loại quan trọng để làm việc trong các ngôn ngữ này trong tên) - nó vô dụng trong các ngôn ngữ được gõ mạnh. Thay thế tốt hơn cho các ngôn ngữ được gõ mạnh là Apps Hungary, mã hóa thông tin quan trọng về việc sử dụng biến (thành viên, con trỏ, dễ bay hơi, bộ chỉ mục) - thứ mà chính ngôn ngữ này không hỗ trợ.
Jason Williams

5
Ôi làm ơn. Tôi chưa bao giờ nhầm lẫn một người địa phương với một thành viên và tôi không sử dụng tiếng Hungary ngớ ngẩn đó cho các thành viên / người dân địa phương / lĩnh vực / bất cứ điều gì. Tôi nghĩ rằng chúng có thể hữu ích để phân biệt giữa các loại chuỗi khác nhau, như 'an toàn' và 'không an toàn', như ví dụ của Joel trong Tạo mã sai Nhìn sai
cấu hình

3
@configurator: Ví dụ của Joel là khủng khiếp, anh ta nên có các loại khác nhau, sau đó trình biên dịch sẽ thực thi việc sử dụng.
Matthieu M.

28

Tôi đã từng làm việc trong một dự án trong đó trưởng dự án bắt buộc rằng mọi biến số - MỌI biến - đều có tiền tố là "v". Vì vậy, vCount, vFirstName, vIsWarcill, v.v.

Tại sao? "Bởi vì chúng tôi đang làm việc trong VBScript và mọi thứ đều là Biến thể".

WTF.


93
Tôi đã từng làm việc trong một ngôn ngữ yêu cầu mọi biến - MỌI biến - được tiền tố là "$".

6
@nohat: Và bạn nhận ra rằng điều đó thật tuyệt vời phải không?
Josh K

Tôi đã từng làm việc trong một ngôn ngữ nơi tất cả các biến của tôi bắt đầu bằng dấu chấm câu như '$' hoặc '%' hoặc '@'. Tôi vẫn làm, bây giờ và sau đó.
David Thornley

3
Điều này chỉ thực sự trở thành một vấn đề khi bạn yêu cầu đặt ftrước các hàm, sau đó mã của bạn thực sự fUcked (vUp).
Joe D

1
Âm thanh giống như các phiên bản khác nhau của Perl ...

26

Hầu như quên mất điều này:

Trích dẫn từ một người quản lý:

Không sửa chữa hoặc ghi lại bất kỳ lỗi nào của các vấn đề bạn tìm thấy trong mã của riêng bạn. Khách hàng sẽ trả tiền cho chúng tôi để xác định và sửa chữa chúng trong vài năm tới.

Điều này không dành cho phần mềm tiêu dùng, nhưng tùy chỉnh cho một tổ chức lớn. Không cần phải nói, khách hàng đã trả tiền trong nhiều năm sau đó. Có thể có vẻ tầm thường, nhưng cố gắng bỏ qua các lỗi khó hơn tìm thấy chúng.


2
Đây là một chính sách khủng khiếp. Tôi hy vọng người quản lý này đã được đóng hộp.
Bernard

@ Bernard - Trong hầu hết các tổ chức tạo ra nguồn doanh thu dài hạn là cơ sở để quảng bá nhanh chóng. Hy vọng rằng, ai đó đã nhìn thấy sự điên rồ trong việc này và vô tình khiến anh ấy / cô ấy chạy qua bãi đậu xe.
Jim Rush

24

Nhận xét XML được thực thi trên tất cả các phương thức, hằng, enum và thuộc tính không riêng tư.

Nó đã dẫn đến một số mã khá lộn xộn, đặc biệt là vì kết quả cuối cùng là mọi người chỉ cần nhấn /// để tạo một bình luận trống cho mọi thứ hoặc cài đặt GhostDoc và thêm nó vào các bình luận được tạo tự động:

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[Chỉnh sửa] Lý do tôi đề cập đến điều này như một tiêu chuẩn lố bịch không phải vì tôi nghĩ các bình luận phương pháp là ngu ngốc mà vì chất lượng của các bình luận này không được thực thi theo bất kỳ cách nào và dẫn đến việc tạo ra rất nhiều sự lộn xộn trong các tệp mã . Có nhiều cách tốt hơn để tạo các tài liệu mã có ý nghĩa hơn là yêu cầu xây dựng "phải có một bình luận".


13
' Validations the handler' - uh-oh
Eric

8
+1 Tôi ghét điều này. Tôi nghĩ rằng nếu bạn sử dụng phần mềm để tạo bình luận thì bạn không cần chúng.
bleevo

9
Tôi không nghĩ rằng đây là một quy tắc xấu. Khi đọc một phương thức mà tôi phải duy trì lần đầu tiên, nó sẽ giúp ích rất nhiều nếu tôi có thông số kỹ thuật cho tất cả các đối số. Có các phép tính thông thường (ví dụ: điều gì xảy ra nếu đối số là null, nếu đó là một tập hợp trống, tên của tệp không tồn tại, v.v.) Một quy tắc tốt (IMHO) khác là tên phương thức nên là động từ nhưng trong ví dụ của bạn là danh từ.
Finnw

3
@finnw Tôi nghĩ đó là một thực hành tốt, nhưng là một tiêu chuẩn xấu. Nếu các nhà phát triển ở trên tàu và viết bình luận phương pháp có ý nghĩa khi họ được bảo hành (chi tiết ngoại lệ, v.v.), điều đó thật tuyệt. Nếu không, bạn kết thúc với một mớ hỗn độn lớn. Và trong trường hợp trước, bạn hoàn toàn không cần thực thi cấp biên dịch.
Adam Lear

7
Trường hợp cổ điển của giấy tờ. Những bình luận không nói lên điều gì khác biệt rõ ràng nên bị giết ngay lập tức.
Cumbayah

23

Không thực sự là một tiêu chuẩn mã hóa, nhưng chúng tôi đã có một tệp trong kiểm soát nguồn được gọi là 'changelog.txt'

Mỗi lần bạn thực hiện đăng ký, bạn phải tự thêm một mục vào tệp này. Mục nhập này là số sửa đổi lật đổ và nhận xét đăng ký của bạn.

Khi CTO mới bắt đầu và ai đó nói với anh điều này, anh đã nhanh chóng đưa ra quyết định điều hành và nói: "Chúng tôi sẽ không làm điều này nữa" và xóa tập tin. Điều này đã diễn ra trong nhiều năm.


6
Và không ai nhận ra svn log?
Htbaa

1
Những người bắt đầu chính sách đã mất từ ​​lâu và những người tiếp theo đã tiếp tục. Tôi bắt đầu trong cùng một tuần với CTO mới (bạn của tôi) và cả hai chúng tôi đã xem xét điều này và nói WTF?
Jim A

20

Một số nơi tôi từng làm việc khăng khăng đòi bình luận về mã không được sử dụng hoặc không dùng nữa thay vì xóa nó. Thay vì tin tưởng vào VCS cho lịch sử, v.v., nó được duy trì một cách đau đớn trong các tệp thông qua mã nhận xét.

Vấn đề lớn tôi tìm thấy với điều này là bạn thường không biết tại sao mã được nhận xét. Có phải bởi vì một số nhà phát triển đã tích cực thực hiện các thay đổi và muốn giữ nó xung quanh để tham khảo hoặc không còn cần thiết nữa?


3
Gần đây tôi đã xóa rất nhiều mã nhận xét cũ.
CoderDennis

2
Tôi thường xóa mã nhận xét trừ khi nó đi kèm với một lời giải thích tốt về lý do tại sao nó nhận xét và tại sao nó nên được giữ đúng vị trí.
Jeremy Wiebe

Tôi hoàn toàn đồng ý. Mã nhận xét miễn là bạn làm việc với nó là được, nhưng mọi thứ đi vào phiên bản phát hành / nhánh chính sẽ không có mã nhận xét. Có người nói với tôi rằng họ "thích biết làm thế nào nó có thể được thực hiện khác nhau". Tôi chỉ thấy khó chịu vì những lý do được đề cập: Đó có phải là lỗi thời, một cách giải quyết, một cách khác để làm điều đó? WTF
Anne Schuessler

Với VS2013 "Peek", đây là tất cả ngoài cửa sổ. Nhưng chúng tôi đã đưa ra một nhận xét có nội dung "Thay đổi phương trình - Chữ viết tắt" hoặc một cái gì đó, vì vậy ai đó tự hỏi mã cũ sẽ trông như thế nào trong TFS / VCS nếu họ cần. Vì vậy, nó là một dòng thay vì 10 dòng nhận xét. Nhưng VS2013 thật tuyệt vời, nó hiển thị lịch sử TFS ngay cho bạn.
Suamere

17

Tiêu chuẩn mã hóa tồi tệ nhất tôi từng tham gia là các cơ sở mã không có gì cả. Tôi thà tuân theo một tiêu chuẩn mã hóa mà tôi hoàn toàn không đồng ý hơn là làm việc trong các cơ sở mã nơi không có gì cả. Nó làm cho nó khó khăn hơn nhiều để tìm hiểu các phần mới của cơ sở mã.


16

Buộc nhận xét nội tuyến để kiểm soát phiên bản là về tiêu chuẩn mã hóa vô nghĩa nhất mà tôi bỏ qua.

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

Oracle DBA khăng khăng đòi sử dụng đúng khoảng trắng trong khi 'duy trì' cơ sở dữ liệu với bảng có nhiều tranh chấp có hơn 200 trường và 40 trình kích hoạt đến gần.


Điều đó thật đáng sợ
Evan Plaice

5
Mmm. Dim Sum ...
cấu hình

Tôi đã làm điều này, trước khi chúng tôi có quyền kiểm soát nguồn, tất nhiên. Khi chúng tôi đã kiểm soát nguồn, đó là một thói quen, thực tế chúng tôi cần một sự can thiệp để nhóm ngừng thực hiện nó. Cuối cùng, chúng tôi dừng lại và xóa tất cả những cái hiện có khi chúng tôi tìm thấy chúng.
Scott Whitlock

Nhà phát triển cấp cao của chúng tôi vẫn cố gắng buộc chúng tôi làm điều này. Tôi bỏ qua chính sách bất cứ khi nào tôi nghĩ rằng tôi có thể thoát khỏi nó (và đôi khi tôi biết tôi không thể).
Joshua Smith

Chúng tôi có một anh chàng trong nhóm của chúng tôi vẫn làm điều này ở mọi nơi (anh ấy cũng bao gồm những thứ "Nhật ký thay đổi" khổng lồ trên các tập lệnh SQL của chúng tôi cũng nằm dưới sự kiểm soát phiên bản). Đối số, như đã giải thích với tôi, là sau một vài thay đổi / cam kết bạn không nhớ ngày nào đó đã được thay đổi, vì vậy nhật ký thay đổi là tốt để thông báo ngay ai đã thay đổi điều gì và tại sao khi bạn mở tệp.
Wayne Molina

14

Tôi đã thực hiện đánh giá mã trên một dự án được dẫn đầu bởi bộ đếm thời gian đầu tiên của C ++, người quyết định rằng tất cả các hàm thành viên của lớp nên được thêm tiền tố với tên lớp và mức độ hiển thị:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
Bạn đã hỏi họ tại sao ? Tôi chỉ muốn biết động lực của họ ..
JBRWilkinson

1
Wow, tại sao anh chàng đó thậm chí sử dụng các lớp học ?
Mateen Ulhaq

9

Được yêu cầu thụt lề tất cả mã theo bốn khoảng trắng;)


2
Làm thế nào là xấu này?
Jay Bazuzi

1
Bởi vì sau đó mỗi dòng có 4 khoảng trắng không cần thiết ở đầu của nó?

Ồ, tôi hiểu rồi
thay thế

21
Vâng, StackOverflow có tiêu chuẩn mã hóa thực sự xấu. :-)
P Shved

Các vết lõm lớn buộc bạn phải giữ mức lồng nhau ở mức thấp. Tôi đã thấy thụt lề 8 và nó hoạt động tốt.
Toon Krijthe

9

Tôi đã có một công việc cách đây nhiều năm, nơi tất cả các mã của chúng tôi phải được căn trái - không thụt lề. Anh chàng đưa ra chính sách đó không thích phải cuộn qua lại theo chiều ngang khi xem những dòng mã dài, đánh đồng nó chơi bóng bàn bằng mắt.


Đó là một tiêu chuẩn mã hóa khủng khiếp, phải tuân theo. Và một lý do ngu ngốc cho nó, quá!
gablin

4
Nếu bạn cần cuộn theo chiều ngang (ví dụ: hơn nửa trang) thì có lẽ cũng có điều gì đó không ổn. Không thụt lề cũng không tốt vì nó làm cho mã hoàn toàn không thể đọc được. Tôi cố gắng tuân theo giới hạn 78 col, nhưng nếu được yêu cầu vượt quá số tiền đó tôi không bận tâm, nhưng tôi cố gắng tránh nó.
Htbaa

8

Đây là một ví dụ về việc không có các tiêu chuẩn mã hóa có thể gây tổn thương.

Một nhà thầu làm việc tại một ngân hàng lớn khẳng định rằng tuân theo các tiêu chuẩn là tốt nhất từ ​​trước đến nay. Ứng dụng này được viết bằng dBase / Clipper mà anh ấy là nhà phát triển duy nhất và tất nhiên anh ấy đã đưa ra tiêu chuẩn.

  • Tất cả mọi thứ là trong trường hợp trên. Ý tôi là tất cả mọi thứ, kể cả những bình luận hiếm hoi anh ấy đưa ra.
  • Không thụt.
  • Đặt tên biến là một cái gì đó dọc theo dòng của APRGNAME. A = phạm vi của biến, ví dụ P cho công khai, PRG = ba ký tự đầu tiên của tệp nguồn đã tạo biến, NAME = tên biến trong 6 ký tự còn lại mà dBase / Clipper cho phép.
  • 4 dòng đầu tiên và 4 dòng cuối của mã nguồn dài 80 *. Tại sao? Vì vậy, anh ta có thể nghe thấy máy in ma trận điểm bắt đầu và kết thúc việc in một tập tin. Bộ nhớ là toàn bộ chương trình được in qua máy tính lớn hàng tuần, 20.000 trang.
  • Tôi chắc chắn rằng có nhiều hơn nữa tôi đã xoay sở từ bộ não của mình.

Tôi là một lập trình viên tự học rất mới ở giai đoạn đó nhưng biết đủ để không nghe nhà khoa học điên và rời khỏi đó trước khi tôi yêu cầu tiếp quản dự án.

Và vâng, chúng tôi đã nói với ban quản lý rằng những thực tiễn này tệ đến mức nào nhưng luôn có thông thường "đã trả cho nhà thầu này đồng đô la hàng đầu, anh ta phải biết anh ta đang nói về điều gì".


7
Làm ơn đừng chế giễu những con khủng long già. Họ làm cho chúng tôi có thể.
P Shved

4
Âm thanh như bảo đảm công việc.
MIA

7
Có một điểm đánh dấu âm thanh để bạn biết khi nào mỗi tệp được in là khéo léo. Bây giờ tôi sẽ thêm \07vào đầu mỗi tập tin.
cấu hình

2
Sử dụng sơ đồ đặt tên như thế này (Không phải chữ hoa) có ý nghĩa như các quy tắc "phạm vi" biến của dBase là không tồn tại. Mọi thứ đều có hiệu quả toàn cầu. Một iđược sử dụng để lập chỉ mục một mảng trong một thủ tục có thể can thiệp ivào một thủ tục gọi. Bạn cần sử dụng PRIVATE ALL LIKE m*PRIVATE iđể ngăn chặn "bóng tối" này
Gerry

8

Một vụ nổ nữa từ quá khứ của tôi.

Trích dẫn từ chủ sở hữu công ty:

Sẽ không có mã được viết bằng các ngôn ngữ diễn giải vì tôi đã mất 25 triệu trong dự án {expletive} được viết bằng Java.

Dự án Java là một hệ thống giao dịch chứng khoán được thiết kế để xử lý vài chục cổ phiếu, hiện đang được sử dụng để xử lý hàng ngàn. Thay vì giải quyết các lỗi thiết kế hoặc phần cứng kém, toàn bộ công ty đã buộc phải chuyển đổi tất cả các ứng dụng không phải C / C ++ sang C / C ++, và tất cả sự phát triển mới phải có trong C / C ++. Các ngôn ngữ diễn giải có nghĩa là bất cứ thứ gì không được biên dịch và chủ sở hữu chỉ coi Trình biên dịch, C và C ++ được biên dịch.

Đối với một công ty 800 người, trong đó phần lớn mã là Java và Perl, điều này có nghĩa là toàn bộ công ty đã dành phần lớn thời gian của họ trong vài năm tiếp theo để viết lại mã hoàn toàn tốt trong C / C ++.

Buồn cười thay, khoảng hai mươi năm trước fiasco này, tôi đã ở một công ty khác, trong đó lãnh đạo công nghệ quyết định rằng logic sắp xếp của chúng tôi (đó là Bubble Sort) cần được mã hóa lại trong trình biên dịch thay vì được thay thế bởi Quick Sort vì - Thuật toán thực hiện không cải thiện hiệu suất. Cách duy nhất để cải thiện hiệu suất là viết lại logic tương tự trong trình biên dịch chương trình.

Trong cả hai trường hợp, tôi đã rời đi ngay sau khi các mệnh lệnh đi xuống.


Là một trong hai công ty vẫn còn hoạt động ngày hôm nay?
vây

Cái mà 'di chuyển' khỏi Java là, cái kia đã biến mất từ ​​lâu. Họ không bao giờ sống sót khi chuyển từ TRS-80 sang PC.
David B

6

Giống như nhiều lập trình viên (nhưng không đủ), tôi ghét trang trí mã. Nó làm tôi bực mình khi tôi phải sử dụng tiền tố ký hiệu đô la ($) cho tên biến hoặc dấu gạch dưới cho các biến riêng tư, ngay cả khi không có getters / setters. Nếu bạn cần trang trí mã của bạn để hiểu nó, thì bạn cần phải thoát khỏi địa ngục!


Chà, như "Will" nói, "Tôi trả trước với dấu gạch dưới để các biến riêng tư của tôi được nhóm trong intellisense của tôi. Tuy nhiên, tôi chỉ làm điều này cho các biến trong phạm vi một loại. Biến được khai báo trong một phương thức hoặc phạm vi hẹp hơn tôi để lại dấu gạch dưới tắt. Làm cho nó dễ dàng tách chúng ra và giữ các biến ít được sử dụng cùng nhau. " và tôi phải đồng ý với anh ta.
7wp

1
Tôi không nghĩ việc nhóm các biến của bạn lại với nhau trong IDE độc quyền yêu thích của bạn là một lý do đủ tốt để làm mất tất cả mã của bạn.
Adam Harte

Nếu đó là mã của bạn, làm cho nó có thể sử dụng được trong IDE của bạn có vẻ hoàn toàn hợp lý. Ngoài ra, việc chuẩn bị dấu gạch dưới là phổ biến trong nhiều ngôn ngữ, vì vậy bất cứ khi nào mọi người nhìn thấy nó, họ đều biết ý nghĩa của nó.
rjmunro

1
+1 Sử dụng một IDE tốt (một IDE có thể sử dụng tìm kiếm regex ) có ý nghĩa hơn đối với tôi. Scratch IDE, học cách sử dụng trình soạn thảo văn bản và thiết bị đầu cuối và bạn sẽ trở thành một lập trình viên tốt hơn nhiều. Là một lưu ý phụ, tôi không đặc biệt thích các sigils perl, nhưng ít nhất chúng có công dụng, không giống như các PHP.
thay thế

6
Thở dài ... một trong những người khác "IDE dành cho pussies".
Thợ làm móng

6

Tôi đã làm việc với một hệ thống web trong một thời gian mà tất cả các tham số được truyền phải được đặt tên là P1, P2, P3, v.v. Không có cơ hội nào để biết chúng ở đâu mà không có tài liệu mở rộng.

Ngoài ra - mặc dù không hoàn toàn là một tiêu chuẩn mã hóa - trong cùng một hệ thống, mỗi tệp duy nhất được đặt tên là xyz0001.ext, xyz0002.ext, xyz0003.ext, v.v. - trong đó xyz là mã cho chính ứng dụng.


6

Đây là một thời gian dài trước đây - chính xác là năm 1976. Sếp của tôi chưa bao giờ nghe về Edsger Dijkstra hoặc đọc một vấn đề về CACM, nhưng anh ta đã nghe một tin đồn từ đâu đó rằng "GOTO là xấu", vì vậy chúng tôi không được phép sử dụng GOTO trong các chương trình COBOL của chúng tôi. Đây là trước khi COBOL thêm "end if", vì vậy tại thời điểm đó, nó chỉ có hai và một nửa trong ba cấu trúc điều khiển cổ điển (chuỗi, nếu / sau đó / khác, thực hiện (tức là làm trong khi)). Anh ta miễn cưỡng cho phép GOTO trong các chương trình Cơ bản của chúng tôi và hướng dẫn chi nhánh trong các chương trình ngôn ngữ Trình biên dịch của chúng tôi.

Xin lỗi vì đây là một loại câu chuyện "bạn phải ở đó". Theo tôi biết, mọi ngôn ngữ được phát minh từ năm 1976 đều có cấu trúc kiểm soát đầy đủ để bạn không bao giờ cần sử dụng GOTO. Nhưng vấn đề là, ông chủ không bao giờ biết TẠI SAO GOTO bị coi là có hại, hay ngôn ngữ nào là rối loạn ở trẻ sơ sinh và đó là căn bệnh gây tử vong.


6

Tôi đã làm việc trong một dự án là kiến ​​trúc sư trưởng yêu cầu viết mã rõ ràng. Một trong những ví dụ tồi tệ nhất mà tôi tìm thấy trong mã (và anh ấy vui vẻ chấp thuận) là như sau.

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

Ngay cả ReSharper cũng nói với bạn điều này là sai!


9
Bạn sẽ khó có thể trả lại một cái gì đó từ một hàm được khai báo là void.
Mircea Chirea

7
@MAttB Xem xét trong những điều kiện nào nhánh cuối cùng ( else) sẽ được thực hiện.
Richard

6
other {return chuỗi.Empty; } sẽ thực thi khi 2 dòng trên đã được nhà phát triển bảo trì chỉnh sửa 5 năm kể từ bây giờ. Tuy nhiên, trả về chuỗi.Empty sẽ ẩn thực tế được sử dụng là một điều kiện không thể . Thay vào đó, nó nên ném UnlimitedOperationException ("Mã này không nhằm hỗ trợ ba logic giá trị");
MatthewMartin

1
Điều này thật kinh khủng. Có chuyện gì với bạn return verbose ? someString : someOtherString;vậy?
Callum Rogers

1
@callum Nhà điều hành Ternary có thể bị cấm :) đã ở đó trước khi ...
hplbsh

6

Ở công việc cuối cùng của tôi, "tiêu chuẩn" sẽ là một thuật ngữ rất mạnh mẽ cho những gì tôi đã được đưa ra bởi người đã thuê tôi. Lập trình trang web trong ColdFusion và SQL, tôi đã được cung cấp các yêu cầu mã hóa như:

  • Đừng sử dụng bao gồm. Tôi thích một trang lớn
  • Luôn phân tách các từ trong tên biến và tên cột với dấu gạch dưới (ngoại trừ isactive, Firstname, v.v.)
  • Không bao giờ sử dụng chữ viết tắt - luôn luôn viết tên đầu tiên (anh ấy thường xuyên viết tên và vv)
  • Không sử dụng các tên khó hiểu (như số tiền_chargeed và Charge_amount, các số đo khác nhau nhưng có liên quan)
  • Đừng sử dụng DIV và sử dụng CSS tối thiểu - thay vào đó hãy sử dụng các bảng lồng nhau (tôi đã tìm thấy một số sáu lớp sâu, một lần).
  • Đừng lưu trữ bất kỳ truy vấn nào. Không bao giờ.
  • Sẽ sử dụng một biến trên nhiều trang? Phạm vi ứng dụng.
  • Mỗi trang là một khối thử / bắt riêng của nó. Chúng tôi không cần / muốn xử lý lỗi toàn cầu.

Tôi bắt đầu thay đổi những thứ này ngay khi anh ấy nghỉ việc.


"Đừng sử dụng tên khó hiểu" có vẻ đủ công bằng với tôi ...
8128

1
Đó hoàn toàn là một hướng dẫn công bằng. Quan điểm của tôi là anh ấy đã không làm theo nó cả. Tôi đoán ý tưởng của anh ấy "không khó hiểu" và của tôi là khác nhau.
Ben Doom

4

Trong cuộc đời làm lập trình viên C ++ của tôi, hai "quy tắc" thực sự khó chịu đã được thi hành:

  1. "Chúng tôi không thể sử dụng STL, vì VC ++ 4.1 không hỗ trợ nó (và chúng tôi không thể chuyển sang VC ++ 6.0 tại thời điểm này)."
  2. "Đừng không sử dụng Sắp xếp nhanh, bởi vì nó có thể là O (n ^ 2) trong trường hợp xấu; sử dụng thực hiện này của thuật toán sắp xếp vun đống I (tên của lãnh đạo dự án xóa) đã viết như một sinh viên."

6
Điều gì đã sai với HeapSort của dự án?
7wp

4
Trên thực tế nếu mã được chấp nhận đầu vào người dùng bên ngoài QuickSort có thể sai khi nó mở ra O(n^2)các cuộc tấn công DOS (cung cấp đầu vào trong trường hợp xấu nhất). Ngoài ra, tại sao không thể chuyển đổi - chính nó là lý do hợp lệ của việc không sử dụng STL.
Maciej Piechotka

4

Tôi buộc phải có tài liệu XML cho tất cả các lớp và thành viên lớp. Bao gồm cả tư nhân. Tôi được bảo đảm sử dụng các bình luận ghostdoc mặc định.

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}

Rất giống với câu trả lời trước đó .
vây

Đúng. Tất cả các bạn cũng cần phải bình luận các thành viên tư nhân. Mà làm cho thậm chí ít ý nghĩa hơn.
Carl Bergquist

Khuyến khích sử dụng ghostdoc?! Gah
cấu hình
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.