※phpを例に挙げますが、言語に依存しない「思想」に関わる質問のため、多くの方に意見を頂けますと幸いです。
DBへクエリを発行する以下のコードを設計しました。
php
1class Database 2{ 3 public function execQuery($query) 4 { 5 mysql_query($query); 6 } 7} 8 9$db = new Database(); 10$db->execQuery('delete from DaijiNaTable'); // 危険なコードが実行可能!
コメントにあるように、この設計だとグローバルから好き勝手なクエリを実行できてしまうため、以下のように修正しました。
php
1class Database extends DatabaseQuery 2{ 3 public function execQuery() 4 { 5 mysql_query($this->getQuery()); 6 } 7} 8class DatabaseQuery 9{ 10 private $query; 11 public function select($table) 12 { 13 $this->query = "select * from `${table}`"; 14 } 15 public function getQuery() 16 { 17 return $this->query; 18 } 19} 20 21$db = new Database(); 22$db->select('DaijiNaTable'); 23$db->execQuery(); 24 25$dbq = new DatabaseQuery(); // 無意味だが実行可能。
実行可能なクエリに制限を与えられるため安全ですが、2つ気になることがあります。
1. DatabaseQueryをグローバルからインスタンス化することが出来ますが、無意味です。インスタンス化が出来ないよう、何らかの修正を加えるべきでしょうか?
2. DatabaseQueryは継承される前提で構想されており、単体では用を成しません。このような設計は正しいのでしょうか?
実務では簡単なプログラムしか組んでおらず、設計思想について理解したいため、ご指導頂けますと幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。