2009-09-06 5 views
2

필자는 기본적으로 오라클 시퀀스의 파이썬 구현 인 객체를 가지고 있습니다. 여러 가지 이유로 오라클 시퀀스의 차세대를 구해야하고 기본 키를 결정할 때 수동으로 카운트 한 다음 레코드가 삽입되면 시퀀스를 업데이트해야합니다.속성이 중요하지 않은 초기화를 수행해야합니까?

그래서 여기 내 객체가 수행하는 단계입니다 :

  1. 처음 없음으로 설정 key_generator 속성, 객체를 구축합니다.
  2. 데이터베이스에서 첫 번째 값을 가져 와서 itertools.count로 전달하십시오.
  3. 해당 생성자에서 next_key 속성을 사용하여 키를 반환합니다.

    1. 건너 뛰기 1 단계와 생성자의 2 단계를 수행합니다

  4. 는 내가 세 가지 가능성을 생각할 수있는 2 단계 작업을 수행하는 위치에 대한 좀 확실 해요. 나는 이런 종류의 초기화를 생성자에서하는 것을 싫어하기 때문에이 악을 발견한다.
  5. next_key을 처음 호출 할 때 데이터베이스에서 시작 키를 가져옵니다. 속성은 일반적으로 사소한 것으로 가정되기 때문에 나는이 악을 발견했습니다.
  6. next_keyget_next_key 방법으로 만드십시오. 속성은 여기에서 더 자연스럽게 보이기 때문에 나는이 것을 싫어합니다.

어느 것이 3 가지 중 적은 것입니까? 나는이 속성에 대한 첫 번째 호출 만 데이터베이스 쿼리를 생성하기 때문에 # 2쪽으로 기울고 있습니다.

답변

4

나는 의심이 PEP-8에서 오는 생각 : 표준 행동

Note 3: Avoid using properties for computationally expensive 
    operations; the attribute notation makes the caller believe 
    that access is (relatively) cheap. 

준수는 일반적으로 매우 좋은 생각이다; 이것이 해결책 # 2를 폐기해야 할 이유가 될 것입니다.

인터페이스가 메서드보다 속성이 더 좋다고 느낀다면 첫 번째 호출이 더 비싸고 그걸로 해결할 것입니다 (해결책 2).
결국 권장 사항은 해석되어야합니다.

+0

또 다른 문제는 "정확히 얼마나 비싸게 계산합니까?" 어쨌든 다른 경로를 결정했습니다. 나는 이것을 별도의 답변으로 게시 할 것이지만,이 점에있어서 이것이 가장 좋은 대답이라고 생각하기 때문에 이것을 받아 들일 것입니다. –

2

속성 액세스 및 그와 비슷한 모든 것 (예 : Python 컨텍스트의 속성)은 매우 사소한 것에 동의합니다. 속성이 잠재적으로 값 비싼 작업을 수행하려는 경우이 메서드를 사용하여 명시 적으로 만듭니다. "get_XYZ"는 단순한 속성 액세스를위한 규칙으로 일부 언어 (예 : Java)에서 사용되고 매우 일반적인 것이므로 "fetch_XYZ"또는 "retrieve_XYZ"와 같은 이름을 사용하는 것이 좋습니다.

좋은 가이드 라인은 다음과 같습니다. 프로퍼티가 프로그래밍 오류로 인한 예외를 throw 할 수있는 경우 메서드가되어야합니다. 예를 들어, (가상의) DatabaseConnectionError를 속성에서 던지는 것은 좋지 않지만 ObjectStateError를 던지는 것은 괜찮습니다.

또한 올바르게 이해하면 next_key 속성에 액세스 할 때마다 다음 키를 반환하려고합니다. 귀하의 속성에 부작용 (캐싱, 게으른 초기화 등을 제외하고)을 강력하게 권장합니다. 속성 (및 해당 속성)은 멱등수 여야합니다.

+0

우수한 점. next_key가 멱등수가 아닐 것이라는 사실은 내가 고려하지 않은 것입니다. –

0

내가 제안한 솔루션의 주요 냄새는 내가 만든 속성에 "다음"이라는 단어가 포함되어 있다는 것입니다. 따라서 next_key 속성을 만드는 대신 DatabaseIntrospector 클래스를 KeyCounter 클래스로 바꾸고 반복자 프로토콜을 구현했습니다. 즉 다음 키를 반환하는 일반 오래된 다음 메서드를 만듭니다.

관련 문제