Стандарты кодирования PHP на работе: безумие или я? - PullRequest
23 голосов
/ 18 сентября 2010

Я предпочитаю, чтобы стандарты кодирования были логичными. Это мой аргумент, почему следующий набор стандартов не так.

Мне нужно знать одну из двух вещей: (1) почему я не прав или (2) как убедить мою команду изменить их .


camelCase: функции, имена классов, методы и переменные должны быть camelCase.

  • затрудняет различие между переменными и классами
  • Идет против строчных / подчеркнутых переменных / функций PHP и классов UpperCamelCase

Пример:

$customerServiceBillingInstance = new customerServiceBillingInstance(); // theirs
$customer_service_billing_instance = new CustomerServiceBillingInstance();


Функции / методы должны всегда возвращать значение (и возвращаемые значения всегда должны храниться).

Это появляется на сотнях наших php-страниц:

$equipmentList = new equipmentList();
$success = $equipmentList->loadFromDatabase(true, '');
$success = $equipmentList->setCustomerList();
$success = $equipmentList->setServerList();
$success = $equipmentList->setObjectList();
$success = $equipmentList->setOwnerList();
$success = $equipmentList->setAccessList();

Возвращаемое значение используется редко, но всегда сохраняется. Он поощряет использование копирования и вставки.


Нет статических методов

Строки, подобные приведенным ниже, появляются в кодовой базе тысячи раз:

$equipmentList = new equipmentList();
$success = $equipmentList->loadFromDatabase();

Я бы предпочел:

$equipmentList = equipmentList::load();

Какая причина не использовать статические методы или свойства? Разве статические методы не отвечают за логику, не зависящую от экземпляра? Как инициализация или заполнение нового экземпляра?


Ваш код не является ООП, если все не возвращает объект

Есть фрагмент кода, который выполняет запрос, проверяет его несколькими способами на наличие ошибок, а затем обрабатывает полученный массив. Он повторяется (копируется + вставляется) несколько раз, поэтому я поместил его в базовый класс. Тогда мне сказали, что возвращение массива не является ООП.


Как вы защищаете эти практики? Мне действительно нужно знать. Я чувствую, что принимаю сумасшедшие таблетки.

Если вы не можете их защитить, Как вы убедите непреклонного автора, что их нужно изменить?

Ответы [ 7 ]

12 голосов
/ 18 сентября 2010

Я бы предложил попытаться перечислить цели ваших стандартов кодирования и взвесить их в зависимости от того, какие цели являются наиболее важными, а какие - менее важными.

PS: я не говорю на PHP, поэтому некоторые из этих аргументов могут содержать явно некорректный код PHP.

camelCase: функции, имена классов, методы и переменные должны быть camelCase.

Очевидная причина рабочего места: «согласованность» за счет «плотности информации в имени».

Аргумент:

1) Поскольку за ключевым словом «new» всегда должен следовать класс, вы можете легко обнаружить недопустимую реализацию, например ::

$value = new functionName();
$value = new local_variable();
$value = new GLOBAL_VARIABLE();

вызовет тревогу, потому что после 'new' должно следовать имя TitleCase.

$value = new MyClass(); // correct

Опираясь на Case, легко обнаружить эти ошибки.

3) Можно вызывать только функции, вы никогда не можете вызывать переменные. Полагаясь на Case Rule, мы можем легко обнаружить подозрительные вызовы функций, такие как:

$value = $inst->ClassName();
$value = $inst->instance_variable();
$value = $GLOBAL_VARIABLE(); 

3) Присвоение имени функции и глобальных переменных является огромной проблемой, поскольку они часто ведут к поведению, которому трудно следовать. Вот почему любое утверждение выглядит так:

$GLOBAL = $value;
$someFunction = $anotherFunction;

должно быть тщательно изучено. Используя Case Rule, легко обнаружить эти потенциальные проблемы.

Несмотря на то, что точное Case Case Rule может варьироваться, было бы неплохо иметь разные Case Case Rule для каждого типа имен.

Функции / методы должны всегда возвращать значение (и возвращаемые значения всегда должны храниться).

Очевидная причина рабочего места: очевидно, еще одно правило, рожденное из слепой последовательности. Преимущество состоит в том, что каждая строка кода, которая не является управлением потоком (например, зацикливание, условные выражения), является присваиванием.

