Recommended C++ and Java Coding Standards? 40
Gerard J.
Pinzone queries: "My company is looking to implement C/C++
and Java coding standards. However, I can't seem to find a definitive
list. I'm more familiar with Java and have suggested that we use
'Elements
of Java Style' and Sun's
documentation. BTW, beware of
'Netscape's
Software Coding Standards Guide for Java.' It's woefully
out-of-date! Any suggestions?"
Try this (Score:3, Informative)
C++ standards (Score:2, Insightful)
http://www.research.att.com/~bs/C++.html
Since he designed the language, I guess he is authoritative.
If portability is important or if you are likely to Open Source some of your code, Mozilla offers a great style guide for this:
http://www.mozilla.org/hacking/portable-cpp.html
C++ compilers are still contrary beasts, and it is worth being aware of the pitfalls.
A number of the tips, especially the "do's" come from Scott Meyers "Effective C++" series, which has to be recommended for anyone looking to define a common company approach to C++ programming.
Mozilla's standards.. (Score:1)
This depends of course on the nature of your project, but I think it's fair to assume a non-decrepit compiler. If Visual C++ 1.5 breaks a certain feature, well, Visual C++ 6.0 has been out for over 2 years now.
There are a lot of really useful parts of C++ that are actually fairly well worked out on most modern compilers. For instance, templates are damn handy. There may be some differences between the level of support, but there is generally a very large subset of C++ templates that works on most modern compilers. And they let you do things that make all the rest of the programming safer and easier, like generic containers, like smart pointers.
Re:C++ standards (Score:1)
This is especially true wrt templates, exceptions (some quirks on this one; I still avoid them) and C++-style comments.
Heck, I use C++-style comments with our HP-UX 9 C compiler (some senior engineer always goes in behind me and converts them anyhow).
Anyhow, I say (please flame me if I need it, I crave correction) that people with ISO non-standard C/C++ compilers need to ditch the commercial stuff and go with GCC (Q: How compliant is LCC on the Windows side?). That's just from a GNUphile. I certainly do not miss the bad old days of VC++, VisualAge, and Borland (don't miss ya, but I luv ya) Turbo C/C++.
My
Re:C++ standards (Score:1)
Still, it's a document I often look at - it's a good thing to know its "rules", before then proceeding to deliberately break them.
for java may I recommend.. (Score:3, Informative)
It reformats your code (i use it via ANT)
Just play with the settings and see what you like, it'll reformat the code to what you want.
I just set it up here, and it works a treat.
Saves all those source code arguments about where the squigaly brackets go.
Re:for java may I recommend.. (Score:1)
"Programming standards are a complete waste of time. A bunch of guys sit in a room arguing for days about placement of opening and closing brackets and then no one follows the standard anyhow. Just get a decent pretty print program and format the source the way you like it when you work on it and expect everyone else to do the same and don't waste time on coding standards."
Re:for java may I recommend.. (Score:1)
Re:for java may I recommend.. (Score:1)
Infact the pretty print has a built in option to support just that so that it only runs on stuff that's been submitted when run within the cvs environlment.
Your point is good though, but I think it could be contained.
Heh (Score:2, Funny)
Things to think about (Score:2, Informative)
I don't think you need to be reminded of the reasons for having a coding style standard, but in case anyone questions it, it undoubtly increases readability of people's code, and reduces the time needed to understand other people's code. We have also found that we are slightly better organized in how we produce code when we follow these guidelines.
Some suggested things to think about:
For example, you might say all begining capitals for functions, such as "void OnOKButtonClicked()", first lower case then all starting caps for variables, such as "fltNewGradePercentage", and all caps for macros, such as "STANDARDSIZE".
For example, at work, we use three-to-six letter prefixes to designate the type of the variable - intFiles is an int, chrpCurrent is a character pointer, etc.
I'm sure that there are other things to think about, which will be suggested, but these are places to start when considering a standard.
For all the people that use VC++ (Score:1)
Very popular, a little hard to use, but will save you a ton of time.
Did a quick search [google.com] on Google and got some really good results on how to use Hungarian notation:
http://www.umr.edu/~cpp/common/hungarian.html [umr.edu]
http://csciwww.etsu.edu/bailes/1250/HungarianNota
Just to name a few. I use it in all of my major projects (see sig for shameless plug) and I hope that many other people will adopt it into their coding styles.
-Vic
Re:For all the people that use VC++ (Score:2, Interesting)
No, please don't use Hungarian notation. In particular, please don't use Microsoft's bastardized version of Hungarian. Hungarian was invented for use with untyped and weakly typed languages (think assembler). See The Great Hungarian Prefix Swindle [keysound.com] [www.keysound.org] for a well-though-out essay on the topic.
Re:For all the people that use VC++ (Score:2)
For example, the variable 'ppch' is a pointer to a pointer to a char (char **). 'p's and '*'s cancel each other so you know that the expression '(*ppch)' is a pointer to a char (char *) and '(**ppch)' is a char.
I also prefix member variables with 'm_' so there's never ambiguity between locals and members in member functions.
Usually the first thing I type is 'int main (int cArgs, char *rgszArgs [])'
Of course, it's not needed for strongly typed languages like C++/Java, but I still use it because it saves me time. I've heard some people complain that it adds too much time in typing - learn to type faster...
Re:For all the people that use VC++ (Score:1)
Re:For all the people that use VC++ (Score:2)
Sometimes if an OS header defines a struct 'SOME_OS_DATA_STRUCT', then I'll write code like:
I know it's lazy, and if I need more than one sods then I'll give them meaningful names like 'sodsThis' and 'sodsThat', but for a one-off it's not really necessary.Mostly I do stuff like:
I use STL alot too so I use alot of 'mapThings' and 'iterThing' and with ATL's CComPtr I use 'spThing' for smart-pointer. I don't adhere to the strict Simonyi notation - just enough to get by.It helps me a great deal. Some people turn their noses up at it - I did too at first - but I recon it's worth a try.
Linux (Score:5, Informative)
Re:Linux (Score:1)
Re:Linux (what's wrong with Hungarian) (Score:2)
Re:Linux (what's wrong with Hungarian) (Score:2)
Funny, when I read the 'prgrgpszDictionaryBase' part in my head i heard: 'a pointer to a two dimensional array of pointers to null-terminated strings'. Then I read your description and it seemed somehow redundant. I guess that's the point right there.
The proposed Boost C++ Coding Guidelines (Score:3, Informative)
What I like about the guidelines is the well thought out rationales presented and its adherance to current C++ standards. After reading them, I wanted to follow the guidelines because I agreed with the rationale, rather than simply because the document said so.
Another Java style guide (Score:1)
Avoiding anal retentiveness... (Score:3, Informative)
Too many coding standards get into issues that are, quite frankly, ludicrous. If the programmers I hire can't handle slight differences in C++ brace placement, I need to find better programmers! Sheesh, I've never had problems following code because someone places the open bracket on the same line as the if, while I put mine on a subsequent line.
Having written for publication, I've had quite some experience with the anal retentive crowd. For example, I was excoriated for having an algorithm with 1-character variable names -- the code was, however, an implementation of a specific mathematical formula, and my code precisely matched variables in the original notation. To change the names to longer "descriptive" ones would have broken the continuity between definition (in a math text) and implementation (C++). The short names were actually more descriptive and accurate!
And then we have the "goto" wars -- I actually use a single goto in one of my books, bringing down the ire of mypoic ninnies (usually pre-degree college students) who only know that "gogot is bad" without a clue as to why they've been taught that. A rare, judicious goto can make code faster and more readable! But try telling that to fools who only parrot dogma... if a programmer can't understand the rare usefulness of a goto, they probably can't think far enough "outside the box" to be useful in the real world.
This isn't to say that I'm against coding standards -- I'm all in favor of them! But a coding standard should by flexible in nature and open-minded where practical; the goal is readable code and ease of typing. Programmers have habits, a rhythm when they type, and so long as their code follows broad guidelines of style. I'll take a dozen good comments and a solid design document over the placement of curly brackets any day!
Re:Avoiding anal retentiveness... (Score:2)
You've never actually written code as part of a large team using source control have you? Try figuring out the diffs between the code you have just modified and the code a fellow programmer just checked in after his favorite editor just automagically realigned all the braces! Few, if any, version control tools can automagically resolve that kind of conflict for you, so you have to do it yourself, or else pull the new version to a different location, re-re-align the braces, and do the diff then. Ugh. Pick a brace (and space/tab!) style, preferably one in common use and documented, and stick with it. It's not about the readability of one person's code, it's about the compatibility of changes across time and team members.
Well... (Score:2)
I dunno... 12 programmers at one shop, all using Source(un)Safe, working on a million-line e-banking app... seems like a "large team" to me.
I'm concerned with clarity of algorithm -- in other words, can I understand what the program is doing? That requires good comments, not curly-bracket placement.
You might have a point in regard to tabs/spaces, in that different people and systems have tabs set to different line positions. I've always specified hard spaces, so the code looks the same in everyone's editor and in print.
I'm not against programming standards -- I'm against getting into insane detail. I spend far more time trying to figure out someone's algorithm (or lack thereof!) than I do worrying about their brace style.
Rogue Wave style (Score:1)
Look at C# coding guidelines too (Score:1)
but following the Microsoft recommendations in the Framework SDK might be a good idea - they seem pretty well thought out.
In particular, check out the "Naming Guidelines" [microsoft.com] section,
though the entire set of design guidelines is also good reading.
More than formatting (Score:1)
For example, if you look at the Win32 API (sorry; that's what I'm most familiar with) you will find the following mechanisms used to return error status:
It's not just the Win32 API that uses these mechanisms for returning status. I've seen app code that duplicates each of these. I've also seen coding errors caused by the programmer not checking for the correct condition. For example, if the app contained a function called OpenFileAndCreateMapping() that returned a HANDLE, how would you test the return value to determine if an error occurred? Test for NULL? INVALID_HANDLE_VALUE? Some other distinguished value?
The last coding style guide I created for a large project mandated that any function that can possibly fail must return a DWORD containing the Win32 status code. This made the code easier to write, review, and maintain.
Not without tool-support (Score:1)
For C/C++, I use 'indent'. I don't do much Java but another poster here suggested the pretty-printer.
One man's unreadable is another man's one liner. (Score:1)
I used to be a syntax bigot, but I have now seen the light (no, Perl is still ugly and unreadable with no redeaming quality, unlike the almost prefectly regular syntax and symantics of K). No coding standard can make good code, but good code could be prevented by coding standards.
Remember, only you can help prevent segmentation faults.
-j
Re:One man's unreadable is another man's one liner (Score:1)
The code is more maintainable, but slighty more time consuming to create.
A beautiful one liner is great, but if it takes someone else two minutes to figure out, that's a wasted two minutes, elegant or not.
Re:One man's unreadable is another man's one liner (Score:1)
Re:One man's unreadable is another man's one liner (Score:1)
Sun's code conventions (Score:1)
For example, if you want to associate some code with a Swing button click, you have to implement the interface "ActionListener" by writing a method called "actionPerformed." You are just going to confuse things if you try to enforce a different set of conventions for your own code, like "mActionPerformed" or "IActionListener".
In my own projects, I also insist that every class and method start with a javadoc comment containing at least one descriptive sentence, and it is not allowed to be a cut-and-paste comment from some other class or method.