0

単純なCompositionパターンサンプルを作成しようとしています。基本的に、出力は各部門の従業員の完全なインテリジェントになります。3種類の従業員と2つの部門を作成しました。次のコードを参照してください。

従業員クラス

abstract class Employee {

    function addEmployee(Employee $employee){

    }

    function removeEmployee(){

    }

    abstract function showIntelligent();

}

ミニオンクラス

class Minion extends Employee {

       function showIntelligent(){
          return '100';
    } 


}

マネージャークラス

class Manager extends Employee {

    function showIntelligent(){
           return '150';
    } 



}

営業部クラス

class SalesDept extends Employee {

     private $_deptEmployee=array();
    function addEmployee(Employee $employee){

        $this->_deptEmployee[]=$employee;

    }

    function removeEmployee(){
        if(!empty($this->_deptEmployee)){
            array_pop($this->_deptEmployee);
        }else{
            echo 'no employees in Sales Department';
        }
    }

    function showIntelligent() {

        $totalInt=0;
        foreach ($this->_deptEmployee as $employee){

            $totalInt += $employee->showIntelligent();
        }
        echo 'Total Intelligent of the Sales Department Employees is: '.$totalInt;
    }

}

デザイン学科クラス

class DesignDept extends Employee {

     private $_deptEmployee=array();
    function addEmployee(Employee $employee){

        $this->_deptEmployee[]=$employee;

    }

    function removeEmployee(){
        if(!empty($this->_deptEmployee)){
            array_pop($this->_deptEmployee);
        }else{
            echo 'no employees in Design Department';
        }
    }

   function showIntelligent() {

        $totalInt=0;
        foreach ($this->_deptEmployee as $employee){

            $totalInt += $employee->showIntelligent();
        }
        echo 'Total Intelligent of the Design Department Employees is: '.$totalInt;
    }


}

私のインデックス

    $salesDpt=new SalesDept();
    $salesDpt->addEmployee(new Manager());
    $salesDpt->addEmployee(new Minion());
    $salesDpt->addEmployee(new Minion());
    $salesDpt->addEmployee(new GeneralManager());

    $salesDpt->showIntelligent();



    $DesignDpt=new DesignDept();
    $DesignDpt->addEmployee(new Manager());
    $DesignDpt->addEmployee(new Manager());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new Minion());
    $DesignDpt->addEmployee(new GeneralManager());

    $DesignDpt->showIntelligent();

新しい従業員を追加するには、多くのコードを使用する必要があるようです。これは良い習慣ですか?とにかくそれを改善するには?アドバイスをありがとう。

4

2 に答える 2

1

addEmployee()メソッドを変更して、整数カウント引数を取ることができます。

これにより、7行のコードを次のように減らすことができます。

$DesignDpt->addEmployee(new Minion(), 7);
于 2012-05-17T20:55:12.723 に答える
1

私はいくつかのコメントを持っています-そのうちのいくつかはすでに言及されています。

1)MinionとManagerのサブクラスを持つEmployeeクラスを持つことは良い考えではありません。ここでの問題は、ミニオンをマネージャーに昇格させることができ、古いオブジェクトを破棄して新しいオブジェクトに置き換える必要がないことです。代わりに、MinionRoleまたはManagerRoleを含む「role」インスタンス変数を持つEmployee用のクラスを1つ用意します。この設計では、Employeeオブジェクト全体を置き換えることなく役割を置き換えることができます。実際、これまでに説明したことから、ロールはまったく必要ありません。インテリジェンスのインスタンス変数だけです。

2)部門クラスはEmployeeから継承しないでください。部門は従業員ではなく、従業員の代わりとして使用することはできません。Departmentという新しいクラスを作成します。本当にサブクラスが必要ですか?各部門に名前(営業、設計など)があるDepartmentのインスタンスがあれば十分でしょうか?経理部門を追加する場合、アプリケーションを変更、再コンパイル、再パッケージ化、および再デプロイする必要が本当にありますか?

サブクラス化は、サブクラスの動作が異なる場合にのみ役立ちます。あなたの場合、サブクラスは同じ振る舞いをするか、単純なインスタンス変数がそれを機能させるのに十分近いです。継承についてあまり興奮しないでください。継承はすべての問題に対する答えではないため、慎重に使用する必要があります。Smalltalkプログラミング言語の作成者であり「オブジェクト指向」という用語を生み出したAlanKayは、継承の概念を決して好まなかったため、コード共有を改善するためにしぶしぶ受け入れました。

于 2012-05-18T01:44:56.070 に答える