Я играю с рефакторингом класса 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()
метод, как это не так Чувствовать исправьте это, просто запустив несколько методов в последовательности.
Вы должны спросить себя: насколько сложно будет переопределить один «маленький метод» без изменения поведения другого «маленького метода»?
Если вы можете переопределить один «маленький метод», не касаясь других, вы, вероятно, делаете все правильно.
Скажем, у вас есть это:
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();
}
Таким образом, вы можете переопределить отдельные части процедуры, не касаясь других. Вот почему вы «разбиваете большой метод на меньшие».
Итак, проверьте, удовлетворены ли вы этим. Это самое главное!
Я хотел бы это:
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;
}