Coding Style
----------------------------------------------------------------------
Variables:
- Integer and bool constants should be defined as enumerations.
- Constants should have every character capitalized and each word is separated
by underscore.
- Global variables should never be used except in the case of a singleton
class or a fixed size array with preset information. Global variable names
should start with lowercased class namea followed by words that have first
character capitalized. For example: debugInstance, configParserRegistry.
In the case of singleton, an accessor function should be provided so that
all the functions will access it indirectly. However, it is not needed for
array.
- Local variables and struct member variables should be lowercased and should
not have any separating underscore between words.
- Variable names should strive to be descriptive.
- Function argument if in the case such that its type does not fully reveal
its real type should try to be type suggesting. For example: char *path.
All class function should name its first variable self with the class' type.
In the case of interface where type of first variable differs from the
class' type, lowercased name of its type is prefered as variable name.
- Local variables and struct members should be role suggesting.
- In the case such that no descriptive name can be found or such descriptive
name is way too long while having a short name is equally descriptive, then
the short name is preferred. For example: int i, for looping.
Functions:
- Each word should be separated by underscores between them unless such word
is used in many functions in which that word serves a common purpose. For
example: isempty, notempty, onclick. However, class name is treated
differently.
- Class functions should be prefixed with the lowercased class name followed
by an underscore then followed by the rest of the function name.
- Getter functions should not use the word 'get' in the function name while
setter function should have the word 'set' in their function names.
- Singleton's class should still assert in the functions pretending that it is
not singleton class.
Class:
- Each class must provide a construtor class_new(), and destructor
class_free().
- Parent class should never try to call free on self. It should let the
children class to call free on self. Parent should free whatever field it
has allocated.
- Destructor should take in double pointer and then set the pointer to nil
when done freeing.
- Singleton function should set variables to nil in destroy functions.
Functors:
- Functors' typedef should follow the the rule for local variables.
- Struct's Functor member and function functor argument follow the same rule
as function since they are used like a function.
Assertions:
- Assertions should always be used when dealing with pointers internal to the
program itself. However, dealing with outside influence such as when
writing a library, pointers should always be checked and not asserted since
the users are out of the library's control.
- helper function whose arguments are already asserted by caller and the
helper function will never be called by other function directly should not
assert the arguments again.
- subclass' operations (functions that are dynamically dispatched), should not
assert, since the parent that dispatches the function.
- If just calling other public function in the same class that will assert the
variables, then assertion is not needed.
Class:
- Class should try to hide as much of its implementation as possible, so it's
most preferrable if each class only provides a typedef in the header w/o
struct def. Also, class should provide a class_new and class_free function.
- class_free function should accept a double pointer to the class and then set
the single pointer to nil after freeing.
- If new/free is not possible, then class must set up init and destroy
function.
|