문제

상황은 다음과 같습니다. 너무 많은 일을하는 수업이 있습니다. 주로 구성 정보에 액세스하기위한 것이지만 데이터베이스 연결도 있습니다. 싱글 톤으로 구현되므로 대부분의 코드가 매우 단단히 결합되어 단위 테스트가 어려워집니다. 이는 수입 시간 종속성 (파이썬 에서이 작업을 수행 함)을 생성하므로 특정 순서로 특정 모듈을 가져와야 함을 의미합니다. 이상적으로는 이것을 두 수업으로 나누고 비 싱턴으로 만들고 싶습니다.

다행스럽게도, 내 고용주는 이런 종류의 테스트가 좋다는 사실에 따른 것이며 코드가 더 테스트 가능하다면 이와 같은 변경을 할 수 있도록 기꺼이 할 수 있습니다. 그러나 나는 그들이 내가 기꺼이 내가 지출 할 수 있을지 의심 스럽다 너무 많이 그것에 시간. 그리고 나는 너무 급진적이 되려고 노력하기보다는 이것을 점차적으로 고치고 싶습니다.

그래서 여기에는 세 가지 선택이 있습니다.

  1. 구성 객체를 (Singleton) 구성 객체와 (비 Singleton) 데이터베이스 개체로 나눕니다. 이를 통해 최소한 데이터베이스를 가져 오기 시간 종속성으로 제거 할 수 있습니다.
  2. 구성 객체를 비 싱턴으로 만들고 필요한 객체로 전달하십시오. 나는 이것이 더 나은 것이 우리의 단기 요구를 해결한다고 생각하지만, 훨씬 더 많은 시간이 걸릴 것이라고 생각합니다.
  3. 당신이 당신의 대답에서 제안하지 않은 일을하십시오. :-)

그래서 나는 무엇을합니까?

도움이 되었습니까?

해결책

나는 당신이 두 수업으로 분리하려고 생각합니다. 공장을 사용하여 필요에 따라 데이터베이스 컨텍스트/연결을 만드는 것을 고려할 수 있습니다. 이렇게하면 연결을 객체의 수명에 대한 단일 연결을 유지하는 대신 필요에 따라 생성/배치되는 작업 엔티티의 단위로 취급 할 수 있습니다. 그래도 ymmv.

구성에 관해서는, 이것은 싱글 톤이 올바른 선택이 될 수 있음을 알게되는 한 가지입니다. 나는 단위 테스트가 어렵 기 때문에 반드시 그것을 버릴 필요는 없습니다. 그러나 인터페이스를 구현하려면 구축을 고려할 수 있습니다. 그런 다음 종속성 주입을 사용하여 테스트 중에 인터페이스의 모의 인스턴스를 제공 할 수 있습니다. 주입 된 값이 null 인 경우 싱글 톤 인스턴스를 사용하거나 싱글 톤 인스턴스를 주입하기 위해 생산 코드가 구축됩니다. 또는 개인 메소드를 통해 재직 할 수 있도록 클래스를 구성하고 설정/찢어짐 테스트 방법에서이를 호출하여 테스트에 대한 적절한 구성이 있는지 확인할 수 있습니다. 인터페이스를 직접 제어 할 수 없을 때도 사용했지만 후자의 구현보다 전자를 선호합니다.

변화를 점차적으로 만드는 것은 확실히 갈 길입니다. 가능한 경우 현재 기능을 테스트로 래핑하고 수정 후에도 해당 테스트가 여전히 통과되는지 확인하십시오 (물론 수정을 직접 다루는 것은 물론) 다른 코드를 깨지 않도록하는 좋은 방법입니다. .

다른 팁

코드를 보지 않고는 알기가 어렵지만 왜 당신이 말하는 것을하지 않는가? 먼저 1 단계를 수행하고 데이터베이스를 분할하십시오.

그것이 빠르면 다시 돌아가면 이제 2가 아닌 싱글 톤이되는 것을 멈출 수있는 작은 물체가 1 개 밖에 없습니다. 따라서 2 단계는 더 빠르야합니다. 또는이 단계에서 싱글 톤에서 리팩토링 될 수있는 다른 코드가 표시 될 수 있습니다.

바라건대 한 단계에서 엄청난 시간 세금을 내지 않고 사라질 때까지 싱글 톤의 내용을 단계별로 줄일 수 있기를 바랍니다.

예를 들어 구성의 일부가 독립적 인 경우 구성의 한 부분을 한 번에 싱글 톤으로 만들 수 있습니다. 그렇다면 GUI 구성이 싱글 톤을 떠나 FileConfiguration이 리팩토링되거나 비슷한 것일까 요?

옵션 1은 모든 앱에서 내가하는 일입니다 : 구성 객체 싱글 톤 및 주문형 또는 주입 된 데이터베이스 개체.

싱글 톤으로 코피 포지셔닝 객체를 갖는 것은 항상 저에게 완벽하게 맞았습니다. 구성 파일은 하나 뿐이며 응용 프로그램이 시작될 때 항상 읽고 싶습니다.

내가 파이썬을 모른다는 사실을 실례합니다. 그래서 의사 코드가 합리적이기를 바랍니다 ...

싱글 톤의 책임이 더 작아서 객체를 먼저 두 부분으로 나누고 나머지 구성 싱글 톤을 가져 와서 정상 클래스로 변경합니다 (두 번째 제안을 수행하는 것처럼).

일단 그 점을 얻었을 때, 나는 구성 클래스의 메소드를 노출시키는 새로운 래퍼 싱글 톤을 만들 것이다.

class ConfigurationWrapper : IConfigurationClass 
{
    public static property ConfigurationWrapper Instance;

    public property IConfigurationClass InnerClass;

    public method GetDefaultWindowWidth()
    {
        return InnerClass.GetDefaultWindowWidth();
    }

    etc...
}

이제 응용 프로그램이 가장 먼저하는 것은 configurationClass의 인스턴스를 래퍼에 주입하는 것입니다.

ConfigurationClass config = new ConfigurationClass()
ConfigurationWrapper.Instance.InnerClass = config;

마지막으로, 현재 싱글 톤에 의존하는 클래스를 래퍼 싱글 톤으로 이동할 수 있습니다 (빠른 찾기 및 교체해야 함). 이제 클래스를 한 번에 하나씩 변환하여 구성 요소를 통해 구성 객체를 가져와 2 단계를 완료 할 수 있습니다.해야 할 시간이없는 것은 래퍼 싱글 톤을 사용할 수 있습니다. 당신이 그들을 온통 움직인 후에 당신은 래퍼를 제거 할 수 있습니다.

다른 한편으로, 당신은 사용법의 리팩토링을 무시하고 단순히 조롱 된 구성 클래스를 싱글 톤 래퍼에 테스트하기 위해 주입 할 수 있습니다. 본질적으로 가난한 사람의 종속성 주입.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top