2010-05-05 5 views
5

Im пытается найти лучшие практики для написания PHP.PHP и писать чистый код

Мне просто интересно, это плохая привычка.

Например, обрабатывающие переменные.

$var = 1 
$var = doSomething($var); 
$var = doSomething2($var); 
$var = doSomething3($var); 

Это выглядит немного ужасно.

Вот пример реального кода, который я только что сделал:

$this->rSum = explode(",", $this->options["rSum"]); 
$this->rSum = array_combine(array_values($this->rSum), array_fill(0, count($this->rSum), 0)); 

Если кто-то может передать мне некоторые хорошие учебники написания чистого кода в целом было бы неплохо!

Его снова спрашивают глупые вопросы. :)


Кстати ..

Сколько автоматическая обработка может быть в модели?

У меня есть модель, которая имеет метод execute, и когда я ее называю, он выполняет много вещей, таких как чтение файла определения и создание запросов к базе данных.

Например

$object = new Object() 
$object->setFile("example.txt"); 
$object->execute(); 

// Then i can fetch things from it 
echo $object->getName(); 

ответ

3

Мне очень нравится ваш (реальный) код, и мне обычно очень нравится как код других людей (у меня не было много времени, чтобы копать в ZF, но PEAR например [у них также есть свои стандарты кодирования] - это просто ужасный IMO), первый пример, который вы дали, просто кажется глупым, но относительно второго, это действительно легко понять, по крайней мере, для меня и из короткого фрагмента, который вы предоставили, у вас, кажется, есть последовательный стиль кодирования и используйте пробелы в правильном количество и в нужном месте - это много для чистого кода (если вы не верите мне, просто взгляните на некоторые фрагменты Perl).

Я хотел бы только отметить три вещи:

  1. Семантика: Хотя rSum не ужасны имя для свойства это не совсем ясно, какие значения она выполняется, может быть, вы могли бы найти более описательное имя для этого свойства?
  2. Variable Повторное использование: Как я уже сказал, прежде чем ваш первый пример кажется глупым, но это на самом деле умна, чтобы повторно использовать переменные по двум основным причинам:
    1. Вы не тратите память.
    2. И вы не загрязняете область действия, с которой работаете.
  3. Ваш второй "реальный" пример может быть чище и быстрее, если вы используете правильные функции:

    $ this-> rSum = array_flip (взрываются (», " $ this-> опции [" rSum "]));

EDIT: Я просто заметил, что код я предоставил выше, не совсем то, что вы делаете (0 не был обработан мой мозг), вот еще один рабочий вариант:

$this->rSum = array_fill_keys(explode(",", $this->options["rSum"]), 0); 

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

8

Смарт-код не обязательно хороший код, на мой взгляд. Я лично предпочитаю чистый, простой и понятный код. Ваш 2 лайнер заставит вашего коллегу задуматься, в отличие от вашего «плохого» кода.

Это только мое взятие все равно

+1

peer, not груша: P – Viet

3

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

0

Согласен с Джимом Ли, я также предпочитаю читаемый код по микро-оптимизации или умный, но уродливый однострочный код.

Единственная проблема, с которой я столкнулся с вашим первым примером, это то, что она использует процедурно-ориентированные функции, я бы лучше переписал OOP (вызовы функций, подобные этому, можно было бы сковать и оставаться легко читаемыми).

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

-3

1 вещь, которая пытается сделать eveything в одном строка может привести к предположениям кода. Который я оцениваю как действительно раздражающий, когда я должен продолжать их исправлять. Это чаще встречается при цепочке объектов. Например,

$object->getAnotherObject()->getAThirdObject()->doSomething(); 

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

$secondObject = $object->getAnotherObject(); 
if (is_object($secondObject)) { 
    $thirdObject = $secondObject->getAThirdObject(); 
    if (is_object($thirdObject)) { 
     $thirdObject->doSomething(); 
    } 
} 

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

Хотя стоит повторить то, что написал Борис Гери. быть последовательным.

+0

«Чистое! Легче читать ?!» Свободный интерфейс rock, например, класс SQL Builder: '$ sql-> select ('posts', 'title') -> где (array ('user_id' => 5)) -> order ('date', 'desc ') -> limit (10); ', при вашем подходе это потребует 5 бесполезных уровней отступов, потому что в беглых интерфейсах все методы должны возвращать объект независимо от того, что. –

+0

Когда вы знаете, что возвращается, все в порядке. Как насчет того, когда вы входите в проект и должны начинать понимать, когда вы код? Вы не можете основываться на сценариях наилучшего случая. Что делать, если кто-то обновляет часть проекта, над которым вы работаете, и что-то возвращает массив объектов? – Khainestar

+0

как насчет закона деметры? –