Один «многофункциональный» метод или несколько?

Есть два варианта написания методов:
Функционал в нескольких методах

public function setGlobal($name, $value)
    {
        $this->globals[$name] = $value;
    }
    public function hasGlobal($name)
    {
        return array_key_exists($this->globals, $name);
    }
    public function getGlobal($name)
    {
        if ($this->hasGlobal($name)) {
            return $this->globals[$name];
        }
        return false;
    }
    public function setGlobals(array $array)
    {
        $this->globals = array_merge($this->globals, $array);
    }
    public function getGlobals()
    {
        return $this->globals;
    }


и функционал в одном методе
public function globals($name = null, $value = null)
 {
        // Слияние массивов с заменой
        if (is_array($name)) {
            return $this->globals = array_merge($this->globals, $name);
        }
        // Передача всего содержимого
        if ($name === null && $value === null) {
            return $this->globals;
        }
        // Проверка на наличие и передача переменной из массива
        if ($name !== null && $value === null) {
            if (array_key_exists($name, $this->globals)) {
                return $this->globals[$name];
            }
            return false;
        }
        // Запись переменной
        if ($name !== null && $value !== null) {
           return $this->globals[$name] = $value;
        }
    }

Какой бы вы предпочли вариант и почему?
  • Вопрос задан
  • 2243 просмотра
Решения вопроса 1
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Первый, потому как ясно написано, какой метод что делает, а не переданный параметр определяет, что методу стоит делать.
При разборе этого кода придется очень внимательно изучить метод (или документацию к нему), и только потом работать.
А геттер и сеттер - это очевидные всем программистам методы со знакомым поведением.

Кроме того, интерпретатор вместо непосредственной работы будет вынужден решать на основе параметров, а что же ему сейчас делать?

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

Второе решение - бедокод. Никогда не делайте так.
Пишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, — склонные к насилию психопаты, знающие, где вы живёте.
Мартин Голдинг
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
В вашем случае - первый, ибо это гораздо правильнее с точки зрения чистоты кода и принципов построения приложений. Такой вариант легче поддерживать, систему с такой структурой легче расширять, а стороннему разработчику легче будет найти нужное место в коде и понять, к чему оно относится. Однако действительно, порой бывает нужно создать многфункциональный метод, т.е. зависит от ситуации.
Ответ написан
@Sadd
Я бы предпочел один, так как желательно, чтобы методов было поменьше. Однако, не стоит делать метод "излишне функциональным", зачастую это приводит код в состояние помойки.
Но, как бы там ни было, эти 2 способа почти равнозначны
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы