現在、オブジェクト指向を勉強中なのですが、
タイトルのような疑問にあたりました。
私の理解しているオブジェクト指向の考え方で、サンプルのプログラムを書いてみました。
(そもそもその理解がおかしいということでしたら、指摘いただけると幸いです)
fugaと表示したり、ランダムでhageと表示されるプログラムです。
php
1//表示してよいか判断する機能。 2interface IDecideToPrint { 3 public function canPrint(); 4} 5 6//表示する機能。 7interface IPrint { 8 public function doPrint(); 9} 10 11//指定されたパーセンテージの確率で表示される。 12class AtRateOfPercentage implements IDecideToPrint { 13 private $_percent; 14 function __construct($percent){ 15 $this->_percent = $percent; 16 } 17 public function canPrint(){ 18 return (rand(1, 100) <= $this->_percent); 19 } 20} 21 22//hageと表示する。 23class PrintHage implements IPrint { 24 public function doPrint(){ 25 print 'hoge'; 26 } 27} 28 29//指定された文字を表示する。 30class PrintParam implements IPrint { 31 private $_str; 32 function __construct($str){ 33 $this->_str = $str; 34 } 35 public function doPrint(){ 36 print $this->_str; 37 } 38} 39 40//判断つきで表示する機能。 41class PrintWithDecision implements IPrint { 42 43 private $_decide; 44 private $_print; 45 46 function __construct(IDecideToPrint $decide, IPrint $print){ 47 $this->_decide = $decide; 48 $this->_print = $print; 49 } 50 51 public function doPrint(){ 52 if($this->_decide->canPrint()){ 53 $this->_print->doPrint(); 54 } 55 } 56} 57 58//様々なIPrintの実装を生成する。 59class PrintFactory { 60 /** 61 * 常にfugaと表示する。 62 * @return IPrint 63 */ 64 public function createAlwaysFuga(){ 65 return new PrintParam('fuga'); 66 } 67 /** 68 * 50%の確率でhageと表示する。 69 * @return IPrint 70 */ 71 public function createRandomHage(){ 72 return new PrintWithDecision( 73 new AtRateOfPercentage(50) 74 ,new PrintHage() 75 ); 76 } 77} 78 79$printFactory = new PrintFactory(); 80$alwaysFuga = $printFactory->createAlwaysFuga(); 81$randomHage = $printFactory->createRandomHage(); 82 83$alwaysFuga->doPrint(); //fugaと表示 84$randomHage->doPrint(); //hageと表示されたりされなかったり(※)
こちらのソースにはバグが有り、hageではなくhogeと表示されています(※)。
そしてこのバグをデバッグするときに、私はおおむね以下の様な順でバグ探しに行きます。
1:doPrint()で問題(※)が起きていて、それはcreateRandomHage()で作られて、さらにそれはPrintFactoryで作られた、とさかのぼる。
2:そこでPrintFactoryのcreateRandomHage()を見に行く。
3:そこで生成されている、PrintWithDecisionを見に行く。
4:PrintWithDecisionを見て、doPrint()の中身はなんだ?と行き詰まる。
(この規模のソースでそれぐらいは覚えとけというツッコミや、単体テストはどうしたというツッコミもあるかと思いますが)
この行き詰まる原因がどうも、オブジェクト指向の本質(?)にあるように思われました。
オブジェクト指向では、基本的にclassはinterfaceに依存するように作られているため、
2→3のように実際のclassを見に行くと、そこはinterfaceでしか書かれおらず、
次に見るべきソース(doPrintの中身)が不明で、行き詰まっていました。
そこで、タイトルの疑問なのですが、
オブジェクト指向のソースコードは、本質的に処理を追いにくくなるものなのでしょうか。
もし、追いにくいものであるとしましたら、何かソースを追うコツとかあるのでしょうか。
よろしくお願いします。

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/11 03:52
2016/04/11 11:59 編集
2016/04/12 03:37