_so4 2012-08-21 13:38:49

[PHP] DB接続の無駄遣い このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

Webサイトへのアクセス数の割にDB接続数が異常に多かったのでソース調べてみたらこんな感じでした。

//DBクラス
class DB {
  function __construct(){
    //DBコネクション処理
  }

  function query(){
    //DBクエリ実行、実行結果を返す
  }
}

class hoge {
  function selectFuga(){
    $obj = new DB();
    //色々処理...
    return $obj->query($q);
  }
  function updateFuga(){
    $obj = new DB();
    //色々処理...
    return $obj->query($q);
  }
  function insertFuga(){
    $obj = new DB();
    //色々処理...
    return $obj->query($q);
  }
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(14)

#1 m_shige1979 2012-08-21 15:35:12  

クラスの使い方がまだ、うまく理解できていない感じ

#2 nbuy 2012-08-30 03:28:31  

クラス云々より、有限少数で高コストの資源 (DB コネクション) を処理毎に確保しては使い捨ててる、ってのが問題点だよね。 テストケースぐらいなら問題ないけど、扱う規模が大きくなるといろいろ問題 (遅い/性能が出ないとか、セッション数が制限されるとか) が出てくる。

ある命令 (関数やメソッド) によって生じるコスト感がなく字面だけで理解していると、こういうコードを書きがち。 背景を理解して書かないと品質のよいコードは書けないよ、と言うパターンかな。

まあ、背景が変化 (例えばDBコネクションを軽量低コストと仮定) すると、同じコードでも糞コードとはならないわけだが。

#3 531305 2013-03-06 20:46:40  

抽象化のジレンマだね。

#4 InternalServerE 2013-03-06 21:42:01  

抽象化云々というより、nbuyさんの言うとおり、「分かっているかどうか」だと思うけど。

#6 531305 2013-03-08 21:10:09  

ジレンマってのは、カプセル化して隠蔽されてるのに、その中身を「分かっているかどうか」を問うことだよ。

#7 InternalServerE 2013-03-08 21:51:08  

ええとね、抽象化と隠蔽って概念的に違うものだから。
言いたかったのはそっちでござる。

#8 531305 2013-03-09 22:50:56  

実装の詳細(どのようなデータベースにどのように接続しているか、または、そこから推計されるコストも)を隠すという意味で抽象化とかカプセル化と言た。この場合はカプセル化が正しいの? class DBをclass RFC1149_DBにしてもカプセル化を破壊しないでコストを表示できると思ったから抽象化と言ってしまった。

#9 InternalServerE 2013-03-10 08:41:47  

ごめんなさい。全然文章を読み解けなかったなり。答える気があれば以下をご教示ぷりーず。

  • 「コスト」は開発の方法論に依らず、本質的に隠せないもの(※)だと思われるが、そうではないのか。
    (※発生を抑えたり、影響を軽減したり、ごまかす工夫はもちろん可能だけれど、それは抽象化・隠蔽とは少し違う視点の話題に見える)
  • 仮にできたとして、「コストを隠す」ことが、抽象化やら隠蔽やらと何がどう関係するのか。
  • 「class DBをclass RFC1149_DBにしてもカプセル化を破壊しないでコストを表示できる」の意味がまったく理解できず。コストを表示するって何をどうすること?

自分は、抽象化・隠蔽を「オブジェクト指向でよく使われる単なる一般用語」のつもりで使ってるんだけど、そもそも53135さんと自分の間で、言葉の前提にずれがあるのかな。
それとも、自分の理解力というか、解釈の幅が狭いのかなぁ。。

#10 531305 2013-03-10 22:49:24  

OOPは建前では、class hoge側はclass DBの具体的な実装に依存しないで公開されたインターフェイスだけを使うんだよみたいなことを主張します。でも、実行時には本音が出て、同じclass hogeの実装に対して、class DB の実装に応じて異なる感想を言ったりします。例えばclass DBは、先週はとりあえずmysql_pconnectだったけど、今日はpg_connectかもしれないし、来週にはそのproxyかもしれないです。インターフェイスはそのままで。

#11 InternalServerE 2013-03-11 13:59:00  

インターフェースやら多態性やらの一般論を聞きたかったわけじゃないんだけどなぁ。。
まあ、いいです。

#12 531305 2013-03-11 20:01:06  

ジレンマは2つの対立する結論から生じる。建前と本音。一般論と目の前のウンコ。もしかして、nbuyの「背景を理解して書かないと」に賛成で、「背景が変化…する」には不賛成なの?

#14 InternalServerE 2013-03-11 21:23:11  

そりゃそうでしょ。貴方の指摘、このウンコードの趣旨から脱線してるし。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[その他] HOW TO ABC..

このエントリーをはてなブックマークに追加

実際にあった某システムの超重要なマスター...

create table item_master (
 A varchar(2...

鑑賞する »

[その他] そのプレフィックスいる? & 予備・・・...

このエントリーをはてなブックマークに追加

ネーミングが日本語のローマ字っていうのも...

create table syain (
syain_bango int no...

鑑賞する »

[C] switch-caseは現場の臭いがする

このエントリーをはてなブックマークに追加

"とりあえず"で書いた 2010 年 4...

// switch-case にしたいが、関数で値を取得しないといけないため、
...

鑑賞する »