다음 코드 조각을 가지고 있는데, 객체 목록 (Y 객체라고 함)을 가져 와서 X 객체로 변환하는 다른 메소드를 호출하는 함수입니다.
public List<X> GetXObjects()
{
var yObjects= GetYObjects();
var transformer = new Transformer();
var xObjects = transformer.Transform(yObjects);
return xObjects;
}
그러나 현재 구현은 작동하지만 내 기능이 SRP 또는 기타 모범 사례를 위반할 수 있다고 생각합니다. 코드를 더 좋게 리팩토링 할 수 있습니까?- 답변 # 1
- 답변 # 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를 가져올 때는 다른 정보를로드/제공해야합니다.
관련 자료
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
TransformObjects
메소드를 호출합니다 변환기를 매개 변수로 추가하여 다른 변환기를 사용할 수 있으며 메소드를 호출 할 때마다 변환기가 초기화되지 않습니다.yObjects
와 동일 . 따라서이 방법의 유일한 책임은 객체를 변환하는 것입니다.메소드 호출 :
인터페이스
ITransformer
를 만드는 경우 인터페이스를 사용하면 변압기를 교환하여 코드를 향상시키는 것이 더 쉬울 것입니다.