//...省略...
case '%':
$result= $num1%$num2;
break;
//...省略....
}
}catch (Exception $e){
echo "入力が間違っています:".$e->getMessage();
}
?>
コード分析: 上記の方法を使用して電卓に新しい関数演算を追加すると、次のような欠点があります
① 元のコード ブロックを変更する必要がある 変更するときに、誤って元のコードを変更する可能性があります。 「新しい関数を追加する」ためのオリジナルコード コードを修正しました
② 「べき乗」「平方根」「対数」「三角関数」「統計」など、追加する関数が多い場合、または、And、Or、Not、Xor などのプログラマー専用の計算関数を追加するため、switch ステートメントに N 個の分岐ステートメントを追加する必要があります。計算関数に 20 または 30 の case 分岐ステートメントがある場合、コードが 1 画面を超えることを想像してください。コードの可読性が大幅に低下するだけでなく、小さな関数を追加するには、関連しない他の関数も追加する必要があります。説明: これはプログラムの実行効率を大幅に低下させます
解決策: OOP 継承とポリモーフィズムのアイデアを採用します
単純なファクトリ パターンの初期実装
}
/**
*追加クラス
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2
}
}
/**
*引き算のクラス
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 掛け算のクラス
*/
class OperationMul extends Operation {
public function getValue($ num1,$num2){
return $num1*$num2;
}
}
/**
*部門クラス
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==0 ){
throw new Exception("除数を 0 にすることはできません");
}else {
return $num1/$num2;
}
}catch (Exception $e){
echo "エラーメッセージ:".$e-> ;getMessage();
}
}
}
?>
ここではオブジェクト指向の継承機能が採用されています。まず、仮想基底クラスを宣言し、サブクラスが実行するメソッドを指定します。基本クラス (getValue()) に実装する必要があります
分析: オブジェクト指向の継承機能を使用することで、「べき乗」、「平方根」、「対数」、「三角関数」などの元のプログラムを簡単に拡張できます。 、「統計」など、お待ちください。
コードをコピーします
コードは次のとおりです:
/**
* 余り(余り)を求める
*
*/
class OperationRem extends Operation {
public function getValue($num1,$num2){
return $num1%$num12
}
}
?>
別のクラスを作成し (このクラスは仮想基本クラスを継承します)、クラス内の対応する関数 (累乗の計算など) を完了し、結合度を大幅に減らすだけで、将来のメンテナンスと拡張が容易になります。
未解決の問題がまだあります。それは、ユーザーが入力したオペレーターに従ってプログラムに対応するオブジェクトをインスタンス化させる方法です。
解決策: インスタンス化プロセスを実装するには別のクラスを使用します。このクラスは次のとおりです:
コードをコピーします コードは次のとおりです:
/ **
* エンジニアリングクラス、主にオブジェクトの作成に使用されます
* 機能: 入力された操作シンボルに従って、ファクトリは適切なオブジェクトをインスタンス化できます
*
* /
class Factory{
public static function createObj($operate){
switch ($operate){
case '+':
return new OperationAdd()
break;
新しいOperationSub();
break;
return new OperationSub()
break;
new OperationDiv()
}
$ test=Factory::createObj ('/');
$result=$test->getValue(23,0);
元の記事、転載元を明記してください: http://www.cnblogs.com/hongfei/
http://www.bkjia.com/PHPjc/325885.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/325885.html
技術記事
単純なファクトリパターン: ①抽象基底クラス:クラス内にいくつかの抽象メソッドを定義してサブクラスに実装 ②抽象基底クラスから継承したサブクラス:基底クラスに抽象メソッドを実装 ③ファクトリクラス:使用...