2010-07-16 6 views
2

필자는 최근 표면에 모델에 맞는 매핑 인터페이스를 구현하고 있습니다. (그들은 본질적으로 더 이상 메타 데이터가없는 키 - 값 저장소입니다.) 밑에는 때로는 매우 복잡합니다.항목 액세스 대신 get/put 메서드를 사용해야하는 이유가 있습니까?

  1. 설정할 때 문자열의 모든 객체를 다른 변환 매핑을 감싸는 개체 :

    여기 커플 증가 심각도의 예이다.

  2. 로컬 데이터베이스를 백엔드로 사용하여 키 - 값 쌍을 저장하는 객체입니다.
  3. 데이터를 가져 오거나 설정하기 위해 원격 서버에 HTTP 요청을 보내는 객체입니다.

이러한 예제가 모두 매핑 인터페이스를 원활하게 구현한다고 가정 해 보겠습니다. 잠재적 인 문제는 항목 액세스에 잠재적으로 몇 초가 걸릴 수 있으며 동일한 항목에서 항목을 검색 할 수 없다는 것입니다. 저장 된 양식 (있는 경우). 저는 첫 번째 예제와 같이 완벽하게 만족합니다. 두 번째 예제에서는 꽤 괜찮습니다.하지만 마지막 예제에서는 다소 불편할 것입니다.

근본적인 구조가 표면에 맞는 것처럼 느껴질지라도이 모델에 대한 API가 항목 액세스를 사용해서는 안되는 라인이 있습니까?

답변

0

엄밀히 말해서 철학적 관점에서 볼 때 나는이 부분과 교차 할 수있는 선이 있다고 생각하지 않습니다. 일부 도구가 필요한 기능을 제공하지만 API가 다르면 적응하십시오. 이 작업을 수행해서는 안되는 유일한 경우는 API에 적용한 것이 필요한 방식으로 조정 된 구성 요소를 조작하기에 충분하지 않은 경우입니다.

데이터베이스를 dict에 적용하는 것을 주저하지 않을 것입니다. 이는 컬렉션을 조작하는 좋은 방법이기 때문에 다른 많은 코드와 이미 호환됩니다. 특정 응용 프로그램에서 데이터베이스 연결 begin(), commit()rollback() 메서드를 올바르게 호출해야한다고 판단한 경우 dict에는 트랜잭션 의미론이 없으므로 dict이 수행하지 않습니다.

+0

하지만 거래가 선택 사항 일 경우 어떻게해야합니까?pybsddb는 이것을 수행합니다. dict 스타일의 액세스를 사용할 수 있지만 단순히 트랜잭션에 액세스하지 못합니다. –

+0

내 응용 프로그램이 실제로 이러한 트랜잭션 의미론을 사용하려는 경우 dict 어댑터를 사용하지 않을 것임을 의미합니다. 당신이 그 (것) 또는 dicts의 전형 다른 무엇을 필요로하지 않는 경우에, 그 후에 앞으로 가고 그것을 dict 같이 보이게하십시오! – SingleNegationElimination

2

표준 anydbm 모듈 의미를 설명하는 것처럼 들립니다. 그리고 anydbm이 예외 anydbm.error을 발생시킬 수있는 것처럼, 필요에 따라 하위 클래스가 MyDbmTimeoutError과 같은 파생 상품을 올릴 수 있습니다. 사전 작업 또는 함수 호출로 구현하더라도 호출자는 여전히 예외와 계속 경쟁해야합니다 (예 : KeyError, NameError).

파이썬 2에서는 임의의 "묶인"해시가 존재한다고 생각합니다. 3.x는 합리적인 접근 방식이라고 말하는 것에 대한 타당한 근거입니다. 사실, 나는 그 사이에 무거운 ORM SQL 레이어가없는 단순한 키 ⇒ 값 매핑보다 복잡한 바인딩을 찾고 있었다.

덧붙여 : 제가 생각하기에 더 많은 Pythonic 묶인 사전이있는 것 같습니다. 키 ⇒ 값 컬렉션 사전입니다. 코어 또는 디스크 또는 네트워크를 통해 구현되는지 여부는 가장 잘 추상화 된 구현 세부 사항입니다. 유일한 실질적인 차이점은 대기 시간이 증가하고 사용할 수 없게 될 가능성이 있다는 것입니다. 그러나 가상 메모리 기반 OS에서 "코어"는 RAM보다 대기 시간이 길고 멀티 프로세싱 OS에서는 "코어"를 사용할 수 없게됩니다. 그래서 이것들은 단지 학위의 차이 일뿐입니다.

관련 문제