Аргумент:

1) Обязательное назначение создает ненужные длинные строки, что ухудшает читабельность, поскольку увеличивает количество ненужной информации на экране.

2) Код немного медленнее, так как каждый вызов функции будет включать две ненужные операции: возврат значения и присвоение.

Лучшая конвенция:

Учитесь у парадигмы функционального программирования. Сделайте различие между «подпрограммой» и «функциями». Подпрограмма выполняет все своих работ с побочным эффектом и не возвращает значение, и поэтому ее возвращаемое значение никогда не должно храниться где-либо (подпрограмма не должна возвращать код ошибки; используйте исключение, если это действительно необходимо ). Функция не должна иметь побочного эффекта, поэтому ее возвращаемое значение должно использоваться немедленно (либо для дальнейших вычислений, либо где-то сохранено). Имея политику функции без побочных эффектов, вы теряете цикл процессора, вызывая функцию и игнорируя ее возвращаемое значение; и поэтому линия может быть удалена.

Итак, существует три типа правильных вызовов:

mySubroutine(arg);            // subroutine, no need to check return value
$v = myFunction(arg);         // return value is stored
if (myFunction(arg)) { ... }  // return value used immediately

вы никогда не должны иметь, например:

$v = mySubroutine(arg);  // subroutine should never have a return value!
myFunction(arg);         // there is no point calling side-effect free function and ignoring its return value

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

В частности, запрещается иметь «функционирующего» монстра, который имеет как побочный эффект, так и возвращаемое значение.

Нет статических методов

На рабочем месте Очевидная причина: вероятно, кто-то где-то читал, что статика является злом, и слепо следовал, не делая никакой критической оценки его преимуществ и недостатков

Лучшая конвенция:

Статические методы должны быть без сохранения состояния (без изменения глобального состояния). Статические методы должны быть функцией, а не подпрограммой, поскольку проще протестировать функцию без побочных эффектов, чем проверить побочные эффекты подпрограммы. Статический метод должен быть маленьким (максимум 4 строки), а должен быть автономным (т.е. не вызывать слишком много других статических методов слишком глубоко) Большинство статических методов должны жить в классе Utility; Заметные исключения к этому - Класс Фабрики. Исключения из этого соглашения допускаются, но их следует тщательно изучить заранее.

Ваш код не является ООП, если все не возвращает объект

На рабочем месте Очевидная причина: ошибочное понимание того, что такое ООП.

Аргумент:

Фундаментальные типы данных концептуально также являются объектами, даже если базовые типы данных языка не наследуются от их класса Object.

6 голосов
/ 18 сентября 2010

Если вы не можете их защитить, как вы убедите непреклонного автора, что их нужно изменить?

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

==

Как и другие, сказанные ранее, это довольно субъективно, но это моемнения / аргументы.

1.camelCase: Функции, имена классов, методы и переменные должны быть camelCase.

Я бы использовал стиль PHP, если я кодирую на PHP, и стиль Camelcase, если я пишу на Java.Но не имеет значения, какой стиль вы выберете, если будете оставаться последовательным.

2.Функции / методы должны всегда возвращать значение (а возвращаемые значения всегда должны храниться).

Это глупость, на мой взгляд.Почти во всех языках программирования у вас есть какой-то тип 'void'.Но с точки зрения тестирования в большинстве случаев полезно, если ваша функция не имеет побочных эффектов.Я не согласен с тем, что ваш производственный код всегда должен использовать возвращаемое значение, особенно если оно не используется.

3.Нет статических методов

Я бы посоветовал вам прочитать статические методы - смерть для тестируемости от misko

Во время создания экземпляра я связываю зависимости с помощью макетов/ Friendlies, которые заменяют реальные зависимости.При процедурном программировании нечего «связывать», так как нет объектов, код и данные разделены.

Хотя PHP - динамический язык, поэтому он не представляет большой проблемы.Тем не менее, последний PHP поддерживает типизацию, так что я все еще думаю, что в большинстве случаев статические методы плохие.

4.Ваш код не является ООП, если все не возвращает объект

