클래스 인스턴스의 올바른 사용
-
13-09-2019 - |
문제
저는 Access 2003 VBA를 사용하여 BOM 제조를 위한 재귀 데이터를 처리하고 있습니다.나는 메인 테이블이 정적 범위를 가질 수 있도록 클래스 모듈을 만들었습니다.이는 재귀를 단순화하는 것처럼 보입니다. BOM을 탐색할 때 레벨을 세고 다시 세는 일이 없도록 해줍니다.동일한 레코드 세트를 중복해서 열지는 않습니다.대신 필터링을 많이 하고 있어요.
이 작업을 진행한 후 객체 관계 모델링에 대해 읽었고 레코드세트가 아닌 레코드를 인스턴스화하기로 결정했습니다.그러면 해당 레코드의 필드가 속성이 될 수 있습니다.많은 작업과 대부분의 실수가 있었던 승리의 전율을 겪은 후에 저는 Access가 테이블 기반이기 때문에 이 접근 방식이 아무런 이점이 없다는 것을 깨달았습니다.
내 수업 모듈은 이전처럼 여전히 도움이 됩니다.내 질문은 아래 두 가지 대체 버전에 관한 것입니다.첫 번째는 두 개의 인스턴스(Parent,Child)를 사용합니다.두 번째는 하나를 사용한 다음 다시 사용합니다.분명히 첫 번째는 ORM의 영향을 받았습니다.
다른 것보다 이 중 하나를 선택해야 하는 이유가 있나요?또한 끝에 있는 이탤릭체 줄을 참고하세요.그것이 필요하지 않다면(부모에 대한 더 많은 정보가 필요하지 않기 때문에) 대답이 바뀌나요?누구든지 내 생각을 전반적으로 도와줄 수 있나요?
(레코드세트는 닫지만 클래스 인스턴스는 닫지 않습니다.내 이해는 VBA 인스턴스가 스스로 닫히고 허용되는 관행이라는 것입니다.의사 코드를 새로운 수준의 의사 코드로 끌어올린 것 같습니다.목표는 명확성입니다. 효과가 있기를 바랍니다.)
VERSION 1 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID 클래스 인스턴스 생성 -> 레코드 세트 가져오기 Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On 클래스 레코드 세트 악용(여전히 상위 항목을 가리킴)
VERSION 2 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID클래스 인스턴스 생성 -> 레코드 세트 가져오기Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On 필터 클래스 레코드 세트( Parent_Part_ID ) 클래스 레코드 세트 악용(여전히 상위 항목을 가리킴)
해결책
전자는 프로그래머의 관점에서 볼 때 더 나은 사용 편의성을 제공하는 것 같습니다. 관심 있는 레코드로 간단히 시작할 수 있고 시작한 레코드의 속성에 액세스하는 것만으로 연관 레코드에 쉽게 뿌리를 내릴 수 있기 때문입니다.
반면에 후자가 현재 레코드와 관련될 수 있는 모든 레코드를 비관적으로 로드하지 않기 때문에 더 효율적으로 보입니다.
사용 편의성을 유지하면서 두 번째 접근 방식의 효율성에 접근하는 데 도움이 될 수 있는 첫 번째 접근 방식에 대한 몇 가지 잠재적 최적화:
- 필요할 때만 하위 레코드를 로드합니다.Get/Set 접근자를 사용하면 상위 레코드를 DB에서 가져올 때 한꺼번에 로드하는 것이 아니라 적시에 로드할 수 있습니다.
- 또는 JOIN을 사용하여 단일 쿼리의 일부로 모든 하위 데이터를 한 번에 검색합니다.이렇게 하면 미리 로드된 모든 데이터가 제공되지만 이를 가져오기 위해 실행해야 하는 쿼리 수가 크게 줄어듭니다.
도움이 되었기를 바랍니다.
다른 팁
msdatashape 공급자와 SHAPE 구문을 사용하여 생성하는 것을 고려해 보셨나요? 계층적 ADO 레코드세트?