Способы написания составных слов

Одной из важных составляющих работы программиста является поиск хороших, правильных названий классам, методам, переменным и многим другим элементам программного кода. При этом мы стараемся подобрать короткое, но емкое название, точно отражающее его суть. В большинстве случаев одного слова для этого недостаточно. Если количество слов в название больше двух, то возникает вопрос - как соединить эти слова в одно и при этом не в ущерб читабельности.

Прежде чем продолжить отмечу, что в данной статье рассматривается лишь практики написания составных слов, используемые в PHP сообществе. Все выводы, изложенные здесь, являются личным мнением автора и основаны на его личном опыте и наблюдениях.

Символ пробела в названиях, как известно, является запрещенным символом, поэтому использовать пробел в качестве разделителя мы не можем. Пожалуй, единственным исключением тут являются ключи элементов массива. Там можно поставить пробел где угодно, ведь ключ это обычная строка. Но даже в этом случае использование пробелов считается плохой практикой. Что же в этом случае использовать в качестве разделителя слов?

Snake Case

Первое, что приходит на ум начинающему программисту - заменить пробел подчеркиванием. Этот стиль называется snake_case или змеиный стиль. Далее могут быть варианты с регистрами символов. Например, все символы могут быть написаны в верхнем регистре SNAKE_CASE или нижнем snake_case, или в нижнем, кроме первого символа каждого слова Snake_Case. Несмотря на всю очевидность этого подхода, используется он не так уж и часто. Чаще всего этот стиль можно встретить в именах констант и ключей элементов массивов. Реже в названиях классов, методов, свойств.

Примеры:

// Название функции в WordPress
function wp_cache_add 

// Название класса в WordPress
class WP_Comments_List_Table 

// Свойство класса в WordPress
public $http_version = 0.0 

// Название константы в Zend Framework 2
const OPERATOR_NOT_EQUAL_TO 

// Константа в Symfony 2
const HEADER_CLIENT_IP    = 'client_ip';

// Ключи массива в Symfony 2
$resolver->setDefaults(array(
    'validation_groups' => null,
));

// Ключи массива в Zend Framework 2
'module_listener_options' => array( zend
    'config_static_paths' => array(),
    'module_paths'        => array(
        'Baz' => __DIR__ . '/Baz/',
        'ModuleWithEvents' => __DIR__ . '/ModuleWithEvents/',
    ),
),

Также существует способ, который называют train case. Составные слова при этом способе написания образуются путем замены пробела дефисом и выглядят следующим образом main-element-position. Практически брат-близнец змеиного стиля, но программистами используется крайне редко.

Camel Case

Самый распространенный способ носит название camelСase или верблюжий стиль или горбатый стиль. Это принципиально иной подход. В этом случае пробелы вовсе не заменяются другими символами-разделителями. Все пишется слитно, но каждое слово, кроме первого, начинается с большой буквы, а первое слово - с маленькой. Этот вариант еще называют lowerCamelCase. Также существует вариант под названием UpperCamelCase. Или часто его называют StudlyCaps. Отличается он от традиционного camelСase только первой буквой в верхнем регистре. Поскольку регистр символов здесь определяет границы слов, то варианты написания с различными регистрами в этом подходе, как правило, не применяются. Редкими исключениями являются аббревиатуры. Основное преимущество этого стиля от змеиного в его компактности. Вероятно, за это он и нравится программистам. Стиль UpperCamelCase чаще всего применяется для названий классов, а lowerCamelCase - для названий методов, функций, переменных, свойств.

Примеры:

// Название свойства класса в Symfony 2
protected static $trustedHostPatterns = array();

// Название метода класса в Symfony 2
public static function createFromGlobals()

// Название класса в Symfony 2
class AnalyzeServiceReferencesPass implements RepeatablePassInterface

// Названия переменных в Symfony 2
if (stream_is_local($originFile) && $bytesCopied !== filesize($originFile)) {

// Название класса в Zend Framework 2
class EventManager implements EventManagerInterface

// Название метода класса в Zend Framework 2
public function unsetSharedManager()

// Название свойства класса в Zend Framework 2
protected $shouldCreateTemplate = false;

// Название переменной Zend Framework 2
$elementOrFieldset = $factory->create($elementOrFieldset);

Вместо заключения привожу небольшой рисунок, чтобы все вышеописанное упорядочилось и легло на свои полочки.