207 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # ThrowTheSwitch.org Coding Standard
 | |
| 
 | |
| Hi. Welcome to the coding standard for ThrowTheSwitch.org. For the most part,
 | |
| we try to follow these standards to unify our contributors' code into a cohesive
 | |
| unit (puns intended). You might find places where these standards aren't
 | |
| followed. We're not perfect. Please be polite where you notice these discrepancies
 | |
| and we'll try to be polite when we notice yours.
 | |
| 
 | |
| ;)
 | |
| 
 | |
| 
 | |
| ## Why Have A Coding Standard?
 | |
| 
 | |
| Being consistent makes code easier to understand. We've tried to keep
 | |
| our standard simple because we also believe that we can only expect someone to
 | |
| follow something that is understandable. Please do your best.
 | |
| 
 | |
| 
 | |
| ## Our Philosophy
 | |
| 
 | |
| Before we get into details on syntax, let's take a moment to talk about our
 | |
| vision for these tools. We're C developers and embedded software developers.
 | |
| These tools are great to test any C code, but catering to embedded software has
 | |
| made us more tolerant of compiler quirks. There are a LOT of quirky compilers
 | |
| out there. By quirky I mean "doesn't follow standards because they feel like
 | |
| they have a license to do as they wish."
 | |
| 
 | |
| Our philosophy is "support every compiler we can". Most often, this means that
 | |
| we aim for writing C code that is standards compliant (often C89... that seems
 | |
| to be a sweet spot that is almost always compatible). But it also means these
 | |
| tools are tolerant of things that aren't common. Some that aren't even
 | |
| compliant. There are configuration options to override the size of standard
 | |
| types. There are configuration options to force Unity to not use certain
 | |
| standard library functions. A lot of Unity is configurable and we have worked
 | |
| hard to make it not TOO ugly in the process.
 | |
| 
 | |
| Similarly, our tools that parse C do their best. They aren't full C parsers
 | |
| (yet) and, even if they were, they would still have to accept non-standard
 | |
| additions like gcc extensions or specifying `@0x1000` to force a variable to
 | |
| compile to a particular location. It's just what we do, because we like
 | |
| everything to Just Work™.
 | |
| 
 | |
| Speaking of having things Just Work™, that's our second philosophy. By that, we
 | |
| mean that we do our best to have EVERY configuration option have a logical
 | |
| default. We believe that if you're working with a simple compiler and target,
 | |
| you shouldn't need to configure very much... we try to make the tools guess as
 | |
| much as they can, but give the user the power to override it when it's wrong.
 | |
| 
 | |
| 
 | |
| ## Naming Things
 | |
| 
 | |
| Let's talk about naming things. Programming is all about naming things. We name
 | |
| files, functions, variables, and so much more. While we're not always going to
 | |
| find the best name for something, we actually put a bit of effort into
 | |
| finding *What Something WANTS to be Called*™.
 | |
| 
 | |
| When naming things, we follow this hierarchy, the first being the
 | |
| most important to us (but we do all four when possible):
 | |
| 1. Readable
 | |
| 2. Descriptive
 | |
| 3. Consistent
 | |
| 4. Memorable
 | |
| 
 | |
| 
 | |
| #### Readable
 | |
| 
 | |
| We want to read our code. This means we like names and flow that are more
 | |
| naturally read. We try to avoid double negatives. We try to avoid cryptic
 | |
| abbreviations (sticking to ones we feel are common).
 | |
| 
 | |
| 
 | |
| #### Descriptive
 | |
| 
 | |
| We like descriptive names for things, especially functions and variables.
 | |
| Finding the right name for something is an important endeavor. You might notice
 | |
| from poking around our code that this often results in names that are a little
 | |
| longer than the average. Guilty. We're okay with a bit more typing if it
 | |
| means our code is easier to understand.
 | |
| 
 | |
| There are two exceptions to this rule that we also stick to as religiously as
 | |
| possible:
 | |
| 
 | |
| First, while we realize hungarian notation (and similar systems for encoding
 | |
| type information into variable names) is providing a more descriptive name, we
 | |
| feel that (for the average developer) it takes away from readability and is to be avoided.
 | |
| 
 | |
| Second, loop counters and other local throw-away variables often have a purpose
 | |
| which is obvious. There's no need, therefore, to get carried away with complex
 | |
| naming. We find i, j, and k are better loop counters than loopCounterVar or
 | |
| whatnot. We only break this rule when we see that more description could improve
 | |
| understanding of an algorithm.
 | |
| 
 | |
| 
 | |
| #### Consistent
 | |
| 
 | |
| We like consistency, but we're not really obsessed with it. We try to name our
 | |
