CodingGuidelinesObjectiveC

From HerzbubeWiki
Jump to navigation Jump to search

Sequence

The first thing in every .h or .m file is the license block (GPL or otherwise)

The next thing are all #include statements

  • first comes a block with includes from the project (if any) with a leading comment "Project includes"
  • second come all other includes, where includes from the same external source are grouped together in blocks, each block having a header comment that specifies the source

The third thing are forward declarations, with a leading comment "Forward declarations"

The fourth thing, where applicaple are the following things grouped together in blocks, each block having a header comment specifying the block's content

  • enumerations
  • declarations of helper classes/structs
  • constants
  • #define statements (try not to use)
  • typedefs (try not to use)
  • categories

The last thing is either the main class' interface (in the .h file) or implementation (in the .m file).

Methods are implemented in the following order: init, alloc, new, copy, dealloc, other methods.


Example (omitting the license):


// Cocoa
#import <Cocoa/Cocoa.h>

// Forward declarations
@class AceXpanderItem;
@class AceXpanderThread;

// Enumerations
enum AceXpanderItemState
{
   QueuedState     = 0,
   SkipState       = 1,
   ProcessingState = 2,
   AbortedState    = 3,
   SuccessState    = 4,
   FailureState    = 5
};

 
@interface AceXpanderModel : NSObject
{
@private
  NSTableView* m_theTable;
  // ...
}

- (id) init;
  // ...

@end


Documentation

Everything needs to be documented with doxygen documentation blocks.

Doxygen commands are written javadoc-style, using the "@" prefix. Documentation lines should start with the "///" notation:

/// @brief bla bla bla

Documentation blocks should start and end with a distinct separator line. The separator line should start with "//" to prevent doxygen from parsing it.

// -----------------------------------------------------------------------------
/// @brief bla bla bla
///
/// detailed description bla bla bla
// -----------------------------------------------------------------------------


The class documentation is placed in front of the @interface keyword of the class. Because ObjectiveC does not use the "class" keyword, doxygen must be explicitly told that this is a class documentation:

/// @class AceXpanderItem
/// ... 


Doxygen recognizes categories, so we don't have to explicitly identify them:


/// @brief This category declares private methods for the AceXpanderItem class. 
@interface AceXpanderItem(Private)
// ...
@end


Doxygen automatically generates links to methods if they are referenced using the following syntax:

/// @note This is an internal helper method. It is called exactly once per
/// object, from initWithLine:().


Doxygen prints out a warning that methods are undocumented if they appear in declarations of private categories without a grouping around them'. In the following example the method dealloc() is documented, but resetResults() is not:

@interface DGSMonXServer(Private)
/// @name Initialization and deallocation
//@{
- (void) dealloc;
//@}

- (void) resetResults;

Notes:

  • Even if warnings are printed, the actual documentation is properly generated
  • I encountered the problem with Doxygen 1.5.6, it might be fixed in later versions


Identifier names

Class names start with an uppercase letter and use camel case.

Method names start with a lowercase letter and use camel case.

Member variables (regardless of whether they are instance or class members) use a prefix "m_". A member variable that corresponds to a property uses the property's name (e.g. m_icon).

Simple getter methods use the same name as the property (e.g. icon).

Setter methods use the property name prefixed with "set" (e.g. setIcon).


Miscellaneous

Private methods of a class are declared in a separate category named "Private" in the .m file. For instance:

@interface AceXpanderItem(Private)
// ... methods ...
@end