2012-10-04 2 views
2

저는 회사의 소프트웨어 제품을위한 새로운 아키텍처를 설계하고 있습니다. 나는 단위 테스트에 상당히 새로운 것이다. 싱글 톤과 정적 메소드의 사용에 관한 몇 가지 공포 이야기를 읽었지 만, 문제를 명확하게 이해하지 못하고 있고, 일부 깨달음에 감사 할 것입니다. PHP 정적 메서드/싱글 톤 패턴

내가 다중 계층 구조를 가지고 : 여기

내가 뭐하는 거지입니다. 서버 측 레벨에서 "핸들러"라고하는 데이터베이스 테이블을 나타 내기 위해 일련의 재사용 가능한 객체를 사용하고 있습니다. 이러한 핸들러는 XMLObjects, XMLTables, 다른 Datastructures 등과 같은 다른 객체를 사용합니다. 대부분이 사전 포장 된 객체가 아니라 직접 만든 객체입니다. 어쨌든,이 계층의 맨 위에 의사 단일 계층이 있습니다. 이것의 주요 목적은 더 높은 수준의 서버 측 코드를 단순화하고 완벽한 클래스 관리를 작성하는 것입니다. 나는 말할 수있다 :

$tablehandler = databasename::Handler('tablename') 

... 테이블을 얻으려고. 나는 이것에 내재 된 문제를 보지 못했다. 다른 객체의 인스턴스를 포함하기 위해 핸들러 스택 (연관 배열)을 사용하고 있습니다. 전역을 사용하지 않고 있으며 모든 정적 데이터 멤버는 보호되거나 비공개입니다. 내 질문은 어떻게이 단위 테스트 문제를 일으킬 수 있습니다. 나는 왜곡 수사학을 찾고 있지 않다. 나는 인과 관계를 찾고있다. 나는 또한 이것에 대한 다른 통찰력을 주셔서 감사합니다. 나는이 시점에서 매우 유연하고 효율적인 아키텍처 인 것처럼 느낍니다. 여기에 도움이 될 것입니다.

+4

당신은 정말로 공백을 좋아하지 않습니다 .... – Baba

+0

그것은 실제로 멋진 디자인 패턴입니다. 싱글 톤 토론으로 도우를 도울 수는 없지만 확실히 혁신적인 생각이 분명합니다. –

+0

가장 큰 차이점은 [인터페이스] (http://php.net/manual/en/language.oop5.interfaces.php) – Ohgodwhy

답변

4

관리 인스턴스에 대한 액세스를 제공하기 위해 정적 메서드를 사용하면 (싱글 톤, 풀링 된 객체 또는 실행 중 인스턴스) 테스트에 대한 방법을 제공하는 한 테스트에 문제가되지 않습니다. 필요에 따라 자신의 mock과 스텁을 삽입하고 완료되면 제거하십시오. 당신의 묘사에서 나는 그 능력을 차단할 어떤 것도 보지 못합니다. 필요한 경우 빌드하는 것은 사용자에게 달려 있습니다.

확장 점이나 인스턴스를 통과하지 않고 작업을 수행하는 메서드에 대한 정적 호출을하는 클래스가 있으면 어려움을 겪을 수 있습니다. 예를 들어,이

UserTable::findByEmail($email); 

같은 전화는 그러나 등을 모의, 메모리 전용 테이블을 연결 할 수 없기 때문에

UserTable::get()->findByEmail($email); 

로 변경, 테스트를 어렵게 시험 때문에 문제를 해결 설치 코드에서 UserTable::set($mock)으로 전화 할 수 있습니다. 보다 자세한 예는 this answer을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다! 도움이된다 –

+4

물론 "문제를 해결하는"두 번째 예제는 데메터 법칙을 맹렬히 위반하는 것임을 유의해야합니다. – rdlowrey

+0

@rdlowrey - OP가 정적 방법을 사용하기로 결정한 것은 상당히 무해한 것 같습니다. LoD는 서비스 상태 또는 싱글 톤에 대한 것보다'$ order-> getItems() -> add ($ item)'대신에'$ order-> addItem ($ item)'과 같은 내부 상태를 드러내지 않는 것에 대한 것입니다. 패턴. –