За по-малко крещене в кода

преди 3 години От David Grudl  

Стилът на кодиране в Nette претърпява малка промяна: за константите на класовете вече се използва нотацията PascalCase вместо първоначалната SCREAMING_SNAKE_CASE.

Традицията да се използват главни букви за константите идва от езика C, където така се обозначават т.нар. макроконстанти на препроцесора. Беше полезно да не се пропуска разликата между кода на парсера и кода на препроцесора. PHP не се нуждае от това разграничение, тъй като не разполага с препроцесор. От друга страна, прекаленото подчертаване на константите е контрапродуктивно. Защо една константа трябва да крещи и да привлича вниманието към себе си, да бъде виден елемент в потока на програмата? Няма причина за това.

Пример за реален код с константи SCREAMING_SNAKE_CASE, които агресивно се открояват в кода и освен това се четат по-трудно:

foreach (self::SYMBOL_TO_NAME as $symbol => $name) {
	$idx = self::ACTION_BASE[$state] + $symbol;
	if (($idx >= 0 && $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol
			|| $state < self::YY_2_TBLSTATE
			&& ($idx = self::ACTION_BASE[$state + self::NUM_NON_LEAF_STATES] + $symbol) >= 0
			&& $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol)
		&& self::ACTION[$idx] !== self::UNEXPECTED_TOKEN_RULE
		&& self::ACTION[$idx] !== self::DEFAULT_ACTION
		&& $symbol === 0
	) {
		return true;
	}
}

Пример за същия код с константи PascalCase, който изглежда много по-компактен:

foreach (self::SymbolToName as $symbol => $name) {
	$idx = self::ActionBase[$state] + $symbol;
	if (($idx >= 0 && $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol
			|| $state < self::Yy2Tblstate
			&& ($idx = self::ActionBase[$state + self::NumNonLeafStates] + $symbol) >= 0
			&& $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol)
		&& self::Action[$idx] !== self::UnexpectedTokenRule
		&& self::Action[$idx] !== self::DefaultAction
		&& $symbol === 0
	) {
		return true;
	}
}

Съвместимост

Nette, разбира се, внимава за обратната съвместимост. Всички публични константи също остават в оригиналната си форма и служат като псевдоними на предпочитаните константи на PascalCase. Те ще продължат да съществуват и в следващото голямо издание и ще имат флаг @deprecated.

Всички новодобавени константи на класовете вече са само във варианта PascalCase. Глобалните константи не се използват от Nette.

Изброявания

PHP 8.1 идва с изброявания, които ще се използват и в Nette. Енументите ще заменят предишното решение с използване на константи. Все още няма стандарт за кодиране за това как да се пишат изброявания, организацията PHP-FIG отдавна се провали в това отношение и излиза с препоръки с многогодишно закъснение. Самата документация на PHP представлява ръководство. За “случаите на изброяване” тя използва изключително нотация PascalCase, като това се отнася и за по-ранната експериментална реализация SplEnum.

Комбинирането на PascalCase изброявания с константи SCREAMING_SNAKE_CASE би изглеждало непоследователно, така че това също е причина за промяна на стила на записване на константите.

Техническа бележка: изброяванията са синтактична захар за константи, от гледна точка на PHP няма разлика между “enum case” и константа от клас.

Как да променим собствения си код?

Всяка козметична промяна винаги ще предизвика голямо недоволство. Но ако опитате да използвате константите PascalCase в продължение на един месец, ще бъдете възхитени от тях и няма да има връщане назад. И ще искате да въведете новата нотация и в собствения си код. Как да го направите? Идеалният начин е да преименувате константите в PhpStorm с помощта на функцията Refactor > Rename. Също така инсталирайте приставката Манипулация на низове и й задайте пряк път в настройките за Switch Case > To Pascal Case.

След това всичко, което трябва да направите, е да поставите курсора върху константата, да натиснете Ctrl-F6 (преименуване) и след това шорткът за To Pascal Case и PhpStorm ще промени константата в целия проект.

Успешно кодиране!

Последни публикации