簡體   English   中英

相關變量和操作的分組?

[英]Grouping of related variables and operations?

在“代碼完成”的第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 );
    ...
}

我確實同意,至少從我自己的角度來看,第二種方法更易於閱讀和理解,並提供了更簡潔的代碼。 因此,我的問題是,第二種方法是否有缺點? 例如,我想到的一個可能的問題是與數據庫的臨時連接,例如:

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

第一種方法將在一個打開/關閉周期中完成兩個保存操作。 但是,使用第二種方法...

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

您必須打開和關閉每個操作的連接。 這似乎很浪費,但是我不知道它如何影響實踐中的性能。

抱歉,這個不必要的冗長問題...

我還沒有進入“代碼完成”的第10章(還需要幾個晚上!),但我認為這里的重點是以一種邏輯易讀的方式對代碼行進行分組, 而不影響程序功能。 換句話說,請清理並盡可能重新排列它,但只要它開始真正影響行為,就應立即停止。

在您的示例中,我們應該牢記“過早的優化是萬惡之源”,但是我認為我們仍然可以安全地假設如果您要立即再次打開連接,則不應該關閉連接。 ,因為這兩個動作實際上相互抵消了。 通常,為簡單起見,任何連接都應僅在您第一次需要它們之前打開,並在最后一次使用它們之后立即關閉。

我很無聊,所以我嘗試使用Sqlite在Python中進行概念驗證速度測試(我意識到這不是最好的方法)。

首先,進行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

因此,盡管有微不足道的影響,但它有所作為。

那里有它。

不過,我完全同意斯蒂芬妮的話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM