| # Coding conventions |
| |
| Since we all want to spend more time coding and less time fiddling with whitespace, Material |
| Components for iOS uses coding conventions and styles to encourage consistency. Code with a |
| consistent coding style is easier (and less error-prone!) to review, maintain, and understand. |
| |
| In general, we try to use established conventions instead of spending engineering time on developing |
| new ones; please be patient if MDC's coding style isn't the same as your preferred coding style. :) |
| |
| ## Be consistent |
| |
| If you're not sure what to do in any particular situation, the cardinal rule is to **be |
| consistent**. For example, take a look at the surrounding code and do whatever it's doing, or look |
| for similar classes elsewhere in the code base. |
| |
| ## General conventions |
| |
| ### Minimize dependencies |
| |
| Avoid non-essential dependencies between components. |
| |
| A goal of MDC is to allow each component to be used independently of the others, as much as |
| reasonably possible. |
| |
| - Dependencies increase cost of maintenance and cost of usage for a component, and |
| - Dependency-less components are much easier to add and remove from a project. |
| - In particular, "Core"- or "Utility"-type components often become a dumping ground and artificially |
| increase interdependencies between components. |
| |
| Recommendations: |
| |
| - Aim for zero non-platform dependencies. |
| - Create small, targeted components. |
| - Watch out for the tendency for components to grow in scope or become overly vague and |
| "utility"-like. |
| |
| ## Objective-C |
| |
| Objective-C must be used for the implementation of components and can be used for unit tests, UI |
| tests, and demonstration apps. |
| |
| ### Style |
| |
| Material Components for iOS follows [Google's Objective-C style |
| guide](https://google.github.io/styleguide/objcguide.xml) for Objective-C code. Note that the |
| Objective-C style guide uses the [Google C++ style |
| guide](https://google.github.io/styleguide/cppguide.html) as its "superclass", meaning that rules |
| from the C++ style guide are in effect unless the Objective-C style guide indicates otherwise. |
| |
| #### clang-format |
| |
| We use [clang-format](http://clang.llvm.org/docs/ClangFormat.html) to automatically format our |
| Objective-C code. If you're going to be contributing more than a few one-offs, we suggest |
| [installing clang-format](clang-format.md) to take care of the formatting for you. We recommend |
| running clang format on your changes before sending a pull request because it will facilitate |
| readability by everyone working on the project. |
| |
| ### Nullability annotations |
| |
| Add [nullability annotations](https://developer.apple.com/swift/blog/?id=25) to your public APIs to |
| improve Objective-C and Swift interoperations. |
| |
| * Use `_Nullable` and `_Nonnull`, not `__nullable` and `__nonnull`, since the latter are for Xcode |
| 6.3, which we do not support. |
| * Explicitly annotate all public APIs instead of using `NS_ASSUME_NONNULL_BEGIN` and |
| `NS_ASSUME_NONNULL_END`. |
| |
| ### Macros |
| |
| Avoid macros. |
| |
| * Most uses of macros can be replaced with `static inline` C functions. |
| * Macros are appropriate when dealing with system-level macros like |
| `__IPHONE_OS_VERSION_MIN_REQUIRED`. |
| |
| ### A note about subclassing a UIView |
| |
| Assume you've created MDCFooSpinner which subclasses UIView. |
| |
| * Implement both initWithFrame: and initWithCoder:. |
| * If both init methods are setting up the same state, each should call a common method. |
| * To avoid collisions and problems subclasses, this common method should be named |
| commonMDCFooSpinnerInit. |
| |
| ## Swift |
| |
| Swift cannot be used for the implementation of components, but is encouraged for unit tests, UI |
| tests, and demonstration apps. |
| |
| Given the rapid change in the Swift language and coding styles, we don't enforce any particular |
| style of Swift except to follow the cardinal rule: *be consistent*. |