it-swarm-vi.com

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

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ỉ 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ụ tại đây

76
finnw

Đ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 hơn. Ví dụ: Sửa đổi lần cuối bởi, danh sách ngày/lý do sửa đổi.

97
JohnFx

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.

129
Fishtoaster

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 duy nhất 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ị.

Các khu vực là một trong những tính năng 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.

103
Cumbayah

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

Tôi không thể nhớ các 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ữ 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, Varchar 30 ký tự, Không Null)

80
Damovisa

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
48
Kris Erickson
#define AND  &&
#define OR   ||
#define EQ   ==

'nuff nói.

37
Niall C.
  • 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ân nhắc :

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 Word nếu bạn phát âm ra và không có chúng. [Latin] 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ễ hiểu hơn.
37
John Siracusa

Tôi được lãnh đạo phần mềm của một công ty yêu cầu làm "đơn giản, táinmã dự phòng ". Chẳng hạn, việc thêm một tham số mới vào hàm hiện có. Thay vào đó, bạn phải sao chép hàm, để nguyên bản gốc không bị ảnh hưởng để tránh hồi quy. 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).

36
Wizard79

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 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 một 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ỉ 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.
36
Jaco Pretorius

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.

33
David B

Ký hiệu Hungary

Mẫu được trích từ " Giải thích của Charles Simonyi về quy ước đặt tên ký hiệu Hungary " trên MSDN.

1 #include vào sy.h Hướng [.__.] 2 extern int * rgwDic; [.__.] 3 extern int bsyMac; [.__.] 4 struct SY * PsySz (char sz []) [.__.] 6 {[.__.] 7 char * pch; [.__.] 8 int cch; [.__.] 9 struct SY * psy, * PsyCreate (); [.__.] 10 int * pbsy; [.___ .] 11 int cwSz; [.__.] 12 không dấu wHash = 0; [.__.] 13 pch = sz; [.__.] 14 trong khi (* pch! = 0 [.__.] 15 wHash = (wHash11 + * pch ++; [.___ 16] cch = pch-sz; [.__ -> bsyNext) [.__.] 19 {[.__.] 20 char * szSy; [.__.] 21 szSy = (psy = (struct SY *) & rgwDic [* pbsy]) -> sz; [.___ .] 22 pch = sz; [.__.] 23 while (* pch == * szSy ++) [.__.] 24 {[.__.] 25 if (* pch ++ == 0) [.__.] 26 trở lại (psy); [.__.] 27} [.__.] 28} [.__.] 29 cwSz = 0; [.__.] 30 if (cch> = 2) [.__.] 31 cwSz = ( cch-2/sizeof (int) +1; [.__.] 32 * pbsy = (int *) (psy = PsyCreate (cwSY + cwSz)) -rgwDic; [.__.] 33 Zero ((int *) psy, cwSY); [.__.] 34 bltbyte (sz, psy-> sz, cch + 1); [.__.] 35 return (psy) ; [.___.] 36}
31
JD Frias

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ố - MERYI 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.

28
Christopher Hawkins

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 lỗi khó hơn tìm ra chúng.

26
David B

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à 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 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".

24
Adam Lear

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 Subversion 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.

23
Jim A

Một số nơi tôi từng làm việc khăng khăng nhận xét 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 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ó để tham khảo hoặc không còn cần thiết nữa?

20
Jeremy Wiebe

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ã.

17
JaredPar

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.

16
Ryan Roberts

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);
}
14
user1006

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.

9
Jeremy

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

9
RedFilter

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 có 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ã nằm trong 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 hảo 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 bởi vì - - Thuật toá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.

8
David B

Đâ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 còn nhiều điều nữa mà 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 rồ 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ì".

8
Tim Murphy

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ã cho bạn để hiểu nó, thì bạn cần phải thoát khỏi địa ngục!

6
Adam Harte

