diff --git a/.divinerconfig b/.divinerconfig index 4805c55..42f3283 100644 --- a/.divinerconfig +++ b/.divinerconfig @@ -1,18 +1,19 @@ { "name" : "libphutil", "src_base" : "https://github.com/facebook/libphutil/blob/master", "groups" : { "overview" : "Overview", + "contrib" : "Contributing to libphutil", "working" : "Working with libphutil", "util" : "Core Utilities", "library" : "Phutil Module System", "filesystem" : "Filesystem", "exec" : "Command Execution", "futures" : "Futures", "markup" : "Markup", "console" : "Console Utilities", "xhpast" : "XHPAST (PHP/XHP Parser)", "conduit" : "Conduit (Service API)" } } diff --git a/src/docs/standards.diviner b/src/docs/standards.diviner new file mode 100644 index 0000000..c9ba78c --- /dev/null +++ b/src/docs/standards.diviner @@ -0,0 +1,165 @@ +@title Coding Standards +@group contrib + +This document describes coding standards for libphutil and related projects +(like Arcanist, Diviner, and Aphront). + += Overview = + +This document outlines technical and style guidelines which are followed in +libphutil. Contributors should also follow these guidelines. Many of these +guidelines are automatically enforced by lint. + += Spaces, Linebreaks and Indentation = + + - Use two spaces for indentation. Don't use tab literal characters. + - Use Unix linebreaks ("\n"), not MSDOS ("\r\n") or OS9 ("\r"). + - Use K&R style braces and spacing. + - Put a space after control keywords like ##if## and ##for##. + - Put a space after commas in argument lists. + - Put a space around operators like ##=##, ##<##, etc. + - Don't put spaces after function names. + - Parentheses should hug their contents. + - Generally, prefer to wrap code at 80 columns. + += Case and Capitalization = + + - Name variables and functions using ##lowercase_with_underscores##. + - Name classes using ##UpperCamelCase##. + - Name methods and properties using ##lowerCamelCase##. + - Use uppercase for common acronyms like ID and HTML. + - Name constants using ##UPPERCASE##. + - Write ##true##, ##false## and ##null## in lowercase. + += Comments = + + - Do not use "#" (shell-style) comments. + - Prefer "//" comments inside function and method bodies. + += PHP Language Style = + + - Use "" tag. + - Prefer casts like ##(string)## to casting functions like ##strval()##. + - Prefer type checks like ##$v === null## to type functions like + ##is_null()##. + - Avoid all crazy alternate forms of language constructs like "endwhile" + and "<>". + - Always put braces around conditional and loop blocks. + += PHP Language Features = + + - Use PHP as a programming language, not a templating language. + - Avoid globals. + - Avoid extract(). + - Avoid eval(). + - Avoid variable variables. + - Prefer classes over functions. + - Prefer class constants over defines. + - Avoid naked class properties; instead, define accessors. + - Use exceptions for error conditions. + += Examples = + +**if/else:** + + if ($some_variable > 3) { + // ... + } else if ($some_variable === null) { + // ... + } else { + // ... + } + +You should always put braces around the body of an if clause, even if it is only +one line long. Note spaces around operators and after control statements. Do not +use the "endif" construct, and write "else if" as two words. + +**for:** + + for ($ii = 0; $ii < 10; $ii++) { + // ... + } + +Prefer $ii, $jj, $kk, etc., as iterators, since they're easier to pick out +visually and react better to "Find Next..." in editors. + +**foreach:** + + foreach ($map as $key => $value) { + // ... + } + +**switch:** + + switch ($value) { + case 1: + // ... + break; + case 2: + if ($flag) { + // ... + break; + } + break; + default: + // ... + break; + } + +##break## statements should be indented to block level. + +**array literals:** + + $junk = array( + 'nuts', + 'bolts', + 'refuse', + ); + +Use a trailing comma and put the closing parenthesis on a separate line so that +diffs which add elements to the array affect only one line. + +**operators:** + + $a + $b; // Put spaces around operators. + $omg.$lol; // Exception: no spaces around string concatenation. + $arr[] = $element; // Couple [] with the array when appending. + $obj = new Thing(); // Always use parens. + +**function/method calls:** + + // One line + eject($cargo); + + // Multiline + AbstractFireFactoryFactoryEngine::promulgateConflagrationInstance( + $fuel, + $ignition_source); + +**function/method definitions:** + + function example_function($base_value, $additional_value) { + return $base_value + $additional_value; + } + + class C { + public static function promulgateConflagrationInstance( + IFuel $fuel, + IgnitionSource $source) { + // ... + } + } + +**class:** + + class Dog extends Animal { + + const CIRCLES_REQUIRED_TO_LIE_DOWN = 3; + + private $favoriteFood = 'dirt'; + + public function getFavoriteFood() { + return $this->favoriteFood; + } + } +