blob: 4e13c193caf9b9cff15e75e6b0926d8f711038b5 [file] [log] [blame]
{namespace buck.codestyle}
/***/
{template .soyweb}
{call buck.page}
{param title: 'Code Style' /}
{param content}
Writing a detailed Java style guide takes a considerable amount of effort,
so here are the highlights for what we expect in Buck:
<ul class="{css top-level-list}">
<li>Spacing
<ul>
<li>Spaces only: no tabs.
<li>Standard indent is 2 spaces; continued lines are indented 4 spaces.
<li>Lines are a maximum of 100 columns.
<li>For a method call/declaration, if all params do not fit on one line,
then each param should be on its own line.
</ul>
<li>Naming
<ul>
<li>The use of Hungarian notation in any form is prohibited.
<li>Prefer descriptive names to single-letter names. The primary
exceptions to this rule are (1) the use of <code>e</code> for the
name of an exception in a <code>catch</code> block, and (2) the use
of <code>i</code> as the name of an index in a <code>for</code> loop.
</ul>
<li>Null
<ul>
<li>In the spirit of Guava, references are assumed to be
non-null unless otherwise noted.
<li>Non-null parameters should be verified using
{sp}<a href="{GUAVA_URL}
com/google/common/base/Preconditions.html#checkNotNull(T)">
<code>Preconditions.checkNotNull()</code></a>.
<li>A nullable reference should be annotated with
{sp}<code>@javax.annotation.Nullable</code>.
<li>A popular alternative to <code>@Nullable</code> is
{sp}<a href="{GUAVA_URL}
com/google/common/base/Optional.html">
<code>com.google.common.base.Optional</code></a>.
<li>Annotating an <code>Optional</code> as <code>@Nullable</code> is
grounds for dismissal.
</ul>
<li>APIs
<ul>
<li>Guava should be used liberally.
<li>In particular, favor Guava's immutable collections. In addition to
preventing aliasing bugs, they disallow <code>null</code> as an
element, which is in line with the previous bullet point.
<li><code>Logger</code>, <code>log4j</code>, etc. should not be used.
Log messages should be printed using
{sp}<code>com.facebook.buck.cli.Console</code> and should respect
the <code>--verbosity</code> flag.
</ul>
<li>Comments
<ul>
<li>Comments should be valid US-English sentences: they should start
with a capital letter and end with appropriate punctuation.
<li>One space after a full stop is preferred. This makes it easier to
honor the 100 column rule. This may violate what you learned in
high school, but browsers have been condensing your two spaces down
to one in HTML for years, so you are likely more accustomed to it than
you think.
<li>The specification of a field or member should be documented using
Javadoc (i.e., <code>&#x2F;** */</code>) rather than
implementation comments (i.e., <code>//</code>), even if the field
or member is <code>private</code>.
<li>A Javadoc comment should be preceded by a blank line.
</ul>
<li>Imports
<ul>
<li>No wildcards in imports.
<li>Non-<code>java</code> imports are listed before
{sp}<code>java</code> imports.
<li><code>java</code> imports are listed before
{sp}<code>javax</code> imports.
<li>Files should not contain unnecessary imports.
Use your favorite IDE to help you with this.
</ul>
<li>Warnings
<ul>
<li>Code should compile without warnings. To enforce this, we use a
combination of <code>-Xlint</code> and <code>-Werror</code> flags
to <code>javac</code> in addition to a number of other static checks
provided by <a href="http://pmd.sourceforge.net/">PMD</a>.
<li>Warnings should either be fixed or annotated with
{sp}<code>@SuppressWarnings("type-of-warning")</code>, as appropriate.
</ul>
</ul>
{/param}
{/call}
{/template}