C++ Coding Standards: 101 Rules, Guidelines, and Best Practices Customer Reviews: 2 Average Customer Rating:      Write a Review and tell the world about this title! People who purchase this book frequently purchase: - Effective C++: 55 Specific Ways to Improve Your Programs and Designs, 3rd Edition; Scott Meyers, $38.95, 22% Off!
- C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond; David Abrahams, et al, $38.95, 22% Off!
- Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems, and Solutions; Herb Sutter, $34.95, 22% Off!
- C++ Common Knowledge: Essential Intermediate Programming; Stephen C. Dewhurst, $27.50, 21% Off!
Books on similar topics, in best-seller order:Books from the same publisher, in best-seller order:
Consistent, high-quality coding standards improve software quality, reduce
time-to-market, promote teamwork, eliminate time wasted on inconsequential
matters, and simplify maintenance. Now, two of the world's most respected
C++ experts distill the rich collective experience of the global C++ community
into a set of coding standards that every developer and development team
can understand and use as a basis for their own coding standards.
The authors cover virtually every facet of C++ programming: design and
coding style, functions, operators, class design, inheritance, construction/destruction,
copying, assignment, namespaces, modules, templates, genericity, exceptions,
STL containers and algorithms, and more. Each standard is described concisely,
with practical examples. From type definition to error handling, this book
presents C++ best practices, including some that have only recently been
identified and standardized-techniques you may not know even if you've used
C++ for years. Along the way, you'll find answers to questions like
- What's worth standardizing--and what isn't?
- What are the best ways to code for scalability?
- What are the elements of a rational error handling policy?
- How (and why) do you avoid unnecessary initialization, cyclic, and definitional
dependencies?
- When (and how) should you use static and dynamic polymorphism together?
- How do you practice "safe" overriding?
- When should you provide a no-fail swap?
- Why and how should you prevent exceptions from propagating across module
boundaries?
- Why shouldn't you write namespace declarations or directives in a header
file?
- Why should you use STL vector and string instead of arrays?
- How do you choose the right STL search or sort algorithm?
- What rules should you follow to ensure type-safe code?
Whether you're working alone or with others, C++ Coding Standards
will help you write cleaner code--and write it faster, with fewer hassles
and less frustration.
Reviews
You have never seen a book quite like this before. When the authors of
this book speak, the C++ community listens, but together they have outdone
themselves, and you and I are the happy beneficiaries. This is the first
"coding standards" book I've seen that works. The organization is clear
and intuitive, the topics are pertinent, and the content is of the highest
quality. All the standards contained herein have been rigorously scrutinized
(I have hundreds of emails to prove it!) by a generous sampling of the leading
contributors in the C++ world, as attested by the acknowledgements in the
Preface.
More than just style guidelines and "gotcha" warnings, C++ Coding Standards
clarifies the idioms and practices that pertain specifically to successful
C++ software. Even better, you can't avoid deepening your mastery of the
finer points of C++ as you read. This is the singularly authoritative Writ
of Common Wisdom for the entire C++ development experience.
Chuck Allison
Editor, The C++ Source
Table of Contents
Preface.
1. Organizational
and Policy Issues.
Don't sweat the small stuff. (Or: Know what not to standardize.).
Compile cleanly at high warning levels.
Use an automated build system.
Use a version control system.
Invest in code reviews.
2. Design
Style.
Give one entity one cohesive responsibility.
Correctness, simplicity, and clarity come first.
Know when and how to code for scalability.
Don't optimize prematurely.
Don't pessimize prematurely.
Minimize global and shared data.
Hide information.
Know when and how to code for concurrency.
Ensure resources are owned by objects. Use explicit RAII and smart pointers.
3. Coding
Style.
Prefer compile- and link-time errors to run-time errors.
Use const proactively.
Avoid macros.
Avoid magic numbers.
Declare variables as locally as possible.
Always initialize variables.
Avoid long functions. Avoid deep nesting.
Avoid initialization dependencies across compilation units.
Minimize definitional dependencies. Avoid cyclic dependencies.
Make header files self-sufficient.
Always write internal #include guards. Never write external #include guards.
4. Functions
and Operators.
Take parameters appropriately by value, (smart) pointer, or reference.
Preserve natural semantics for overloaded operators.
Prefer the canonical forms of arithmetic and assignment operators.
Prefer the canonical form of ++ and --. Prefer calling the prefix forms.
Consider overloading to avoid implicit type conversions.
Avoid overloading &&, ||, or , (comma).
Don't write code that depends on the order of evaluation of functionarguments.
5. Class
Design and Inheritance.
Be clear what kind of class you're writing.
Prefer minimal classes to monolithic classes.
Prefer composition to inheritance.
Avoid inheriting from classes that were not designed to be base classes.
Prefer providing abstract interfaces.
Public inheritance is substitutability.
Inherit, not to reuse, but to be reused.
Practice safe overriding.
Consider making virtual functions nonpublic, and public functions nonvirtual.
Avoid providing implicit conversions.
Make data members private, except in behaviorless aggregates (C-stylestructs).
Don't give away your internals.
Pimpl judiciously.
Prefer writing nonmember nonfriend functions.
Always provide new and delete together.
If you provide any class-specific new, provide all of the standard forms
(plain, in-place, and nothrow).
6. Construction,
Destruction, and Copying.
Define and initialize member variables in the same order.
Prefer initialization to assignment in constructors.
Avoid calling virtual functions in constructors and destructors.
Make base class destructors public and virtual, or protected and nonvirtual.
Destructors, deallocation, and swap never fail.
Copy and destroy consistently.
Explicitly enable or disable copying.
Avoid slicing. Consider Clone instead of copying in base classes.
Prefer the canonical form of assignment.
Whenever it makes sense, provide a no-fail swap (and provide it correctly).
7. Namespaces
and Modules.
Keep a type and its nonmember function interface in the same namespace.
Keep types and functions in separate namespaces unless they're specifically
intended to work together.
Don't write namespace usings in a header file or before an #include.
Avoid allocating and deallocating memory in different modules.
Don't define entities with linkage in a header file.
Don't allow exceptions to propagate across module boundaries.
Use sufficiently portable types in a module's interface.
8. Templates
and Genericity.
Blend static and dynamic polymorphism judiciously.
Customize intentionally and explicitly.
Don't specialize function templates.
Don't write unintentionally nongeneric code.
9. Error
Handling and Exceptions.
Assert liberally to document internal assumptions and invariants.
Establish a rational error handling policy, and follow it strictly.
Distinguish between errors and non-errors.
Design and write error-safe code.
Prefer to use exceptions to report errors.
Throw by value, catch by reference.
Report, handle, and translate errors appropriately.
Avoid exception specifications.
10. STL:
Containers.
Use vector by default. Otherwise, choose an appropriate container.
Use vector and string instead of arrays.
Use vector (and string::c_str) to exchange data with non-C++ APIs.
Store only values and smart pointers in containers.
Prefer push_back to other ways of expanding a sequence.
Prefer range operations to single-element operations.
Use the accepted idioms to really shrink capacity and really erase elements.
11. STL:
Algorithms.
Use a checked STL implementation.
Prefer algorithm calls to handwritten loops.
Use the right STL search algorithm.
Use the right STL sort algorithm.
Make predicates pure functions.
Prefer function objects over functions as algorithm and comparer arguments.
Write function objects correctly.
12. Type
Safety.
Avoid type switching; prefer polymorphism.
Rely on types, not on representations.
Avoid using reinterpret_cast.
Avoid using static_cast on pointers.
Avoid casting away const.
Don't use C-style casts.
Don't memcpy or memcmp non-PODs.
Don't use unions to reinterpret representation.
Don't use varargs (ellipsis).
Don't use invalid objects. Don't use unsafe functions.
Don't treat arrays polymorphically.
Bibliography.
Summary
of Summaries.
Index.
About the Authors
Herb Sutter is a recognized expert on C++ software development and regularly
gives invited talks at conferences around the world. Author of more than 130
technical articles, Herb is also secretary of the ISO/ANSI C++ standards committee,
contributing editor and columnist for C/C++ Users Journal, and former
editor-in-chief of C++ Report. His popular "C++ Guru of the Week" series
is published on the primary Internet newsgroup for the C++ language, comp.lang.c++.moderated,
which he has moderated since its inception in 1995. Contact him at www.gotw.ca.
Andrei Alexandrescu is a development manager with RealNetworks, Inc.
A columnist for C/C++ Users Journal and a former columnist with C++
Report, his innovative work with C++ has earned him the respect of the leaders
in the field. Andrei’s technical interests include programming languages,
software reuse, and data compression.
Customer Reviews
Customer Reviews: 2 Average Customer Rating:      Apr 6, 2005     Frank Heimes from Germany Extremely usefull everyday coding reference Allan Clarke pointed out all relevant details in his review. I can fully subscribe to his point of view.
I've rarely seen so much usefull information condensed in 200 pages, yet most of it is very easy to read and understand.
These guide-lines immediately became an integral part of the software development at our company.
Nov 29, 2004     Allan Clarke A valuable guideline for every day use Herb Sutter and Andrei Alexandrescu have been long time contributors to the C++ community, so every time I see their names on a book, I expect to be challenged in how I think about developing software - I always have high expectations.
When I originally saw this book's title, I was thinking that the subject would be primarily about coding conventions. This is an area of interest to me, as I have 20+ years experience in software development and have set up our company's C++ coding conventions.
However, once I saw the table of contents, I realized that this would have a bit more depth than a coding convention. I think that this book is mis-titled; it ought to be "101 C++ Guidelines and Best Practices".
There is a distinction between coding conventions and "guidelines and best practices." Coding conventions that I have seen tend to delve into code micromanagement, usually for business rather than technical reasons (i.e., being able to more easily swap developers around).
The authors address this indirectly with the first item: "0. Don't sweat the small stuff. (Or: know what not to standardize)" (Note the bit of C++ humor in starting the numbering at 0!) In this item, the authors dispatch the notion of "stylistic issues" and focus for the remainder of the book on practical technical advice.
The areas that these guidelines cover include: Organizational and Policy Issues; Design Style; Coding Style; Functions and Operators; Design and Inheritance; Construction, Destruction, and Copying; Namespaces and Modules; Templates and Genericity; Error Handling and Exceptions; STL: Containers; STL: Algorithms; and Type Safety. I would strongly urge you to obtain a detailed breakout of the table of contents to help evaluate the appropriateness of this book to you (see http://www.gotw.ca/publications/c++cs.htm).
The authors assert that this book is for the whole spectrum of developers, beginners through advanced. For the most part, I agree with them. The biggest challenge with this subject matter is that those developers who have not been "burned" in the past will not always appreciate the wisdom espoused in these items. Take heed when they say that a lesson has been learned through "bitter experience."
Although there are 101 items in this book, I think there are one or two that are weak. One in particular, "99. Don't use invalid objects. Don't use unsafe functions," seems to address issues that should be obvious to even beginners.
On the other end of the spectrum, there are a couple of items whose efficacy is debatable. Consider item 39, "Consider making virtual functions non-public, and public functions non-virtual." I have seen the arguments for this design technique argued many times in the comp.lang.c++ group. I understand all the arguments in its favor, but personally have not yet put this into practice.
In the middle of these extremes are 97 or 98 very useful pieces of advice. As technical books tend to be expensive, most of us need to be choosey. This is one book that will pay back its cost many times over.
|