Contents


Overview
Preface
Introduction
Object-oriented design guidelines
C++ programming conventions
Taligent environment programming conventions
Taligent environment programming tips and techniques
Portability issues
Class templates
Bibliography
Preface
Acknowledgments
Introduction
Architectural goals
Object-oriented architecture
All interfaces are expressed through objects
Commonality is managed through inheritance
Objects are leveraged wherever possible
Frameworks provide the foundation
Let resources find you
Putting it all together
Object-oriented design guidelines
Classes
Reflect the client's view
Let resources find you
Express all interfaces through objects
Preserve class invariants
Object-oriented design with C++
C++ doesn't express full object interface
C++ requires definition of special member functions
Abstract base classes
Inheritance
Use type inheritance to share protocol
Useimplementation inheritance to override behavior
Design the interfaces between the base and derived classes
Expected calls
Group override
Getters and setters
Guarantee use of derived classes as arguments
Implement full protocol in derived classes
Preserve semantics in a derived class
Avoid deep nesting in lightweight objects
Multiple inheritance
Be aware of problems with virtual bases
Avoid multiple occurrences of a base
Performance by design
Design performance in
Conduct performance analysis
Perform controlled experiments
Use static objects instead of temporaries
Use chunky iteration for performance
Use cache objects
Common design problems and pitfalls
Object bloat
Lost object focus
Hardening of the architecture
Structification
Modulitis
Managers are not objects
Collections of functions are not objects
Encapsulation leakage
Empty base classes
Overeducated base classes
Overachieving base classes
Distinguish is-a from has-a relationships
C++ programming conventions
The C++ standard
Source file conventions
Include copyright notices
Use comments
Include function prototypes
Do not use code names in filenames
Enclose definitions in header files
Include only related classes in one file
Name conventions
Use specific names
But use generic names for abstract base classes
Avoid abbreviations
Use special names for copy, create, and adopt routines
Use global names only for classes
Avoid ordinary globals
Class definition conventions
Follow member function conventions
State explicit use of public, private, and protected
Use separate class definition sections
Type declaration conventions
Avoid raw C types with dimensions
Use dimensionless raw C types
Avoid type casting
Silent coercion
Cast operators
Summary
Use consistent return types for assignment operators
State typedef class names before specifications
Arguments and function results
Pass variables when possible
Use array arguments instead of pointers
Limit default arguments
Avoid functions with unspecified arguments (...)
Avoid returning pointers without allocation
Reference and value semantics: C++ versus everything else
Use pointers to make multiple references
Use references for a one-time reference
Allocate storage only if you must
Pretend everything is a primitive
Static object constructors
The C preprocessor
Use const instead of #define constants
Use enum instead of sets of constants
Use inlines instead of function macros
Use templates for specialized functions and classes
Things to avoid
Don't use goto
Avoid magic numbers
Avoid bit flags (& and |)
Avoid using arrays as local variables or object fields
Taligent environment programming conventions
Taligent libraries
Avoid homegrown utility classes
Use the Name Server
Storage management philosophy
Hide allocation inside a class
Don't assume use of a heap
Clarify ownership of storage in interfaces
Don't use very large local variables or members
Shared libraries
Avoid static objects
Modifiable statics in a library
Consider alternatives to temporary objects
Binary compatibility considerations
Adding virtual and nonvirtual functions
Changing a function from inline to noninline
Removing private nonvirtual functions not called by inlines
Using classes internal to your implementation
Use virtual functions if overrides are possible
Rearranging, adding, and removing private data members with restrictions
Inline functions
Inlines that call something else
Inline function definitions in .C files
Inlines for extreme efficiency
Don't write inlines in declarations
Inlines for exporting private and protected members
Empty special members
Virtual inline functions where the type is not known
Virtual functions
Define class abstractions
Decide now what might be overridden later
When to use pure virtual functions
Private virtual functions to control access
Base class constructors cannot call virtual functions
The cost of failing to call Initialize()
Destructors are not automatically virtual
Switch statements indicate polymorphism
When to use virtual assignment
Friend functions and classes
Exception handling
Exceptions checklist
Exceptions syntax
Avoid interface specification
Perform resource recovery
Automatic objects
Passing exceptions
TJanitor
Design exception classes
What to subclass
When to subclass
Summary
When to signal an exception
Destructors
When to recover an exception
Portable hash
Strive for uniform distribution
Do not implement Hash via member functions
Equality
Implications
When equality does not apply
Equality sample
Equality between different types
Implementation
Taligent environment programming tips and techniques
Surrogate objects
Taxonomy of surrogates
Explicit masters
Handle surrogates
Hidden masters
Surrogates that view masters
Storage management issues
Follow naming conventions
Use copy semantics wherever possible
Avoid storage manipulation in open code
Allocate subobjects on the heap for debugging
Concurrency and shared library issues
Synchronization techniques
Synchronization and problems with memory access
Synchronization of global and static variables
Shared memory between tasks
Shared heaps
Shared memory problems with const
Static destructors for subsystem cleanup
Miscellaneous programming tips
Create objects in a valid state
Use flattening rather than dynamic class instantiation
Check for self-assignment with operator=:
Balance overloaded operators
Use static members as constructors
Differentiate overloaded constructors
Hide implementation classes
Use nil pointer deletion
Issues in overloading and overriding classes
Control class access
Portability issues
Language and hardware assumptions
Safe assumptions
Bad assumptions
Synchronization
Portable data
Assembly language
Nonportable code
Class templates
Definitions and conventions
Template conventions
Include file conventions
Sharing class template implementations
General rules for implementation classes
The example class: an owning stack
Sharing the implementation through private inheritance
Class definitions
Naming conventions
Instance variables
Type-specific methods and implementation class constructors and destructors
Inlining the class template's public methods
Class templates that inherit from specialized classes
An implementation sharing example
Sharing the implementation by delegating to a member
An example of delegating to a member
The delegation example's naming conventions
The delegating-to-a-member example
Further reading
Bibliography

[Contents] [Previous] [Next]
Click the icon to mail questions or corrections about this material to Taligent personnel.
Copyright©1995 Taligent,Inc. All rights reserved.

Generated with WebMaker