싱글톤의 대체 수단
애플리케이션의 설정 정보를 보관 유지하는 클래스가 있습니다.예전에는 싱글톤이었어요.건축 검토 후 싱글톤을 제거하라는 지시를 받았습니다.유닛 테스트에서 싱글톤을 사용하지 않음으로써 여러 구성을 동시에 테스트할 수 있기 때문에 몇 가지 이점이 있었습니다.
싱글톤이 없으면 코드의 모든 곳에 인스턴스를 전달해야 합니다.너무 지저분해서 싱글톤 포장지를 썼어요.이제 동일한 코드를 PHP 및 에 포팅합니다.NET, 컨피규레이션오브젝트에 사용할 수 있는 더 좋은 패턴이 있는지 궁금합니다.
Google Testing 블로그에는 테스트 가능한 코드를 만들기 위해 Singleton을 피하는 방법에 대한 일련의 항목이 있습니다.이것이 도움이 될 수 있습니다.
마지막 기사에서는 싱글톤의 사용을 피할 수 있도록 새로운 오브젝트 작성 방법을 자세히 설명합니다.확실히 읽을 가치가 있다.
즉, 새로운 오퍼레이터를 모두 공장으로 옮깁니다.우리는 비슷한 수명을 가진 모든 오브젝트를 하나의 공장으로 묶습니다.
가장 좋은 방법은 공장 패턴을 사용하는 것입니다.클래스의 새 인스턴스(공장 내)를 구성할 때 단일 인스턴스(공장 클래스에 저장)에 대한 참조로 또는 관련 데이터를 새 개체에 복사하여 '글로벌' 데이터를 새로 생성한 개체에 삽입할 수 있습니다.
그러면 모든 객체에 싱글톤에 존재하던 데이터가 포함됩니다.전체적으로 큰 차이는 없다고 생각합니다만, 코드를 읽기 쉽게 할 수 있습니다.
여기서 당연한 말을 하고 있을지도 모르지만, Spring이나 Guice와 같은 의존성 주입 프레임워크를 사용할 수 없는 이유가 있습니까? (Spring도 사용할 수 있다고 생각합니다.)NET도 마찬가지입니다).
이렇게 하면 프레임워크에 구성 객체의 단일 복사본을 저장할 수 있으므로 검색할 필요가 없습니다.
이게 내가 평소에 하는 방법이야!
Spring Framework를 사용하면 일반 콩을 만들 수 있습니다.디폴트(또는 명시적으로 설정한 경우)scope="singleton")는 빈 되며, 이는 의존관계에서 되거나 를 통해 getBean().
싱글톤 패턴을 결합하지 않아도 단일 인스턴스의 이점을 얻을 수 있습니다.
대안은 물건을 달라고 하는 대신 필요한 것을 건네주는 것이다.
이는 이해하기 어렵고 취약한 매우 큰 개체로 끝나기 때문에 단일 구성 개체에 책임 소재를 누적하지 마십시오.
를 들어, 한 경우, '클래스', '클래스'를 변경합니다.Configurationobject를 하는 모든 컴파일합니다.이것은 다소 문제가 있다.
빅 , 글로벌 리팩터링, 빅 코드 리팩터링을 합니다.Configuration클래스에 합니다.클라이언트 클래스에 필요한 매개 변수만 전달합니다.
class Server {
int port;
Server(Configuration config) {
this.port = config.getServerPort();
}
}
리팩터링 대상:
class Server {
public Server(int port) {
this.port = port;
}
}
의존성 주입 프레임워크는 여기서 많은 도움이 되지만 꼭 필요한 것은 아닙니다.
스태틱 방식을 사용하면 싱글톤과 같은 동작을 실현할 수 있습니다.Steve Yegge는 이 투고에서 그것을 매우 잘 설명한다.
정적 메서드와 필드만 포함하는 클래스가 가능합니까?정확히 어떤 상황인지는 모르겠지만 조사해 볼 가치가 있을지도 몰라요.
어떤 공구/프레임 등에 따라 달라집니다.사용되고 있습니다.의존성 주입/ioc 도구를 사용하면 di/ioc 컨테이너가 필요한 클래스에 대해 싱글톤 동작을 사용하도록 함으로써(IConfigSettings 인터페이스 등) 싱글톤 성능/최적화를 얻을 수 있습니다.이것은 여전히 테스트로 대체될 수 있습니다.
또는 팩토리를 사용하여 클래스를 만들고 요청할 때마다 동일한 인스턴스를 반환할 수도 있습니다.그러나 테스트에서는 stubbed/mocked 버전을 반환할 수도 있습니다.
설정을 콜백 인터페이스로 할 수 있는지 여부를 확인합니다.이 때문에, 설정의 기밀 코드는 다음과 같습니다.
MyReuseCode.Configure(IConfiguration)
system-init 코드는 다음과 같습니다.
Library.init(MyIConfigurationImpl)
종속성 주입 프레임워크를 사용하여 구성 개체를 전달하는 작업을 줄일 수 있습니다.적절한 것은 xml이 아닌 코드를 사용하는 장점이 있는 ninject입니다.
또한 매우 깔끔하지는 않지만, 변경하고자 하는 정보 비트를 싱글톤을 생성하는 방법으로 전달할 수 있습니다.
public static Singleton getInstance() {
if(singleton != null)
createSingleton();
return singleton;
}
}
전화할 수 있다createSingleton(Information info)응용 프로그램 시작 시 직접(및 장치 테스트의 setUp-Methods에서)
언급URL : https://stackoverflow.com/questions/1300655/whats-alternative-to-singleton
'programing' 카테고리의 다른 글
| Java String이 모든 공백 공간이 아님을 확인하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
|---|---|
| Python db-api: fetchone vs fetchmany vs fetchall (0) | 2022.11.24 |
| JavaScript의 'new' 키워드는 무엇입니까? (0) | 2022.11.23 |
| 엔티티에서 Enum을 사용할 때 쿼리 생성 관련 문제 (0) | 2022.11.23 |
| PHP를 사용하여 Google 캘린더에서 읽을 ical 파일을 동적으로 게시하려면 어떻게 해야 합니까? (0) | 2022.11.23 |