관련이 없지만 거의 동일한 코드를 건조


33

거의 동일한 코드가 있지만 주 변수에서 상속되지 않고 완전히 다른 유형을 사용합니다. 특히 Roslyn에서 C # 및 VB.NET으로 분석기를 작성 중이며 다음과 같은 유형이 있습니다.

Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax

코드가 똑같은 일을하고 있기 때문에 가능한 한 DRY를 유지하고 가능한 한 적은 별도의 (그러나 유형과는 다른) 방법으로 나누거나 두 방법이 있기 때문에 완전히 분리 해야하는지 궁금합니다. 관련이없고 향후 변경으로 인해 한 버전이 변경 될 수 있지만 다른 버전은 변경되지 않을 수 있습니다 (그렇지는 않지만)?

편집 : 1 년 후, 나는이 같은 문제를 겪었고 Roslyn 팀은 그것을 해결하는 데 도움을주었습니다 : 제네릭을 사용하고 TAttributeSyntax대부분의 작업을 수행 하는 매개 변수 가있는 기본 클래스를 작성하십시오 . 그런 다음 특정 유형이 필요한 최소한의 데이터로 파생 클래스를 작성하십시오.


기존 클래스를 래핑하지만 개념적으로 상속 해야하는 상속을 제공하는 자체 AttributeSyntax 인터페이스를 만드는 것이 효과가 있습니까?
Winston Ewert

7
이것이 명백한 경우 미안하지만 제네릭이 존재하므로 동일하지만 유형에 맞는 코드에 대해 반복 할 필요가 없습니다. 그것이 당신이 의도 한 것이 아닌 경우, 무시하십시오.
Davislor

@Lorehead 일반적으로 그렇게하지만, 이것은 제어 할 수없는 내부 메소드의 페이로드로 노드를 포함하는 유형을 전달하는 단일 메소드입니다.
Hosch250

@WinstonEwert 나는 그것에 대해 살펴볼 것입니다. 그래도 모든 C # / VB.NET 유형에 대해 그렇게하고 싶지는 않습니다.
Hosch250

1
리팩토링은 많은 타협과 때로는 역설을 강요합니다. 예를 들어, 느슨한 결합 대 DRY 또는 짧은 기능을 갖지만, 이들 중 다수는 더 긴 기능을 갖지만 그 중 일부는 적다. 결국, 어려운 짐승입니다. 당신의 목표는 가독성과 유지 보수성입니다. 코드를 처음 보는 아바타로 생각해야합니다. 그리고 가끔은 그냥하는 시도 참조 더 나은 것. 불행히도 완벽한 리팩토링은 불가능합니다.
phresnel

답변:


110

당신은 누군가가 그것을하기에 좋은 곳에서 책에 썼기 때문에 당신은 DRY를하지 않습니다. 당신은 그것이 실질적인 이점을 가지고 있기 때문에 당신은 DRY를 합니다.

특히 그 질문에서 :

반복하면 유지 관리 성 문제가 발생할 수 있습니다. doStuff1-3이 모두 유사하게 구조화 된 코드를 가지고 있고 하나에서 문제를 해결하면 다른 곳에서 문제를 해결하는 것을 쉽게 잊을 수 있습니다. 또한 처리 할 새 사례를 추가해야하는 경우, 여러 곳에서 복사 붙여 넣기 대신 다른 매개 변수를 하나의 함수에 전달할 수 있습니다.

그러나 DRY는 종종 영리한 프로그래머들에 의해 극단적으로 진행됩니다. 때로는 자신을 반복하지 않으려면 추상화를 만들어야하므로 팀원이이를 따르지 못하도록하십시오. 때로는 두 가지의 구조가 모호하게 유사하지만 충분히 다릅니다. doStuff1-4가 자신을 반복하지 않도록 리팩토링하면 부 자연스러운 코드를 작성해야하거나 영리한 코딩 백 플립 (back backp)이 발생하여 팀이 눈에 띄게 될 수 있으므로 반복해야합니다. 나는 부 자연스럽게 여러 번 반복하지 않기 위해 뒤로 구부러져 최종 제품을 후회했습니다.

따라서 기본적으로 "아,이 코드는 꽤 비슷합니다. 아마도 반복하지 않기 위해 리팩터링해야합니다"라고 생각하지 마십시오. "이 코드베이스 재사용 공통 요소를 만들기 위해 리팩토링을 수행하면 코드를 보다 유지 관리 가능하게 하거나 덜 유지 관리 가능하게 합니까?" 그런 다음 유지 관리하기 쉬운 것을 선택하십시오.


SRP가 주어지고 일반적으로 작고 유연한 클래스를 얻으려고하면 그 이유 때문에 코드를 분석하고 일반 유형 (유형과 동일하다고 말한)을 사용하는 동작 비트를 분리하는 것이 좋습니다. 소규모 수업. 그런 다음 이러한 클래스 중 일부가 실제로는 완전히 동일하다는 사실 을 알 수 있으며 추가하려는 경우 툴킷을 작성할 수 있습니다 Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax.


32
TL; DR-DRY는 끝까지의 수단입니다. 수단이 아닌 끝에 집중하십시오. 레고 맨을 두 번 공표 할 수 있다면 그렇게 할 것입니다.

한 가지 중요한 참고 :이 경우 어떻게 자신을 반복, 항상 주석의 경우 반복되는 코드 변경을 방문해야하는 다른 모든 장소를 언급. 그것은 비 동기화의 가능성을 감소시킬뿐만 아니라, 반복이 당신을 유발하는 유지 보수의 고통의 지표로 작용합니다.
Xion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.