|
| 1 | +# Style guide: Examples |
| 2 | + |
| 3 | +For more advice on writing examples, see the [relevant section](../../CONTRIBUTING.md#writing-examples) of CONTRIBUTING.md. |
| 4 | + |
| 5 | +## Organization |
| 6 | + |
| 7 | +1. Examples should live in an appropriate subfolder of `/examples`. |
| 8 | +2. Examples should be a single file if possible. |
| 9 | +3. Assets live in `./assets`. Try to avoid adding new assets unless strictly necessary to keep the repo small. Don't add "large" asset files. |
| 10 | +4. Each example should try to follow this order: |
| 11 | + 1. Imports |
| 12 | + 2. A `fn main()` block |
| 13 | + 3. Example logic |
| 14 | + 4. \[Optional\] Tests |
| 15 | +5. Try to structure app / plugin construction in the same fashion as the actual code. |
| 16 | + |
| 17 | +## Stylistic preferences |
| 18 | + |
| 19 | +1. Use simple, descriptive variable names. |
| 20 | + 1. Avoid names like `MyComponent` in favor of more descriptive terms like `Events`. |
| 21 | + 2. Prefer single letter differentiators like `EventsA` and `EventsB` to nonsense words like `EventsFoo` and `EventsBar`. |
| 22 | + 3. Avoid repeating the type of variables in their name where possible. For example, `Color` should be preferred to `ColorComponent`. |
| 23 | +2. Prefer glob imports of `bevy::prelude::*` and `bevy::sub_crate::*` over granular imports (for terseness). |
| 24 | +3. Use a consistent comment style: |
| 25 | + 1. `///` doc comments belong above `#[derive(Trait)]` invocations. |
| 26 | + 2. `//` comments should generally go above the line in question, rather than in-line. |
| 27 | + 3. Avoid `/* */` block comments, even when writing long comments. |
| 28 | + 4. Use \`variable_name\` code blocks in comments to signify that you're referring to specific types and variables. |
| 29 | + 5. Start comments with capital letters; end them with a period if they are sentence-like. |
| 30 | +4. Use comments to organize long and complex stretches of code that can't sensibly be refactored into separate functions. |
| 31 | +5. Avoid making variables `pub` unless it is needed for your example. |
| 32 | + |
| 33 | +## Code conventions |
| 34 | + |
| 35 | +1. Refactor configurable values ("magic numbers") out into constants with clear names. |
| 36 | +2. Prefer `for` loops over `.for_each`. The latter is faster (for now), but it is less clear for beginners, less idiomatic, and less flexible. |
| 37 | +3. Use `.single` and `.single_mut` where appropriate. |
| 38 | +4. In Queries, prefer `With<T>` filters over actually fetching unused data with `&T`. |
| 39 | +5. Prefer disjoint queries using `With` and `Without` over query sets when you need more than one query in a single system. |
| 40 | +6. Prefer structs with named fields over tuple structs except in the case of single-field wrapper types. |
| 41 | +7. Use enum-labels over string-labels for system / stage / etc. labels. |
| 42 | + |
| 43 | +## "Feature" examples |
| 44 | + |
| 45 | +These examples demonstrate the usage of specific engine features in clear, minimal ways. |
| 46 | + |
| 47 | +1. Focus on demonstrating exactly one feature in an example |
| 48 | +2. Try to keep your names divorced from the context of a specific game, and focused on the feature you are demonstrating. |
| 49 | +3. Where they exist, show good alternative approaches to accomplish the same task and explain why you may prefer one over the other. |
| 50 | +4. Examples should have a visible effect when run, either in the command line or a graphical window. |
| 51 | + |
| 52 | +## "Game" examples |
| 53 | + |
| 54 | +These examples show how to build simple games in Bevy in a cohesive way. |
| 55 | + |
| 56 | +1. Each of these examples lives in the [/examples/games] folder. |
| 57 | +2. Aim for minimum but viable status: the game should be playable and not obviously buggy but does not need to be polished, featureful, or terribly fun. |
| 58 | +3. Focus on code quality and demonstrating good, extensible patterns for users. |
| 59 | + 1. Make good use of enums and states to organize your game logic. |
| 60 | + 2. Keep components as small as possible but no smaller: all of the data on a component should generally be accessed at once. |
| 61 | + 3. Keep systems small: they should have a clear single purpose. |
| 62 | + 4. Avoid duplicating logic across similar entities whenever possible by sharing systems and components. |
| 63 | +4. Use `///` doc comments to explain what each function / struct does as if the example were part of a polished production codebase. |
| 64 | +5. Arrange your code into modules within the same file to allow for simple code folding / organization. |
0 commit comments