Шаблон для двух похожих функций без копирования кода

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

Например :

public static function getMajorRelative($tonality){
$result = array_search($tonality,self::$_minorTonalities);
return self::$_majorTonalities[$result];
}

А также

public static function getMinorRelative($tonality){
$result = array_search($tonality,self::$_majorTonalities);
return self::$_minorTonalities[$result];
}

У кого-нибудь была похожая проблема с концепцией?

Спасибо,

Philippe

-1

Решение

Вы всегда можете передать массив, от которого хотите получить результат:

public static function getRelative($tonality, $return_array) {
//If returning minor, search major; Else, search minor.
$array_to_search = ($return_array === self::$_minorTonalities ? self::$_majorTonalities : $_minorTonalities);
$result = array_search($tonality, $array_to_search);
return $return_array[$result];
}
1

Другие решения

2 похожие (не идентичные) строки кода на самом деле не являются дублированием, но вы могли бы сделать:

protected static function getRelative($tonality, $tonalities1, $tonalities2) {
$result = array_search($tonality, $tonalities1);
return $tonalities2[$result];
}

public static function getMajorRelative($tonality){
return self::getRelative($tonality, self::$_minorTonalities, self::$_majorTonalities);
}

public static function getMinorRelative($tonality){
return self::getRelative($tonality, self::$_majorTonalities, self::$_minorTonalities);
}

если это действительно имеет значение

Вам также может потребоваться некоторая обработка исключений, если значение $ tonality не существует в ваших массивах.

0

Я не уверен, что есть что улучшить. Но если вы хотите, вы можете написать это как одну функцию:

public static function getRelative($chord,$tonality)
{
$varName = '_'.($chord == 'major' ? 'major' : 'minor').'Tonalities';
$result = array_search($tonality,self::${$varName});
return self::${$varName}[$result];
}

Вы можете назвать это как:

getRelative('major',$tonality);
getRelative('minor',$tonality);
0