@@ -12,12 +12,12 @@ ES6 or TypeScript.
1212### General
1313
1414#### Write useful comments
15- Comments that explain what some block of code does are nice; they can tell you something in less
15+ Comments that explain what some block of code does are nice; they can tell you something in less
1616time than it would take to follow through the code itself.
1717
18- Comments that explain why some block of code exists at all, or does something the way it does,
19- are _ invaluable_ . The "why" is difficult, or sometimes impossible, to track down without seeking out
20- the original author. When collaborators are in the same room, this hurts productivity.
18+ Comments that explain why some block of code exists at all, or does something the way it does,
19+ are _ invaluable_ . The "why" is difficult, or sometimes impossible, to track down without seeking out
20+ the original author. When collaborators are in the same room, this hurts productivity.
2121When collaborators are in different timezones, this can be devastating to productivity.
2222
2323For example, this is a not-very-useful comment:
@@ -38,6 +38,11 @@ if (!$attrs['tabindex']) {
3838}
3939```
4040
41+ In TypeScript code, use JsDoc-style comments for descriptions (on classes, members, etc.) and
42+ use ` // ` style comments for everything else (explanations, background info, etc.).
43+
44+ In SCSS code, always use ` // ` style comments.
45+
4146#### Prefer more focused, granular components vs. complex, configurable components.
4247
4348For example, rather than doing this:
@@ -55,22 +60,22 @@ do this:
5560```
5661
5762#### Prefer small, focused modules
58- Keeping modules to a single responsibility makes the code easier to test, consume, and maintain.
59- ES6 modules offer a straightforward way to organize code into logical, granular units.
63+ Keeping modules to a single responsibility makes the code easier to test, consume, and maintain.
64+ ES6 modules offer a straightforward way to organize code into logical, granular units.
6065Ideally, individual files are 200 - 300 lines of code.
6166
62- As a rule of thumb, once a file draws near 400 lines (barring abnormally long constants / comments),
63- start considering how to refactor into smaller pieces.
67+ As a rule of thumb, once a file draws near 400 lines (barring abnormally long constants / comments),
68+ start considering how to refactor into smaller pieces.
6469
6570#### Less is more
66- Once a feature is released, it never goes away. We should avoid adding features that don't offer
67- high user value for price we pay both in maintenance, complexity, and payload size. When in doubt,
68- leave it out.
71+ Once a feature is released, it never goes away. We should avoid adding features that don't offer
72+ high user value for price we pay both in maintenance, complexity, and payload size. When in doubt,
73+ leave it out.
6974
70- This applies especially so to providing two different APIs to accomplish the same thing. Always
75+ This applies especially to providing two different APIs to accomplish the same thing. Always
7176prefer sticking to a _ single_ API for accomplishing something.
7277
73- ### 100 column limit
78+ ### 100 column limit
7479All code and docs in the repo should be 100 columns or fewer. This applies to TypeScript, SCSS,
7580HTML, bash scripts, and markdown files.
7681
@@ -105,7 +110,7 @@ Avoid `any` where possible. If you find yourself using `any`, consider whether a
105110appropriate in your case.
106111
107112For methods and properties that are part of a component's public API, all types must be explicitly
108- specified because our documentation tooling cannot currently infer types in places where TypeScript
113+ specified because our documentation tooling cannot currently infer types in places where TypeScript
109114can.
110115
111116#### Fluent APIs
@@ -123,9 +128,9 @@ class ConfigBuilder {
123128* Omit the ` public ` keyword as it is the default behavior.
124129* Use ` private ` when appropriate and possible, prefixing the name with an underscore.
125130* Use ` protected ` when appropriate and possible with no prefix.
126- * Prefix * library-internal* properties and methods with an underscore without using the ` private `
131+ * Prefix * library-internal* properties and methods with an underscore without using the ` private `
127132keyword. This is necessary for anything that must be public (to be used by Angular), but should not
128- be part of the user-facing API. This typically applies to symbols used in template expressions,
133+ be part of the user-facing API. This typically applies to symbols used in template expressions,
129134` @ViewChildren ` / ` @ContentChildren ` properties, host bindings, and ` @Input ` / ` @Output ` properties
130135(when using an alias).
131136
@@ -138,8 +143,8 @@ All public APIs must have user-facing comments. These are extracted and shown in
138143on [ material.angular.io] ( https://material.angular.io ) .
139144
140145Private and internal APIs should have JsDoc when they are not obvious. Ultimately it is the purview
141- of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
142- properties, and methods should have a JsDoc description.
146+ of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
147+ properties, and methods should have a JsDoc description.
143148
144149Properties should have a concise description of what the property means:
145150``` ts
@@ -169,7 +174,7 @@ Boolean properties and return values should use "Whether..." as opposed to "True
169174
170175##### General
171176* Prefer writing out words instead of using abbreviations.
172- * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
177+ * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
173178` align ` because the former much more exactly communicates what the property means.
174179* Except for ` @Input ` properties, use ` is ` and ` has ` prefixes for boolean properties / methods.
175180
@@ -187,31 +192,52 @@ class UniqueSelectionDispatcher { }
187192Avoid suffixing a class with "Service", as it communicates nothing about what the class does. Try to
188193think of the class name as a person's job title.
189194
195+ Classes that correspond to a directive with an ` md- ` prefix should also be prefixed with ` Md ` .
196+ CDK classes should not have a prefix.
197+
190198##### Methods
191- The name of a method should capture the action that is performed * by* that method.
199+ The name of a method should capture the action that is performed * by* that method rather than
200+ describing when the method will be called. For example,
201+
202+ ``` ts
203+ /** AVOID: does not describe what the function does. */
204+ handleClick () {
205+ // ...
206+ }
207+
208+ /** PREFER: describes the action performed by the function. */
209+ activateRipple () {
210+ // ...
211+ }
212+ ```
213+
214+ #### Inheritance
215+
216+ Avoid using inheritence to apply reusable behaviors to multiple components. This limits how many
217+ behaviors can be composed.
192218
193219### Angular
194220
195221#### Host bindings
196- Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
197- ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
222+ Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
223+ ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
198224decorators, and when one of the arguments for the method is a native ` Event ` type, this preserved
199- type information can lead to runtime errors in non-browser environments (e.g., server-side
200- pre-rendering).
225+ type information can lead to runtime errors in non-browser environments (e.g., server-side
226+ pre-rendering).
201227
202228
203229### CSS
204230
205231#### Be cautious with use of ` display: flex `
206- * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
207- is different than other display values, making it difficult to align flex elements with standard
232+ * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
233+ is different than other display values, making it difficult to align flex elements with standard
208234elements like input and button.
209235* Component outermost elements are never flex (block or inline-block)
210236* Don't use ` display: flex ` on elements that will contain projected content.
211237
212238#### Use lowest specificity possible
213- Always prioritize lower specificity over other factors. Most style definitions should consist of a
214- single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
239+ Always prioritize lower specificity over other factors. Most style definitions should consist of a
240+ single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
215241code organization.** This will allow users to much more easily override styles.
216242
217243For example, rather than doing this:
@@ -248,12 +274,12 @@ do this:
248274The end-user of a component should be the one to decide how much margin a component has around it.
249275
250276#### Prefer styling the host element vs. elements inside the template (where possible).
251- This makes it easier to override styles when necessary. For example, rather than
277+ This makes it easier to override styles when necessary. For example, rather than
252278
253279``` scss
254280the-host-element {
255281 // ...
256-
282+
257283 .some-child-element {
258284 color : red ;
259285 }
@@ -291,4 +317,4 @@ When it is not super obvious, include a brief description of what a class repres
291317
292318// Portion of the floating panel that sits, invisibly, on top of the input.
293319.mat-datepicker-input-mask { }
294- ```
320+ ```
0 commit comments