| configuration macros in a consistent fashion... you'll notice a repeated use of
 | |
| UNITY_EXCLUDE_BLAH or UNITY_USES_BLAH macros. This helps users avoid having to
 | |
| remember each macro's details.
 | |
| 
 | |
| 
 | |
| #### Memorable
 | |
| 
 | |
| Where ever it doesn't violate the above principles, we try to apply memorable
 | |
| names. Sometimes this means using something that is simply descriptive, but
 | |
| often we strive for descriptive AND unique... we like quirky names that stand
 | |
| out in our memory and are easier to search for. Take a look through the file
 | |
| names in Ceedling and you'll get a good idea of what we are talking about here.
 | |
| Why use preprocess when you can use preprocessinator? Or what better describes a
 | |
| module in charge of invoking tasks during releases than release_invoker? Don't
 | |
| get carried away. The names are still descriptive and fulfill the above
 | |
| requirements, but they don't feel stale.
 | |
| 
 | |
| 
 | |
| ## C and C++ Details
 | |
| 
 | |
| We don't really want to add to the style battles out there. Tabs or spaces?
 | |
| How many spaces? Where do the braces go? These are age-old questions that will
 | |
| never be answered... or at least not answered in a way that will make everyone
 | |
| happy.
 | |
| 
 | |
| We've decided on our own style preferences. If you'd like to contribute to these
 | |
| projects (and we hope that you do), then we ask if you do your best to follow
 | |
| the same. It will only hurt a little. We promise.
 | |
| 
 | |
| 
 | |
| #### Whitespace
 | |
| 
 | |
| Our C-style is to use spaces and to use 4 of them per indent level. It's a nice
 | |
| power-of-2 number that looks decent on a wide-screen. We have no more reason
 | |
| than that. We break that rule when we have lines that wrap (macros or function
 | |
| arguments or whatnot). When that happens, we like to indent further to line
 | |
| things up in nice tidy columns.
 | |
| 
 | |
| ```C
 | |
|     if (stuff_happened)
 | |
|     {
 | |
|         do_something();
 | |
|     }
 | |
| ```
 | |
| 
 | |
| 
 | |
| #### Case
 | |
| 
 | |
| - Files - all lower case with underscores.
 | |
| - Variables - all lower case with underscores
 | |
| - Macros - all caps with underscores.
 | |
| - Typedefs - all caps with underscores. (also ends with _T).
 | |
| - Functions - camel cased. Usually named ModuleName_FuncName
 | |
| - Constants and Globals - camel cased.
 | |
| 
 | |
| 
 | |
| #### Braces
 | |
| 
 | |
| The left brace is on the next line after the declaration. The right brace is
 | |
| directly below that. Everything in between in indented one level. If you're
 | |
| catching an error and you have a one-line, go ahead and to it on the same line.
 | |
| 
 | |
| ```C
 | |
|     while (blah)
 | |
|     {
 | |
|         //Like so. Even if only one line, we use braces.
 | |
|     }
 | |
| ```
 | |
| 
 | |
| 
 | |
| #### Comments
 | |
| 
 | |
| Do you know what we hate? Old-school C block comments. BUT, we're using them
 | |
| anyway. As we mentioned, our goal is to support every compiler we can,
 | |
| especially embedded compilers. There are STILL C compilers out there that only
 | |
| support old-school block comments. So that is what we're using. We apologize. We
 | |
| think they are ugly too.
 | |
| 
 | |
| 
 | |
| ## Ruby Details
 | |
| 
 | |
| Is there really such thing as a Ruby coding standard? Ruby is such a free form
 | |
| language, it seems almost sacrilegious to suggest that people should comply to
 | |
| one method! We'll keep it really brief!
 | |
| 
 | |
| 
 | |
| #### Whitespace
 | |
| 
 | |
| Our Ruby style is to use spaces and to use 2 of them per indent level. It's a
 | |
| nice power-of-2 number that really grooves with Ruby's compact style. We have no
 | |
| more reason than that. We break that rule when we have lines that wrap. When
 | |
| that happens, we like to indent further to line things up in nice tidy columns.
 | |
| 
 | |
| 
 | |
| #### Case
 | |
| 
 | |
| - Files - all lower case with underscores.
 | |
| - Variables - all lower case with underscores
 | |
| - Classes, Modules, etc - Camel cased.
 | |
| - Functions - all lower case with underscores
 | |
| - Constants - all upper case with underscores
 | |
| 
 | |
| 
 | |
| ## Documentation
 | |
| 
 | |
| Egad. Really? We use mark down and we like pdf files because they can be made to
 | |
| look nice while still being portable. Good enough?
 | |
| 
 | |
| 
 | |
| *Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*
 | 
