@@ -12,12 +12,12 @@ ES6 or TypeScript.
12
12
### General
13
13
14
14
#### 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
16
16
time than it would take to follow through the code itself.
17
17
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.
21
21
When collaborators are in different timezones, this can be devastating to productivity.
22
22
23
23
For example, this is a not-very-useful comment:
@@ -38,6 +38,11 @@ if (!$attrs['tabindex']) {
38
38
}
39
39
```
40
40
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
+
41
46
#### Prefer more focused, granular components vs. complex, configurable components.
42
47
43
48
For example, rather than doing this:
@@ -55,22 +60,22 @@ do this:
55
60
```
56
61
57
62
#### 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.
60
65
Ideally, individual files are 200 - 300 lines of code.
61
66
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.
64
69
65
70
#### 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.
69
74
70
- This applies especially so to providing two different APIs to accomplish the same thing. Always
75
+ This applies especially so to providing two different APIs to accomplish the same thing. Always
71
76
prefer sticking to a _ single_ API for accomplishing something.
72
77
73
- ### 100 column limit
78
+ ### 100 column limit
74
79
All code and docs in the repo should be 100 columns or fewer. This applies to TypeScript, SCSS,
75
80
HTML, bash scripts, and markdown files.
76
81
@@ -81,7 +86,7 @@ Avoid `any` where possible. If you find yourself using `any`, consider whether a
81
86
appropriate in your case.
82
87
83
88
For methods and properties that are part of a component's public API, all types must be explicitly
84
- specified because our documentation tooling cannot currently infer types in places where TypeScript
89
+ specified because our documentation tooling cannot currently infer types in places where TypeScript
85
90
can.
86
91
87
92
#### Fluent APIs
@@ -99,9 +104,9 @@ class ConfigBuilder {
99
104
* Omit the ` public ` keyword as it is the default behavior.
100
105
* Use ` private ` when appropriate and possible, prefixing the name with an underscore.
101
106
* Use ` protected ` when appropriate and possible with no prefix.
102
- * Prefix * library-internal* properties and methods with an underscore without using the ` private `
107
+ * Prefix * library-internal* properties and methods with an underscore without using the ` private `
103
108
keyword. This is necessary for anything that must be public (to be used by Angular), but should not
104
- be part of the user-facing API. This typically applies to symbols used in template expressions,
109
+ be part of the user-facing API. This typically applies to symbols used in template expressions,
105
110
` @ViewChildren ` / ` @ContentChildren ` properties, host bindings, and ` @Input ` / ` @Output ` properties
106
111
(when using an alias).
107
112
@@ -114,14 +119,14 @@ All public APIs must have user-facing comments. These are extracted and shown in
114
119
on [ material.angular.io] ( https://material.angular.io ) .
115
120
116
121
Private and internal APIs should have JsDoc when they are not obvious. Ultimately it is the purview
117
- of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
118
- properties, and methods should have a JsDoc description.
122
+ of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
123
+ properties, and methods should have a JsDoc description.
119
124
120
125
Properties should have a concise description of what the property means:
121
126
``` ts
122
127
/** The label position relative to the checkbox. Defaults to 'after' */
123
128
@Input () labelPosition : ' before' | ' after' = ' after' ;
124
- ```
129
+ ```
125
130
126
131
Methods blocks should describe what the function does and provide a description for each parameter
127
132
and the return value:
@@ -145,7 +150,7 @@ Boolean properties and return values should use "Whether..." as opposed to "True
145
150
146
151
##### General
147
152
* Prefer writing out words instead of using abbreviations.
148
- * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
153
+ * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
149
154
` align ` because the former much more exactly communicates what the property means.
150
155
* Except for ` @Input ` properties, use ` is ` and ` has ` prefixes for boolean properties / methods.
151
156
@@ -163,31 +168,52 @@ class UniqueSelectionDispatcher { }
163
168
Avoid suffixing a class with "Service", as it communicates nothing about what the class does. Try to
164
169
think of the class name as a person's job title.
165
170
171
+ Classes that correspond to a directive with an ` md- ` prefix should also be prefixed with ` Md ` .
172
+ CDK classes should not have a prefix.
173
+
166
174
##### Methods
167
- The name of a method should capture the action that is performed * by* that method.
175
+ The name of a method should capture the action that is performed * by* that method rather than
176
+ describing when the method will be called. For example,
177
+
178
+ ``` ts
179
+ /** AVOID: does not describe what the function does. */
180
+ handleClick () {
181
+ // ...
182
+ }
183
+
184
+ /** PREFER: describes the action performed by the function. */
185
+ activateRipple () {
186
+ // ...
187
+ }
188
+ ```
189
+
190
+ #### Inheritance
191
+
192
+ Avoid using inheritence to apply reusable behaviors to multiple components. This limits how many
193
+ behaviors can be composed.
168
194
169
195
### Angular
170
196
171
197
#### Host bindings
172
- Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
173
- ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
198
+ Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
199
+ ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
174
200
decorators, and when one of the arguments for the method is a native ` Event ` type, this preserved
175
- type information can lead to runtime errors in non-browser environments (e.g., server-side
176
- pre-rendering).
201
+ type information can lead to runtime errors in non-browser environments (e.g., server-side
202
+ pre-rendering).
177
203
178
204
179
205
### CSS
180
206
181
207
#### Be cautious with use of ` display: flex `
182
- * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
183
- is different than other display values, making it difficult to align flex elements with standard
208
+ * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
209
+ is different than other display values, making it difficult to align flex elements with standard
184
210
elements like input and button.
185
211
* Component outermost elements are never flex (block or inline-block)
186
212
* Don't use ` display: flex ` on elements that will contain projected content.
187
213
188
214
#### Use lowest specificity possible
189
- Always prioritize lower specificity over other factors. Most style definitions should consist of a
190
- single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
215
+ Always prioritize lower specificity over other factors. Most style definitions should consist of a
216
+ single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
191
217
code organization.** This will allow users to much more easily override styles.
192
218
193
219
For example, rather than doing this:
@@ -224,12 +250,12 @@ do this:
224
250
The end-user of a component should be the one to decide how much margin a component has around it.
225
251
226
252
#### Prefer styling the host element vs. elements inside the template (where possible).
227
- This makes it easier to override styles when necessary. For example, rather than
253
+ This makes it easier to override styles when necessary. For example, rather than
228
254
229
255
``` scss
230
256
the-host-element {
231
257
// ...
232
-
258
+
233
259
.some-child-element {
234
260
color : red ;
235
261
}
@@ -267,4 +293,4 @@ When it is not super obvious, include a brief description of what a class repres
267
293
268
294
// Portion of the floating panel that sits, invisibly, on top of the input.
269
295
.mat-datepicker-input-mask { }
270
- ```
296
+ ```
0 commit comments