0

多くのコードを共有する関数がいくつかあります。ただし、一部のコードはメソッドごとに異なり、カプセル化できません。これは例です:

public function function1(){
    same code
    same code1
    this differs
    same code2
    this differs
    same code 3
}

public function function2(){
    same code
    same code1
    this differs
    this differs
    same code 3
}

したがって、私の考えは、各関数で呼び出す他の関数と同じコードを抽出することでした。これを解決するより良い方法はありますか?

ありがとう!

4

4 に答える 4

1

最初のステップ: 重複するコードを独自の関数に移動します。

public function function1(){
    $this->sameCodeCode1();
    this differs
    same code2
    this differs
    $this->sameCode3();
}

public function function2(){
    $this->sameCodeCode1();
    this differs
    this differs
    $this->sameCode3();
}

次に、同じ code2 と呼んだものも同様に違いがあることがわかるので、それをもう一度繰り返します。

public function function1() {
    $this->inverse(function() {
        this differs
        same code2
        this differs
    });
}

public function function2(){
    $this->inverse(function() {        
        this differs
        this differs
    }
}

private function inverse($function)
{
    same code
    same code1
    $function();
    same code 3
}

これにより、基本クラスを共有する関数の代わりにメソッド オブジェクトを作成するなど、コードで実行できるさらなる改善につながる可能性があります。次のリファクタリング パターンも参照してください:メソッドをメソッド オブジェクトに置き換えます。

于 2012-05-02T09:49:48.677 に答える
0

これは戦略パターンの候補のようです。

public function coreProcess(uniquePart $unique){
    same code
    same code1
    $unique->part1();
    $unique->part2();
    $unique->part3();
    same code 3
}

interface uniquePart
{
  function part1();

  function part2();

  function part3();
}

class process1 implements uniquePart
{
  function part1()
  {
     //some unique code
  }

  function part2()
  {
     //do nothing
  }

  function part3()
  {
    //unique code
  }
}  

class process2 implements uniquePart
{
  function part1()
  {
    //some unique code
  }

  function part2()
  {
     //some unique code
  }

  function part3()
  {
    //some unique code
  }
}

//run process 1
coreProcess(new process1);

//run process 2
coreProcess(new process2);

http://www.ibm.com/developerworks/library/os-php-designptrns/

于 2012-05-02T10:50:41.630 に答える
0

プロセスは緩めたほうがいい

$task1 = new Task ( array (
        "code",
        "code1",
        "differs",
        "code2",
        "code3",
        function () {
            echo "Sample Function";
        } 
) );

$task2 = new Task ( array (
        "code",
        "code1",
        "differs",
        "differs",
        "code3",
        array (
                "Code2,Code4" 
        ) 
) );

echo "<pre />";
$process = new Process ( $task1 );
$process->run ();

echo PHP_EOL;
echo PHP_EOL;

$process = new Process ( $task2 );
$process->run ();

クラス

class Task {
    private $process = array ();
    function __construct($process) {
        $this->process = $process;
    }

    function add($name) {
        $this->process [] = $name;
    }

    function getProcess($i = null) {
        return ($i == null) ? $this->process : $this->process [$i];
    }

    function getTotal() {
        return count ( $this->process );
    }

}

class Process {
    private $task;
    function __construct(Task $task) {
        $this->task = $task;
    }

    function run() {

        for($i = 0; $i < $this->task->getTotal (); $i ++) {
            $run = $this->task->getProcess ( $i );
            if (is_callable ( $run )) {
                $run ();
            } else if (is_string ( $run )) {
                echo "Running " . $run, PHP_EOL;
            }
        }
    }
}

出力

Running code1
Running differs
Running code2
Running code3
Sample Function

Running code1
Running differs
Running differs
Running code3
于 2012-05-02T10:11:55.313 に答える
0

関数は、特定のタスクを実行するコードのセットです。同じコードを使用する場合は、それをいくつかの一般的な関数に入れて、関連するポイントで呼び出すことができます。そうでない場合は、個別の共通ファイルにある include ステートメントを使用できます。

于 2012-05-02T09:50:18.940 に答える