2014-09-12 4 views
0

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

Per Например:

<?php 
function hi($name, $age, $description) { 
    echo $name . ' - ' . $age . ' - ' . $description; 
} 

hi('John', 21, 'I\'m a builder'); 
?> 

Если что-то подобное будет лучший подход?

<?php 
function hi($options) { 
    echo $options['name'] . ' - ' . $options['age'] . ' - ' . $options['description']; 
} 

hi(array(
    'name' => 'John', 
    'age' => 21, 
    'description' => 'I\'m a builder' 
));  
?> 

Что вы думаете об этом?

+0

Я выбираю подход к массиву, видя, что в обычном использовании у вас могут быть уже такие массивы, как POST или строка из БД. – AbraCadaver

ответ

1

Я согласен с вами, что слишком много аргументов - это запах кода. Только не так, как вы.

Это запах кода, потому что это может означать, что функция/метод делает слишком много.

Однако если вы сделаете последнее, вы ничего не исправите. По крайней мере, не то, что вы пытаетесь исправить:

и люди должны пройти через функции, чтобы понять, что они делают и получают.

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

Когда я смотрю на подпись:

function hi($name, $age, $description) 

ясно, функция ожидает имя, возраст и описание. Однако, если посмотреть на подпись:

function hi($options) 

Я не знаю, в чем он нуждается. $options может быть примерно чем угодно.

Другим недостатком вашего второго подхода является то, что вам никогда не приходилось добавлять type hints в аргументы.

Не поймите меня неправильно. Бывают ситуации, когда прекрасно передать весь массив функции, но я просто не чувствую, что это один из них.

Что меня больше беспокоит в вашем коде, не факт, что есть три аргументов, а скорее, что данные функции echo s непосредственно вместо return данных. Это делает его очень негибким.

+0

Эта функция была всего лишь примером. В объявлении функции вы видите, какие переменные вам нужны и что представляет собой каждый аргумент. Однако, передавая им ценности, вы не представляете, что вы проходите. Однако во втором варианте вы явно говорите, что хотите передать в ключе массива. –

+0

Нет, вы ничего явно не говорите. У вас просто есть функция, которая говорит: мне нужен массив. Вот и все. При вызове функции вы используете значения, чтобы узнать, что им нужно. Если вы посмотрите на свою функцию на следующей неделе, вы не знаете, что должны содержать '$ options'. – PeeHaa

0

На самом деле, PHP 5.6 просто добавил новые способы передачи аргументов в функции!

http://php.net/manual/en/migration56.new-features.php#migration56.new-features.variadics

Вы можете использовать «...» оператор передать массив аргументов.

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

Надеюсь, что это поможет!

+0

Как это помогает конкретному варианту использования OPs (любой из подходов)? – PeeHaa

+0

Возможно, потому что, если вам нужно передать только один аргумент, вы можете передать его без использования массива? На самом деле вы можете сделать это для любого количества аргументов. Вам больше не нужно явно объявлять массив или объект. Это действительно просто еще один вариант. – Axschech

Смежные вопросы