2011-07-29 6 views
0

は、それがグループ関連書類に助言され、そして次の例では、与えられます。関連する変数と操作のグループ化?完全なコード、10章で

void SummarizeData(...) { 
    ... 
    GetOldData(oldData, &numOldData); 
    GetNewData(newData, &numNewData); 
    totalOldData = Sum(oldData, numOldData); 
    totalNewData = Sum(newData, numNewData); 
    PrintOldDataSummary(oldData, totalOldData, numOldData); 
    PrintNewDataSummary(newData, totalNewData, numNewData); 
    SaveOldDataSummary(totalOldData, numOldData); 
    SaveNewDataSummary(totalNewData, numNewData); 
    ... 
} 

このようなグループ化や並列処理が悪いデザインであることが記載され、代わりに、より分離何かを与えます:

void SummarizeData(...) { 
    GetOldData(oldData, &numOldData); 
    totalOldData = Sum(oldData, numOldData); 
    PrintOldDataSummary(oldData, totalOldData, numOldData); 
    SaveOldDataSummary(totalOldData, numOldData); 
    ... 
    GetNewData(newData, &numNewData); 
    totalNewData = Sum(newData, numNewData); 
    PrintNewDataSummary(newData, totalNewData, numNewData); 
    SaveNewDataSummary(totalNewData, numNewData); 
    ... 
} 

私は第二のアプローチが読み、理解することが容易であり、少なくとも私自身の観点から、クリーンに見えるコードを提供することに同意します。だから、私の質問は、2番目のアプローチには何らかの欠点があるということですか?例えば、私は考えることができ一つの可能​​な問題は、データベースとそのように一時的な接続である:

void SummarizeData(...) { 
    ... 
    externalDataStore.open(); 
    externalDataStore.save(oldData, numOldData); 
    externalDataStore.save(newData, numNewData); 
    externalDataStore.close(); 
    ... 
} 

この最初のアプローチは両方とも1オープン/クローズサイクルで操作を保存完了します。ただし、2番目のアプローチでは...

操作ごとに接続を開いたり閉じたりする必要があります。これは無駄に思えますが、実際にどのようにパフォーマンスに影響を与えるかはわかりません。

不必要に長い質問には申し訳ありません...

答えて

1

私はまだ完全なコードでは、第10章をもらっていない(さらにいくつかの夜はそれを行うべき!)が、私はここでの主なポイントはことだと思いプログラムの機能に影響を与えることなく、論理的でわかりやすい方法でコード行をグループ化してください。つまり、できるだけクリーンアップして再配置しますが、実際に動作に影響を与えるとすぐに停止してください。

あなたの例では、「時期尚早な最適化はすべての悪の根源です」と心に留めておく必要がありますが、開こうとしている場合には接続を終了しないでくださいそれらの2つのアクションが文字通りお互いをキャンセルするので、もう一度やり直してください。一般的なルールとして、最初に必要な直前にのみ接続を開き、最後に接続した直後に接続を閉じる必要があります。

+0

ポインタありがとうございます。コード・コンプリートは多くの情報を持っていますが、何かと同じように、あなたはまだそれを額面で受け取ることができません。 – voithos

0

私は退屈だったので、私はPythonでSqlite(これは最善の方法ではないことがわかっています)を使って概念実証テストを試みました。

最初に、50,000回の反復のベーステストを行い、反復ごとに接続を開いたり閉じたりします。

#!/usr/bin/env python 

import sqlite3 

class Creature(object): 
    legs = 0 

    eyes = 'monocular' 

    kind = '' 

conn = sqlite3.connect(':memory:') 

c = conn.cursor() 
c.execute('''create table testtable 
     (date text, legs text, eyes text, kind text)''') 
conn.commit() 
c.close() 

for i in range(50000): 
    c = conn.cursor() 

    creature1 = Creature() 
    creature1.legs = 5 
    creature1.eyes = 'monocular' 
    creature1.kind = 'mungy' 
    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature1.legs), creature1.eyes, creature1.kind)) 

    creature2 = Creature() 
    creature2.legs = 3 
    creature2.eyes = 'binocular' 
    creature2.kind = 'thingy' 
    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature2.legs), creature2.eyes, creature2.kind)) 

    creature3 = Creature() 
    creature3.legs = 3 
    creature3.eyes = 'monocular' 
    creature3.kind = 'pungy'  
    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature3.legs), creature3.eyes, creature3.kind)) 

    conn.commit() 
    c.close() 

今や50,000回の反復が行われますが、接続は終了しません。

#!/usr/bin/env python 

import sqlite3 

class Creature(object): 
    legs = 0 

    eyes = 'monocular' 

    kind = '' 

conn = sqlite3.connect(':memory:') 

c = conn.cursor() 
c.execute('''create table testtable 
     (date text, legs text, eyes text, kind text)''') 
conn.commit() 
c.close() 

c = conn.cursor() 
for i in range(50000): 

    creature1 = Creature() 
    creature1.legs = 5 
    creature1.eyes = 'monocular' 
    creature1.kind = 'mungy' 

    creature2 = Creature() 
    creature2.legs = 3 
    creature2.eyes = 'binocular' 
    creature2.kind = 'thingy' 

    creature3 = Creature() 
    creature3.legs = 3 
    creature3.eyes = 'monocular' 
    creature3.kind = 'pungy' 

    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature1.legs), creature1.eyes, creature1.kind)) 
    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature2.legs), creature2.eyes, creature2.kind)) 
    c.execute('insert into testtable values (?,?,?,?)', ('today', str(creature3.legs), creature3.eyes, creature3.kind)) 

    conn.commit() 
c.close() 

結果は?

First method: Average 2.264s 
Second method: Average 2.157s 

だから無視しても差はありません。

あなたが持っています。

ステファンの言葉にはっきりと同意します。

関連する問題