Đây là một thời gian dài trước đây - chính xác là năm 1976. Ông chủ 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 (trình tự, 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
Mark Lutton

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 nói với bạn điều này là sai!

6
Jax

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
CB Du Rietz

Ở 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. Các trang web lập trình 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ư lượng_chargeed và Charge_amount, các số đo khác nhau nhưng có liên quan)
  • Không sử dụng DIVs và sử dụng tối thiểu CSS - thay vào đó, hãy sử dụng các bảng lồng nhau (tôi đã tìm thấy một số lớp sâu sáu lần, 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 một trình 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.

6
Ben Doom

Gần như bất kỳ loại quy ước đặt tên biến nào nhắc lại loại biến, khả năng biến đổi, phạm vi/lớp lưu trữ và/hoặc tham chiếu của chúng. Về cơ bản, bất kỳ cấu trúc nội tại cho ngôn ngữ. Điều này không còn cần thiết trong thế kỷ 21 với các IDE hiện đại (và theo tôi ban đầu chỉ giải quyết bố cục/thực hành mã kém để bắt đầu). Điều này bao gồm ký hiệu tiếng Đức và các biến thể của nó:

  • bigBlobStr - Một chuỗi.
  • bigBlobStrCurLocPtr - Một con trỏ tới "vị trí hiện tại" trong chuỗi đã nói.
  • someIntArray - Mảng số nguyên

hoặc những thứ như:

  • e_globalHead - Biến ngoài
  • sg_prefPoolSz - Biến toàn cục tĩnh

và tất nhiên là một trong những thị lực xa nhất trong OOP, m_ cho tất cả các thành viên. Nếu bạn không thể chắc chắn/theo dõi biến nào là cục bộ, thành viên, toàn cầu, tĩnh hoặc cuối cùng/const, bạn có thể sẽ viết không rõ ràng , yếu tố kém, mã spaghetti.

Điều này khác với việc chỉ định quy ước tiền tố/hậu tố cho những thứ như min, max, avg, size, Count, index, et cetera, đều ổn.

4
charstar

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;
}
4
Carl Bergquist

Tiêu chuẩn tồi tệ nhất tôi từng phải đối mặt:

StyleCop cho C #

Lấy mọi tiêu chuẩn vô nghĩa từ trước đến nay và đưa nó vào một công cụ chạy vào thời gian biên dịch thay vì trong IDE tại thời điểm thiết kế.

//this is not a legal comment.
//  nor is this

// phải được theo sau bởi một khoảng trắng, nếu bạn đang gỡ lỗi, hãy sử dụng //// để nhận xét mã. Các thuộc tính cũng phải có nhận xét 'ba dấu gạch chéo' và chúng phải đọc "Gets hoặc Đặt xxxxx" hoàn thành với một khoảng thời gian ở cuối và được viết hoa đúng.

Ừ Có thể có một điểm với các API được xuất bản rộng rãi nhưng thịt bò chính của tôi là họ chắc chắn có thể đã xây dựng nó như một plugin a la R #.

4
MIA

Tôi đã làm việc trong một thời gian ngắn ở Nhật Bản. Tôi đã làm mã hóa toán học phức tạp. Các tiêu chuẩn mã hóa của công ty là hoàn toàn không có ý kiến. Thật khó khăn khi tôi muốn thêm một số bình luận để giải thích các tính toán phức tạp và không quên bản thân mình sau vài tuần. Đáng tiếc cho chàng trai tiếp theo đến sau tôi để hiểu những gì mã đang làm.

Đó là lần đầu tiên tôi từng thấy rằng các bình luận mã hóa bị cấm.

4
softveda

Ở một công việc trước đó, tiêu chuẩn C # phải có ít nhất hai khoảng trắng giữa tên loại và tên biến trong khai báo, tên phương thức phải bắt đầu trên dòng tiếp theo từ bộ sửa đổi truy cập và kiểu trả về, một khoảng trắng phải xuất hiện trước bất kỳ dấu câu mở nào (dấu ngoặc đơn hoặc ngoặc vuông), tất cả các khai báo biến ở đầu phương thức, các khai báo tách biệt với gán và thụt lề là 3 khoảng trắng. Thí dụ:

