2013-05-13 3 views
2

그래서 저는 OO Design에서 새로운 것이므로 Singleton 디자인 패턴의 사용에 대해 궁금합니다. 내가 why singletons are bad에 대한 기사를 읽었지만, 내가 필요로 할 수 있는지 알 수 없다. 가능한 한 많이 피하고 싶습니다.하드웨어 관리를 위해 싱글 톤을 사용해야합니까?

필자의 경우 OceanOptics Spectrometer를 사용하여 C++에서 API를 통해 제어하고 참조 할 수 있습니다.

나는 단일 클래스 SpectrometerProxy에서 분광기를 관리하는 모든 코드 (발견, 매개 변수 설정 또는 가져 오기, 데이터 검색)를 넣었습니다.

그리고이 클래스가 싱글 톤인지 여부를 알고 싶습니다. 나는 그것을 정당화 할 수있는 몇 가지 이유가있을 수 있다고 생각 :

  • 이 하드웨어를 관리 분광계의 수, 그들은이 모든 클래스

  • 를 통해 제어 및 상담을하고 무엇이든

  • 정확한 순서로 한 번만 수행해야하는 특정 절차가 있습니다 (분광계 열기, 일부 변수 확인 및 프로그램 중지시 분광계 닫기)

그렇다면이 클래스를 구현하는 것이 더 좋은 방법이 있을지 모르겠다. 내가 생각한 다른 솔루션은 일반 클래스로 유지하지만 (복사 생성자 및 할당 연산자를 선언하여) 복사를 방지하고 필요로하는 클래스에 대한 포인터를 전달하는 것입니다. 다중의 생성을 막지는 못합니다. SpectrometerProxy 그리고 ' d는 그것을 피하고 싶다.

나는 또한 모두 정적이라고 생각했지만 올바른 순서로 정확한 정적 멤버 함수를 호출하기 위해 클라이언트 코드에 의존하고 (따라서 분광계에 대한 연결을 올바르게 닫는 것을 잊지 않고) 따라서 오류가 발생하기 쉽고 RAII 원칙에 위배됩니다.

따라서이 문제에 대한 싱글 튼이 올바른 설계 접근 방법 일 수 있습니까? 아니면이를 제외하고 다른 방법을 찾아야합니까?

+1

짧은 대답 : "아니오". 더 긴 대답 : "왜 그랬니?" – jalf

+0

나는 내가해서는 안된다는 것을 안다. 나는 왜 싱글 톤이 나쁜지에 대해 읽었다. "왜 그랬니?" 꽤 제 질문입니다. 다른 부분은 "가능한 대안은 무엇입니까?"입니다. 감사. – JBL

+1

오늘 여러분은 단일 프록시를 통해 모든 분광기를 제어하려고한다고 생각합니다. 내일은 둘 이상의 독립적 인 프록시가 필요할 수 있습니다. 하드 코드 된 가정만으로는 더 어려울 것입니다. –

답변

4

싱글 톤을 사용하거나 사용하지 않는 것은 대부분 종교적인 주제입니다. 하드웨어 사용 경험 (10 년 이상)에 따르면 나는 그것을 사용하지 않을 것을 권한다. 첫째로 : as Murphy's law은 내일 한 개 이상의 분광계로 작업해야한다고 말합니다. 둘째 : 하드웨어와 상호 작용하고, 상속하고, 코드를 작성하는 데 필요한 메소드를 가상 추상 인터페이스로 만드는 것이 더 좋습니다. 실제로 하드웨어를 다룹니다. 이 방법은 하드웨어에 액세스 할 수 없지만 앱을 디버깅해야 할 때 유용합니다. 이 경우에는 해당 인터페이스를 서브 클래 싱하고 에뮬레이트 기능 (또는 하드웨어에서 가져온 데이터로 이전에 기록 된 파일의 실제 데이터를 읽는 더 나은 기능)을 만드는 것만으로 나머지 프로그램은 변경되지 않습니다.

+1

가상 추상 인터페이스를 제안 해 주셔서 감사합니다. 그것은 아주 분명하고 단순한 느낌이 들지만 나는 그것에 대해 생각하지 않았습니다. 필자는 항상 분광계를 테스트 할 수있는 것은 아니기 때문에 유용 할 것입니다. – JBL

2

나는 당신이 질문해야한다고 생각하는 것은 당신이 어떤 위치에서 당신이 오직 하나의 분광계 (예를 들어 비용으로 인해)를 가졌을 것이라는 의심이 아닌 다른 싱글 톤 클래스가 필요한 이유라고 생각한다. 어떤 소프트웨어 설계 이유보다. 왜 싱글 톤이 On Design Patterns: When to use the Singleton?에 포함되어 있고 싱글 톤의 부정적인 측면이 What is so bad about singletons?에 포함되어 있는지 알고 싶습니다. 개인적으로 나는 상황이 소프트웨어 관점에서 실제로 요구하는 경우를 제외하고는 싱글 톤 패턴의 큰 팬이 아니며, 다른 것은 향후 코드 재분석으로 이어질 수있다.

1

싱글 톤 결정 외에도 장비를 발견하고 개별 장치를 제어하는 ​​데 단일 클래스를 사용하는 것은 나쁜 아이디어입니다. 명백한 이유없이 동일한 기능을 다른 클래스에 추가하고 있습니다.

더 모르게 말을 열심히하지만, 일반적으로는 별도의 클래스로 기능을 분리하는 것이 더 적합 할 수 있습니다 :

  • HwLookup -이는 싱글이 될,하지만 수도 등의 장치 검색을 수행 나는 그것을 할 것이라고 확신하지 못한다. - 나는 그것을 싱글 톤으로 만들 특별한 이유를 보지 못했지만 그것은 의미가있을 수있다.그것은 가
  • SpectrometerProxy (또는 Spectrometer) 하나의 장치를 나타냅니다과 용도 얼마나 많은 물건에 따라 측정 결과 등)

를 설정/매개 변수를 가져, 검색하는 데 사용할 수있는, 내가의 개별 인스턴스를 반환 HwLookup을 클래스로 디자인할지는 확실하지 않습니다. 함수가 될 수 있습니다 (예 : 모든 것이 분광계 프록시 목록을 반환하는 경우). 모든 것을 C++ 코드로 클래스에 넣을 이유는 없습니다.

+0

글쎄, 나는 장치의 "인스턴스"를 반환하는 하드웨어 검색 클래스의 아이디어와 비슷하지만, 필자의 경우 모든 분광기를 열 수있는 함수를 호출해야하며, 프로그램이 종료되면 모든 함수를 닫는 함수 분광계 (그것은 그것들을 방출한다). 이 두 단계는 한 번만 수행해야합니다. 따라서 시작 및 종료시 이러한 단계를 자동으로 수행하는 harware 조회 및 관리에 최소한 싱글 톤을 사용하는 아이디어. – JBL

관련 문제