2011-07-29 2 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); 
    ... 
} 

나는 두 번째 접근 방식은 읽기와 이해하기 쉽게, 적어도 내 자신의 관점에서, 청소기 보이는 코드를 제공하는 것을 동의한다. 그래서, 제 질문은 두 번째 접근법에 어떤 단점이 있습니까? 예를 들어, 내가 생각할 수있는 하나의 가능한 문제는 데이터베이스와 같은 임시 연결을 수 있습니다 :

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(); 
    ... 
} 

각 작업마다 연결을 열고 닫아야합니다. 이것은 낭비되는 것처럼 보이지만 실제 성능에서 성능에 어떤 영향을 미치는지 전혀 알지 못합니다. 불필요하게 긴 질문에 대한 죄송합니다

...

답변

1

내가 코드에서 10 장에 못 했어 전체 아직 (몇 저녁! 그렇게한다고)하지만 난 여기에 주요 포인트로 생각 논리적이고 쉽게 읽을 수있는 방식으로 코드 줄을 그룹화하십시오 (프로그램 기능에 영향을주지 않고 ). 즉, 가능한 한 정리하고 다시 정렬하지만 동작에 실제로 영향을 미치기 시작하면 중지하십시오.

예를 들어, "조기 최적화는 모든 악의 근원"이라고 명심해야합니다. 그러나 조만간 연결을 닫지 않아야한다고 생각할 수 있습니다. 그 두 가지 행동이 말 그대로 서로를 취소하기 때문에 다시 즉시 다시. 일반적으로 모든 연결은 처음 필요할 때만 열어야하며 마지막으로 연결 한 후 즉시 닫아야합니다. 간단하게하기 위해서입니다.

+0

포인터를 제공해 주셔서 감사합니다. 코드 컴플리트 (Code Complete)는 많은 정보를 가지고 있지만, 무엇보다도 여전히 액면 그대로 받아 들일 수는 없습니다. – voithos

0

나는 지루했기 때문에 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 

그래도 차이는 있지만 무시해도됩니다.

그리고 거기 있습니다.

스테판이 말한 것과 분명히 일치합니다.

관련 문제