private static int
ThisIsTheMethod (int  code, string  message)
{
   int  i;
   int  j;
   int  k;

   for (i = 0; i < message.Length; i++)
   {
      if (message [i] == '!') return -1;
   }

   j = SomeMethod (code);
   k = OtherMethod (j);

   return k;
}

Mặc dù xấu, nhưng có thể thực hiện được với ngoại lệ là Visual Studio thực sự không muốn mọi thứ theo cách đó và đó là một bước thêm sau khi mã hóa "thông thường" để định dạng lại như thế này.

3
Jesse C. Slicer

tại công việc trước đây của tôi, mà tôi đã sẵn sàng nghỉ việc 3 tháng trước:

cơ sở dữ liệu:

  • Tên bảng phải viết hoa.
  • Tên bảng phải có tiền tố TBL_
  • Các trường phải có tiền tố: DS_ (đối với varchar, không có nghĩa) NU_ cho các số CD_ cho ("trường bit") DT_ cho ngày
  • các trường cơ sở dữ liệu cũng phải viết hoa [CD_ENABLED]
  • tương tự với tên sp [SP_INFINITY_USER_GROUPS_QRY] và tên cơ sở dữ liệu [INFINITY]
  • tôi đã đề cập đến tên sp thực sự là như vậy? Tiền tố SP_, sau đó là tên cơ sở dữ liệu SP_INFINITY_ sau đó là tên bảng, SP_INFINITY_USER_GROUPS, sau đó sp thực sự được mong đợi sẽ làm gì (QRY, UPD, DEL, INS).
  • tất cả các trường văn bản phải là varchar (MAX), một cách dứt khoát.
  • số là int hoặc double, ngay cả khi bạn có thể đã sử dụng loại khác.
  • Các trường "boolean" (bit) là int, không có lý do.
  • thủ tục lưu trữ phải được tiền tố sp_productname_

asp.net/c #/javascript

  • MỌI chức năng duy nhất phải được gói trong thử {} bắt {}, vì vậy các ứng dụng sẽ không "phát nổ" (ít nhất đó là lý do chính thức), ngay cả khi điều này tạo ra những thứ không hoạt động và không có manh mối tại sao.
  • các tham số phải được bắt đầu bằng p, ví dụ: pCount, pPage
  • các biến phạm vi phải được thêm tiền tố vào w (như trong "làm việc", điều đó có nghĩa là gì?)
  • số liệu thống kê với g, vv.
  • mọi thứ trong khung 1.1 đều không phù hợp, giống như bạn đã sử dụng thực tế cho linq và generic. (Tôi đã coi nó là một điểm để thực thi chúng để cho phép tôi sử dụng jquery, ít nhất là tôi đã thành công ở đó).
3
bevacqua

Bắt buộc bao gồm, mở rộng thông tin $ Log $ khi SCC là phiên bản cũ của PVCS. Chúng tôi có một số tệp trong đó thông tin $ Log $ dài hơn nhiều so với mã thực tế trong tệp.

3
Ian C.

Tất cả đầu ra trong tập lệnh PHP phải được lặp lại theo từng dòng.

<?php
echo "<div id=\"foo\">";
echo "<h1>" . $title . "</h1>";
echo paragraphs($body); // just an example
echo "</div>";
?>

(Tuyên bố miễn trừ trách nhiệm: Tôi không phải theo dõi nó, nhưng một nhóm tôi làm việc cùng đã làm.)

3
sholsinger

tệ nhất là một dự án (C++) trong đó các lớp được tiền tố với các chữ viết tắt mô-đun.

Ví dụ: nếu có thứ gì đó trong mô-đun MessagePassing và một phần của cơ chế Phản hồi, nó có thể được gọi là MESPAS_RESSomeobject.

Làm việc với mã đó làm cho tôi muốn thu hút ánh mắt của tôi.


Không phải là tồi tệ nhất, nhưng công việc hiện tại của tôi yêu cầu c_ tiền tố trên các lớp và e_ tiền tố cho enums. Không có gì cho cấu trúc. nhưng _t postfix trên typedefs. Nó cũng khá xấu xí.

Ồ, và nhận xét tiêu đề chức năng trong BÓNG .h và .cpp (khai báo và định nghĩa) tất nhiên gần như không bao giờ khớp.

3
µBio

Yêu thích của tôi là quy tắc "Không có số ma thuật" được áp dụng một cách không biết gì. Ví dụ, tôi đã từng thấy một nhận xét trong bài đánh giá mã nêu rõ quy tắc "Không có số ma thuật" đã bị vi phạm bởi dòng mã này:

if (fscanf(file, "%s %hd",name, nbrObject ) != 2 )

Tôi đoán người đánh giá muốn có hằng số thay vì 2, chẳng hạn như #define TWO 2

3
Chalie Wax

Tên phương thức của chúng tôi phải ở định dạng 'Nhận/Đặt/Thêm/Xóa' + tên của đối tượng đích + tên của tất cả các tham số.

GetUserById(userId);
InsertUser(user);
DeleteUser(user);

Đủ công bằng - nhưng quy tắc rất nghiêm ngặt. Các loại đối tượng phức tạp không được phép viết tắt và các hoạt động luôn phải liệt kê mọi tham số yêu cầu, bất kể lố bịch như thế nào:

GetCustomerOrderDeliveryDetailsByCustomerIdAndDeliveryDateAndOrderStatus(...

Sau khi thêm tên biến đầy đủ (không được phép rút ngắn), bạn có thể tưởng tượng một số cuộc gọi phương thức đơn giản là bao lâu. Từ gói dài.

3
Kirk Broadhurst

Bây giờ tôi đang làm việc, quy trình đặt tên biến cho mọi thứ liên quan đến cơ sở dữ liệu là:

  • $ sql cho các báo cáo
  • $ kết quả cho kết quả truy vấn

Tuy nhiên, điều này có ý nghĩa khi tôi đưa ra quan điểm rằng quy ước này quá chung chung và điều này sẽ kết thúc với sự thay đổi chồng chéo của câu trả lời là "sử dụng result_alt hoặc sql_alt." Tôi cảm thấy bình luận, nếu bạn sử dụng tên biến phù hợp có nghĩa là mục đích bạn sẽ không cần bình luận hoặc nhiều người trong số họ.

2
chrisw

Tiêu chuẩn mã hóa tồi tệ nhất tôi từng phải tuân theo là "Tất cả các tên biến đối tượng phải được bắt đầu bằng 'obj'". Đây là một dự án lớn Java, vì vậy hầu như mọi thứ là một đối tượng. Phần tồi tệ nhất là, hầu hết mọi người đều áp dụng chính sách đặt tên biến bằng cách chỉ cần thêm "obj" với tên lớp. Chúng tôi nghĩ ra những thứ như Person objPerson1 trong suốt mã. Tôi đã phản đối một lần và có một trong những nhà phát triển khác xen vào rằng cô ấy thích quy ước "bởi vì sau đó tôi không phải nghĩ về tên biến của mình". Nơi đó thật kinh khủng ...

2
TMN

Có thể tiêu chuẩn mã hóa của Công ty Phần mềm Huawei. Họ muốn bạn tuyên bố tất cả các thành viên công khai :))

2
LostMohican

Viết bất cứ điều gì vào Fortran ( WATFOR , FORTRAN 77 ) trong đó một ký tự không phải khoảng trắng trong cột 1 là một nhận xét và trình biên dịch đã không cảnh báo bạn nếu bạn vượt ra ngoài cột 72, nó sẽ chỉ âm thầm bỏ qua nó.

