Рефакторинг класса PHP

Я играю с рефакторингом класса PHP. В моем исходном классе был конструктор и один большой метод, который запускал строку с помощью различных операций и выводил результат в конце.

class String
{
public function __contstruct()
{
// a couple of initialisation things
}

public function make($string)
{
// very large method that does lots of different types of filtering to an input string
}
}

Мой класс проходит через scrutinizer-ci, и одна из вещей, которые он предлагал, состояла в том, чтобы реорганизовать большой метод в меньшие автономные методы, используя шаблон метода Composer.

https://scrutinizer-ci.com/docs/refactorings/compose-method

Я сделал это, и это кажется аккуратнее, но вот моя проблема / запрос …

Мой новый класс теперь выглядит примерно так

class String
{
public function __construct()
{
// a couple of initialisation things
}

public function make($string)
{
$string = $this->smallMethodOne($string);
$string = $this->smallMethodTwo($string);
$string = $this->smallMethodThree($string);
$string = $this->smallMethodFour($string);
$string = $this->smallMethodFive($string);
}

private function smallMethodOne($string) {
// do some stuff
return $string;
}

private function smallMethodTwo($string) {
// do some stuff
return $string;
}

private function smallMethodTwo($string) {
// do some stuff
return $string;
}

private function smallMethodThree($string) {
// do some stuff
return $string;
}

private function smallMethodFour($string) {
// do some stuff
return $string;
}

private function smallMethodFive($string) {
// do some stuff
return $string;
}
}

Мне просто интересно, есть ли лучший способ организации make() метод, как это не так Чувствовать исправьте это, просто запустив несколько методов в последовательности.

3

Решение

Вы должны спросить себя: насколько сложно будет переопределить один «маленький метод» без изменения поведения другого «маленького метода»?

Если вы можете переопределить один «маленький метод», не касаясь других, вы, вероятно, делаете все правильно.

Скажем, у вас есть это:

public function deleteMe()
{
if($this->a == x || $this->b != y){
$this->cache->delete($this);
$this->storage->delete($this);
$this->refs->unlink($this);
}
}

А что если вы хотите расширить класс и изменить deleteMe() условие if ()?
Вам нужно будет полностью переписать метод для изменения одной строки. Это совсем не удобно.
Вместо:

protected function checkDeletability()
{
return $this->a == x || $this->b != y;
}

protected function internalDelete()
{
$this->cache->delete($this);
$this->storage->delete($this);
$this->refs->unlink($this);
}

public function deleteMe()
{
if($this->checkDeletability())
$this->internalDelete();
}

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

Итак, проверьте, удовлетворены ли вы этим. Это самое главное!

16

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

Я хотел бы это:

public function __construct($string)
{
$this->string = $string;
// a couple of initialisation things
}
public function make()
{
if(!$this->smallMethodOne()){
return false;//or custom exception or array with status/description
}
...
if(!$this->smallMethodFive()){
return false;//or custom exception or array with status/description
}

return $this->string;

}
private function smallMethodOne() {
// do some stuff
$this->string = $new_string;
}
0

По вопросам рекламы [email protected]