>

다음 코드 조각을 가지고 있는데, 객체 목록 (Y 객체라고 함)을 가져 와서 X 객체로 변환하는 다른 메소드를 호출하는 함수입니다.

public List<X> GetXObjects()
{
    var yObjects= GetYObjects();
    var transformer = new Transformer();
    var xObjects = transformer.Transform(yObjects);
    return xObjects;
}

그러나 현재 구현은 작동하지만 내 기능이 SRP 또는 기타 모범 사례를 위반할 수 있다고 생각합니다. 코드를 더 좋게 리팩토링 할 수 있습니까?

  • 답변 # 1

    TransformObjects 메소드를 호출합니다  변환기를 매개 변수로 추가하여 다른 변환기를 사용할 수 있으며 메소드를 호출 할 때마다 변환기가 초기화되지 않습니다. yObjects 와 동일 . 따라서이 방법의 유일한 책임은 객체를 변환하는 것입니다.

    public List<X> TransformObjects(List<Y> yObjects, Transformer transformer)
    {
        var xObjects = transformer.Transform(yObjects);
        return xObjects;
    }
    
    

    메소드 호출 :

    var yObjects= _crmWrapper.GetActivitiesByOpportunities();
    var transformer = new Transformer();
    myTransformer.TransformObjects(yObjects, transformer);
    
    

    인터페이스 ITransformer 를 만드는 경우  인터페이스를 사용하면 변압기를 교환하여 코드를 향상시키는 것이 더 쉬울 것입니다.

  • 답변 # 2

    내 2 센트 가치는 ...

    저는이 코드를 적은 비용으로 훨씬 더 일반적으로 만들 것입니다. 케빈 월리스 (Kevin Wallis)의 좋은 답변을 확장하면서 왜이 성가신 변압기를 제거하지 않겠습니까? Y 를 변형시키는 방법을 아는 것   X 로  해야합니까?

    List 를 받아들이고 돌려 주는가 ? 소비자가 열거를 열성적으로 소비할지 여부를 결정하게하고, 필요한 경우가 아니라면 그 결정을 내리지 마십시오.

    public IEnumerable<TResult> TransformObjects<TResult, TSource>(
        IEnumerable<TSource> source, Func<TSource, TResult> transformer)
        => source.Select(transformer);
    
    

    이제 갑자기 깨달았습니다. 야! 이것은 단지 규칙적인 좋은 오래된 Enumerable.Select 그렇지 않습니까? 그렇다면 왜 바퀴를 재발 명해야할까요?

    var xObjects = GetYObjects().Select(transformer.Transform);
    
    

    그래서 당신의 코드는 결국 Enumerable.Select 입니다 ! 여기에 버그가 없으며 테스트해야 할 한 가지 방법이 적습니다.;).

  • 답변 # 3

    기능이 다음 작업을 수행합니다

    로드 활동

    변압기 인스턴스 생성

    로드 된 객체 변환

    액티비티를 인수로 도입하여 활동로드를 제거 할 수 있습니다

    public List<X> GetXObjects(List<Y> yObjects)
    {
        var transformer = new Transformer();
        return transformer.Transform(yObjects);
    }
    
    

    그러면 트랜스포머 생성도 외부로 이동할 수 있습니다

    public List<X> GetXObjects(Trnasformer transformer, List<Y> yObjects)
    {
        return transformer.Transform(yObjects);
    }  
    
    

    이제 코드에서 다음과 같이 호출하는 곳이 있습니다.

    var yObjects= _crmWrapper.GetActivitiesByOpportunities();
    var transformer = new Transformer();
    var xObjects = GetXObjects(yObjects, transformer);
    
    

    하지만 조회수는 XObjects 가 필요한 모든 곳을 의미합니다.   YObjects 를로드하는 방법을 알아야합니다   Transformer 를 만드는 방법

    이 지식/논리를 한 클래스로 캡슐화 할 수 있습니다

    public class XObjectsProvider
    {
    }
    
    

    이 클래스는 YObjects 를로드해야합니다  XObject로 변환합니다. Transform 인스턴스의 실제로드 및 생성 구현은이 클래스의 책임이 아니므로 종속성으로 소개합니다.

    public class XObjectsProvider
    {
        private Loader _loader;
        private Transformer _transformer;
        public XObjectsProvider(Loader loader, Transformer transformer)
        {
            _loader = loader;
            _transformer = transformer;
        }
        public XObjects Get()
        {
            var yObjects = _loader.GetYObjects();
            return transformer.Transform(yObjects);
        }
    }
    
    

    Loader  그리고 Transformer   XObjectProvider 의 코드를 변경하지 않고 추상화 할 수 있으며 추상화 할 수 있습니다.  - "열기/닫기 원리"를 따릅니다. 그리고 XObjectProvider  변경해야 할 이유는 한 가지뿐입니다. XObject를 가져올 때는 다른 정보를로드/제공해야합니다.

  • 이전 oracle - SYSAUD $에 audit_trial 저장
  • 다음 java - 최적화 - 루프에서 sql 쿼리 가져 오기