2011-01-19 7 views
13

객체가 초기화되는 클래스를 XML 코드 인 으로 만듭니다. 이 클래스는 해당 XML에서 다양한 매개 변수를 추출하고이를 객체 상태 변수 내부에 캐시하는 기능을 가지고 있습니다. 이 매개 변수의 잠재적 인 양은 크며 사용자가 대부분 필요하지는 않습니다. 이것이 내가 "게으른"초기화를 수행하기로 결정한 이유입니다.부작용이있는 게터

다음 테스트 케이스에서 그러한 매개 변수는 title입니다. 사용자가 처음으로 액세스하려고 할 때, 게터 기능이 제대로, XML을 구문 분석하는 상태 변수를 초기화하고 그 값 반환이 좋은 모양과 나를 위해 잘 작동

class MyClass(object):  
    def __init__(self, xml=None): 
     self.xml = xml 
     self.title = None 

    def get_title(self): 
     if self.__title is None: 
      self.__title = self.__title_from_xml() 
     return self.__title 

    def set_title(self, value): 
     self.__title = value 

    title = property(get_title, set_title, None, "Citation title") 

    def __title_from_xml(self): 
     #parse the XML and return the title 
     return title   

합니다. 그러나 getter 함수가 실제로 객체에 매우 중요한 부작용이 있다는 의미에서 실제로 "설정자"라는 사실로 인해 약간 불안합니다. 이것은 합법적 인 관심사입니까? 그렇다면 어떻게해야합니까?

+3

질문에 대한 실제 답변이 무엇이든 관계없이 맨 앞의 두 개의 밑줄을 사용하지 마십시오. 그들은 이름 맹 글링을 시작합니다. 즉 많은 고통과 이득을 얻습니다. 한 줄의 밑줄 만 사용하십시오. – delnan

+1

나는 그것이 왜 문제인지 보지 못했다. –

+1

사소한 리팩토링 제안 : 생성자에서'self._title'을 초기화하지 말고'hasattr (self, "_title")'에 의해 getter의 조건을 바꿉니다. –

답변

4

게터가 확실히 부작용을 수행하는 동안, 그것은 전통적으로 나쁜 부작용을 고려하지 않습니다. getter는 항상 같은 상태를 반환하기 때문에 (상태에 개재하는 모든 변경 사항은 제외) 사용자에게 표시되는 부작용이 없습니다. 이것은 속성에 대한 일반적인 용도이므로 걱정할 필요가 없습니다.

+0

동의하지 않으려합니다.이 경우 XML을 구문 분석하면 예외가 발생할 수 있으며 아무도 XML 액세스 분석 예외를 발생시키기 위해 특성 액세스를 기대합니다. XML을 어떤 방식 으로든 망가 뜨리면 이후 단계에서 아무 예외도 일어나지 않기 때문에 필자는 인수에서 파싱이 발생하도록이 코드 부분을 인수하고 다시 작성한 프로젝트에서 매우 유사한 경우를 가졌습니다. get 속성은 예외를 발생 시켜서는 안됩니다. 당신은 평범한 속성 액세스가 무엇이든 올릴 것으로 기대합니까 (속성이 존재한다고 가정)? 계산 된 속성은 일반 속성만큼 안전해야합니다. –

14

이 디자인 패턴은 Lazy initialization이라고하며 합법적 인 용도입니다.

+0

cf 허용 대답에 대한 내 의견 - 게으른 초기화가 문제가되지 않지만 속성 액세스가 어떤 것도 올릴 수 있어야한다는 의미는 아닙니다.클래스가 지연 초기화를 사용하는 경우,이 메소드가 결코 예외를 의미하지 않도록하거나, 사용자가 평범한 안전한 속성 액세스를 수행하고 getter를 명시 적 메소드로 만들도록 유혹하지 않도록합니다. 그 예외. –

0

몇 년 후 그러나 잘 : 게으른 초기화 자체는 괜찮지 만 누군가가 객체의 title에 액세스 할 때까지는 XML 파싱 등을 미루지 않을 것입니다. 계산 된 속성은 일반 속성처럼 동작해야하며 일반 속성 액세스는 이 아닙니다. raise (속성이있는 것으로 가정).

FWIW 예를 들어 OP 예제와 매우 비슷한 방식으로 속성을 사용하는 이전 개발자 덕분에 XML 구문 분석 오류가 예상치 못한 곳에서 발생하여 일부 프로젝트에서 매우 유사한 경우가 발생했습니다. 그것은 instanciation 시간에 구문 분석 및 유효성 검사 부분을 넣어. 당신이 처음 액세스 할 결코 이제까지 인상을 알고 경우에만 경우

그래서, 게으른 초기화 속성을 사용합니다. 실제로, 올릴 수도있는 물건에는 결코 물건을 사용하지 마십시오 (적어도 설정이 다른 상황 일 때). 그렇지 않으면 속성을 사용하지 말고 getter를 명시 적 메서드로 만들고 명확하게 문서화하여이 값을 올릴 수 있습니다.

NB : 여기에 문제가 없으면 캐시 할 수있는 속성을 사용하면이 자체로 문제가되지 않습니다.

관련 문제