Я считаю (не уверен на 100%), что действительно ООП-язык должен это делать (возвращать объект), но я не согласен с этим, какиз таких языков, как, например, Java (который я считаю, не совсем ООП).В большинстве случаев ваши методы должны просто возвращать примитивы, такие как String / Int / Array / etc.Когда вы копируете и вставляете много кода, это должно быть признаком того, что что-то не так с вашим дизайном.Вы должны выполнить его рефакторинг (но сначала подготовьте тесты (TDD), чтобы не нарушать код).

5 голосов
/ 18 сентября 2010

Многие из этих стандартов кодирования очень субъективны, но следует учитывать следующие важные моменты:

  1. Получить единый набор правил именования кода и стилей и следовать им.Если вы еще не определили правила, убедитесь, что вы выяснили правила.Затем поработайте над рефакторингом кода, чтобы следовать им.Это важный шаг для того, чтобы новым разработчикам было легче перейти на платформу и поддерживать единообразие кодирования среди разработчиков.

  2. Требуются время и усилия, чтобы изменить стандарты кодирования.компания ставит на место.Любое изменение в правилах означает, что на самом деле код должен быть снова пройден, чтобы обновить все, чтобы соответствовать новым стандартам.

Принимая во внимание вышесказанное и более внимательно следя застроки конкретных стандартов кодирования PHP.Первое, на что нужно обратить внимание, если ваша компания использует какой-либо фреймворк, посмотрите на стандарты кодирования для этой фреймворки, так как вы можете придерживаться их, чтобы оставаться согласованными во всем коде.Ниже перечислены ссылки на несколько популярных платформ PHP:

  1. Соглашения об именах Zend Framework и Стиль кода Zend Framework
  2. Стандарты Pear Pear

Мои личные предпочтения в отношении ваших конкретных стилей кодирования:

1.camelCase: функции, имена классов, методы и переменные должны иметь значение camelCase

Имена классов должны быть регистром Паскаля (верхний регистр верблюда).

Так что в вашемпример:

class CustomerServiceBillingInstance
{
// Your class code here
}

Переменные и функции Я обычно считаю, что это верблюжий случай.

Так что любой из них, в зависимости от ваших предпочтенийс точки зрения подчеркивания:

$customerServiceBillingInstance = whatever;
$customer_service_billing_instance = whatever;

2.Функции / методы должны всегда возвращать значение (а возвращаемые значения всегда должны храниться).

Этот код выглядит как дополнительный код и, как вы могли бы использовать дополнительные ресурсы.Если функция не должна ничего возвращать, ничего не возвращайте.Аналогично, если вам не важно, что возвращает функция, не храните ее.Нет смысла использовать дополнительную память для хранения чего-то, что вы никогда не увидите.

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

3.Ваш код не является ООП, если все не возвращает объект

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

return false;

Чем сделать:

return new Boolean(false); // This would use up unnecessary resources but not add very much to readability or maintainability in my opinion.

Защита стандарта кодирования

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

  1. Performance .Если вы можете доказать, что определенный стандарт кодирования отрицательно влияет на производительность, вы можете рассмотреть возможность переключения.

  2. Поддерживаемость / удобочитаемость .Ваш код должен быть легко читаемым / понятным.

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

2 голосов
/ 18 сентября 2010

Многие из них - дело вкуса.Вы можете спорить за или против camelCase весь день.

Однако сохранение возвращаемых значений, которые никогда не используются, является неправильным.Там нет никакого значения для кода.Код не выполняется.Вы также можете посыпать $foo = 47 * 3; вокруг кода.

Любой код, который не делает чего-то полезного, должен быть удален.

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

2 голосов
/ 18 сентября 2010

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

0 голосов
/ 03 февраля 2011

Насколько я знаю, некоторые из опубликованных вами соглашений также поддерживаются Zend PHP Framework. Вы не одиноки, я пользователь Codeigniter и моя работа по использованию Zend Framework довольно большая. Соглашения об именах такого рода абсолютно нелепы, и я, честно говоря, вижу только преимущество использования camelCase для имен переменных, а не имен функций, так как это делает вещи запутанными.

Читать это: http://framework.zend.com/manual/en/coding-standard.naming-conventions.html

Эти соглашения о кодировании кажутся вам знакомыми?

0 голосов
/ 18 сентября 2010

Один аспект этого, который я не вижу, чтобы кто-то еще комментировал, это «2. Функции / методы должны всегда возвращать значение (и возвращаемые значения должны всегда сохраняться)».

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

...