Ít nhất tôi chỉ dành bảy năm để làm điều này.

2
Mark Thalman

Có số lượng tệp tiêu đề C, trong dự án Java.

Các giao diện tồn tại vì một số lý do chính đáng, nhưng tiêu chuẩn này bắt buộc một giao diện (foo.Java) cho mỗi lớp duy nhất (fooImpl.Java) cho dù nó có ý nghĩa hay không. Rất nhiều thứ để giữ đồng bộ, phá vỡ hoàn toàn phương thức nhấp chuột vào Eclipse, công việc bận rộn vô nghĩa.

Hệ thống xây dựng đã thi hành nó, nhưng tôi không thể tưởng tượng mục đích ban đầu là gì. May mắn thay, chúng tôi đã bỏ nó để lấy mã mới khi chúng tôi chuyển sang một hệ thống xây dựng và kiểm soát phiên bản mới, nhưng vẫn còn rất nhiều về nó.

Đồng thời, chúng tôi cũng bỏ thói quen kiểm soát phiên bản-kiểm soát thông tin trong tập tin ngu ngốc vốn là bắt buộc.

2
user763

Tôi hiện đang làm việc trong một công ty nơi các truy vấn SQL được thực hiện thông qua một thứ gọi là "Lớp yêu cầu". Thật nực cười:

Trong "bao gồm/request.group.php"

class RequestClass
{
    // ... some code.

    public function getUser($where)
    {
        global $initrequest

        $sql = $initrequest['users']
        $sql.= $where;

        return execute($sql);
    }
}

Trong initrequest.php:

$initrequest['users'] = 'SELECT * FROM users WHERE ';

Và nó được gọi từ ứng dụng theo cách này:

$request = new request();
$tmpquery = "username = $username AND password = $password";
$request->getUsers($tmpquery);

Và họ có một hệ thống mẫu tương tự dựa trên "các khối", nhưng sau khi hiểu những gì tôi thể hiện ở đây, tôi tiếp tục nhấn để xóa toàn bộ phần mềm của chúng tôi và viết lại nó trong Symfony.

2
Arie Deckelmann

Không quá một dòng mã được phép trong Main ()

Một giáo sư tại trường đại học của tôi, người đã may mắn không khăng khăng rằng các sinh viên C # của cô ấy không được phép đặt nhiều hơn một dòng mã trong điểm vào của ứng dụng bảng điều khiển của họ.

Điều này có ý nghĩa hợp lý khi phát triển một ứng dụng chuyên nghiệp, nhưng khi mục đích duy nhất của chương trình là lấy một vài đầu vào cơ bản và tạo ra một đầu ra duy nhất (ví dụ: MultiplyTwoNumbers.exe), yêu cầu như vậy sẽ đau hơn là tốt.

Trên đầu trang "một dòng mã chính", giáo sư cũng nhấn mạnh rằng mỗi dòng mã đều có một nhận xét mô tả và mỗi thành viên trong lớp đều có một bằng lời nói tên mô tả. Mất điểm nếu giáo sư không cảm thấy rằng những yêu cầu này đã được đáp ứng "đầy đủ".

Các sinh viên buộc phải tuân theo các quy tắc này (gần như) tất cả những người mới lập trình và do đó tôi có thể thấy giá trị của việc thực thi các hành vi như đặt tên tốt và tách các mối quan tâm. Mặc dù vậy, với tư cách là .NET Tutor tại trường đại học của tôi, tôi đã liên tục giúp đỡ các sinh viên của mình đáp ứng những yêu cầu trần tục và đáng ghét này sau khi họ nhận được mã của họ làm việc.

Theo tôi, khi giáo dục một người hoàn toàn mới đối với ngôn ngữ lập trình, mối quan tâm đầu tiên phải là cách tạo mã chứ không phải cách tạo dựa trên tiêu chuẩn mã.

1
Nathan Taylor

"Không sử dụng kiểu nhận xét C++ cho mã C".

Mặc dù điều này vẫn có thể có một giá trị nhỏ nếu có nguy cơ cần chuyển chương trình của bạn sang trình biên dịch lỗi thời, nhưng nó hầu như chỉ là một rắc rối. Phản đối lớn nhất của tôi là nó làm cho nó thực sự khó sử dụng /* để chặn nhận xét về một khu vực rộng lớn trong quá trình phát triển hoặc thử nghiệm đơn vị. */

1
AShelly

Giảng viên ADA của tôi tại uni đã nhấn mạnh rằng mọi phương pháp đều có một nhận xét phác thảo các điều kiện tiên quyết, hậu điều kiện và O. Vấn đề lớn nhất với điều này là ông không bao giờ bận tâm giải thích O lớn thực sự có nghĩa gì và không bao giờ kiểm tra xem chúng có đúng không nên tôi thấy mình sao chép và dán khối bình luận này hàng trăm lần.

-- Method_Name
-- PRECONDITIONS: none
-- POSTCONDITIONS: none
-- O(n) = n
1
Christopher

(C++)

Tất cả các giá trị trả về phải là HRESULTS (giá trị chuẩn - không phải do người dùng xác định)

Đây chỉ là một vài năm trước đây. Những người cao tuổi vẫn còn say mê với COM và họ không bao giờ đọc hoặc học về các thực hành tốt nhất khác. Đó là một môi trường khép kín đáng kinh ngạc.

Cùng một nơi cũng không cho phép sử dụng STL.

Tôi đã rời đi ngay sau khi tôi phát hiện ra miếng ngon đó.

1
Tim

Trong Visual Basic 6. , chúng tôi đã phải thêm các khối xử lý lỗi cho mọi phương thức. Không có ngoại lệ. Vì vậy, chúng tôi đã làm.

Sau đó, chúng tôi phải giải thích tại sao các phần của ứng dụng chậm.

1
Chris Brandsma

Không gian giới hạn cho tên biến/đối tượng có lẽ là kích thích lớn nhất của tôi. Tôi đã làm việc trong một ngôn ngữ tương đối hiện đại, độc quyền chỉ cho phép 10 ký tự. Đây là một nắm giữ từ các phiên bản gốc của nó.

Kết quả cuối cùng là bạn kết thúc với các quy ước đặt tên ngộ nghĩnh xác định mỗi ký tự trong số 10 được cho phép của bạn là gì. Cái gì đó như:

  • 1-3: tiền tố ứng dụng
  • 4-6: tiền tố mô-đun
  • 7-9: phần do người dùng xác định
  • 10: một số chỉ trong trường hợp hai ... hoặc 9 được đặt tên giống nhau.
1
Brad Gardner

Yêu thích của tôi sẽ phải là hướng dẫn đặt tên cơ sở dữ liệu mà chúng tôi hiện đang cố gắng tuân theo. Tất cả các bảng được sử dụng cho nhiều mối quan hệ nên được đặt tên bằng tên của các bảng được liên kết và phải được gắn với "Liên kết". Và tất nhiên, không có số nhiều của tên bảng.

  • Đặt hàng? Không. Nó nên được gọi là Order ProducttLink
  • Bạn bè? Không. Nó phải là PersonPersonLink
1
CodingInsomnia

Bị buộc phải thêm một mô tả tệp trong mỗi tệp (đó là một dự án C # ).

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="User.cs" company="Company">
//   Copyright (C) 2009 Company. All rights reserved.
// </copyright>
// <summary>
//   The user.
// </summary>
// --------------------------------------------------------------------------------------------------------------------
0
Carl Bergquist

Tại một công ty, chúng tôi đã phải viết tài liệu kỹ thuật giải thích cách chúng tôi sẽ viết một chức năng. Nó nhanh chóng bị lỗi thời vì bạn sẽ không nghĩ về mọi thứ khi bạn lập trình bằng UML.

0
IAdapter