2017-01-30 2 views
1

현재 IETracking 이벤트를 처리하는 라이브러리를 작성 중입니다. 필자는 라이브러리의 전체 디자인을 여러 번 수정하여 전체 라이브러리에 전반적인 사용법 테마를 부여하면서 내가 좋아하는 디자인을 마침내 제시했습니다.코드 중복과 코드베이스 초과 생성

이 방법으로 라이브러리를 구현했지만 곧 두 개의 클래스에서 코드를 복제해야한다는 것을 알았습니다. 나는이 수업이 기본적으로 똑같은 일을했기 때문에 많은 생각을하지는 않았지만, 다양한 종류의 아이 트렉킹 이벤트에 대해서.

이제 릴리스 버전의 버전에 가까워졌습니다. 일부 클래스에는 중복 코드가 80 % 이상 포함되어 있기 때문에 제네릭을 사용하여 일반화 할 수있는 몇 가지 클래스가 있다는 것을 알고 있습니다.

하지만 일반적인 일 현재 코드베이스를 리팩토링 할 때 내가 직면 할 것으로보고하고 몇 가지 문제가있다 :

  • 나는 유도의 모든 감각을 만들 수있는 인터페이스 메소드를 추가해야합니다은 클래스에 대한 설명은 아니지만 대부분의 스펙에는 포함되지 않았습니다.
  • 사용자에게 도움이되지 않는 매우 일반적인 문서로 특정 유형 (모범 사례, 공통점 등)에 대한 대부분의 문서를 대체해야합니다.
  • 라이브러리의 절반은 많이 중첩 된 제네릭을 사용하지만 나머지는 r half는 기본적으로 똑같은 상태를 유지하면서 내가 생각했던 가장 중요한 디자인의 긍정적 인 학습/사용 효과를 줄였습니다.
  • 라이브러리의 일반적인 부분은 거의 모든 용도와 함께 사용할 수 있지만 실제로는 눈 감아주기 목적으로 유용하지는 않습니다
  • 당신은 어떻게 생각하십니까 현재

유사한 상태로 코드베이스를 되돌릴 필요

  • 일반 디자인을 깰 수있는 라이브러리에 대한 요구 사항의 작은 변화는, 정말 나쁜 것입니다 코드를 제거하면 코드 복제가 위의 모든 것을 의미합니까?

  • +0

    현재 코드베이스 중 몇 퍼센트가 일반으로 리팩토링 될 수있는 지점과 중복되는 것으로 간주 될 것입니까? 단지 몇 퍼센트 만이라도 나중에 어쨌든 전문화되어야한다고 생각한다면 나는 그대로있는 것으로 남겨 두겠다. –

    +0

    중복 된 부분이있는 4 개의 클래스가 있습니다. 이 클래스는 관련있는 공통 인터페이스로 추상화 할 수없는 여러 유형의 eytracking 이벤트를 처리합니다. 그들이 공통적으로 가지고있는 유일한 점은 연대순으로 주문할 수 있다는 것입니다.이 클래스는 이미 일반적인 비교 가능한 인터페이스와 컬렉션 클래스를 포함하고 있습니다. Percentage-wise 나는 어쩌면 30 %라고 말할 것입니다. –

    +0

    코드베이스가 실제로 그렇게 크지는 않다는 것을 알았습니다. 중소 규모의 클래스 4 개가 더 나은 메트릭이 될 수 있습니다. –

    답변

    2

    "중복이 얼마나 나쁜가"라는 질문에 답하고 비용 편익을 조사하려면 코드 복제 비용을 먼저 이해하는 것이 가장 좋습니다.

    왜 중복이

    1. 코드 중복은 여러 가지 이유로 나쁜 나쁜하지만 maintenance에 대해 만드는 어려움에 특히 때문이다. 중복 된 코드 조각을 여러 장소에서 수정하거나 업데이트하는 것은 어렵고 시간이 많이 소요될뿐만 아니라 물건을 부러 뜨리는 경향이 있습니다. 이 문제는 더 많은 repos 또는 microservices를 사용할 때 증가합니다.

    2. 많은 "중복"은 실제로 다시 구현됩니다. 이것은 두 가지 이유에서 나쁘다 : (a) 바퀴 비용 시간을 다시 발명한다. (b) 코드를 수정하면 유지 보수가 복잡해지는 경향이있다.

    중복 문맥

    대 당신은 정확하게 한 번 컨텍스트 관련 구성 요소를 설계 대 격리 된 구성 요소에서 설계 코드 사이의 긴장에 대해 설명합니다.

    Addy Osmani의 these 디자인 원칙을 읽어 주셔서 감사합니다. 일반적으로 가능한 한 많은 코드를 재사용 가능한 구성 요소로 설계하는 것이 좋습니다.이 구성 요소는 일반적으로 문서화되고 테스트 된 것입니다. 구성 요소가 다른 프로젝트 나 팀 구성원과 관련이 없다고 생각되면 if 다른 장소에서 사용하거나 사용하기 시작했습니다. 그렇지 않은 경우이 구성 요소를 재사용 할 수 있는지 여부를 결정해야합니다.

    의존성 관리, API 작성 등은 재사용 가능한 구성 요소를 관리하는 방법에 따라 달라질 수 있습니다. 모든 패키지에 대해 단일 유틸리티 라이브러리를 만들거나 여러 마이크로 패키지를 게시 할 수 있습니다.

    당신이 언급 한 몇 가지를 포함하여 여러 가지 이유로 내 의견에는 두 가지 또는 그렇지 않은 것이 있습니다.

    https://github.com/teambit/bit (예 : https://bitsrc.io/bit/utils#array) 우리는 "비트"라는 오픈 소스 구성 요소 관리 시스템을 만들어 설계를 도와 신속하게 재사용 가능한 구성 요소를 추출하여 엔드 - 투 - 엔드 (버전, 의존성, CI 등 ..) 관리하려면

    코드베이스의 약 30 %를 재사용 가능한 구성 요소로 바꾸기 위해 컨텍스트에서 구성 요소를 리팩토링했지만 장기적으로 효과가 있음을 알았습니다. 다른 사람들은 코드의 55-60 %를 제거하고 재사용 가능한 구성 요소로 바뀌 었다고 말했습니다. 무료 비트 커뮤니티 허브에서 테스트를 마친 재사용 가능한 구성 요소 중 H ere is also a nice example.

    직접 시도해 볼 수 있습니다 (필요한 경우 도움이 필요함).

    +1

    좋은 답변입니다. 내 원래의 질문은 약 한 달 전에 게시되었으며 코드 중복을 제거하고보다 일반적인 디자인으로 옮겼습니다. 제 생각에는 코드베이스가 이해하기가 어려워졌지만, 그 이유는 일반적인 코드가 특정 코드보다 읽기가 더 어렵 기 때문입니다. 내 API는 그다지 변하지 않았으므로 현재 확장하기가 훨씬 쉽습니다. 중복 된 코드가 제거되어 일부 기능을 아주 빠르게 구현할 수도있었습니다. 간단히 말해서, 그것은 가치가 있었지만 많은 반복 설계 및 테스트가 필요했습니다. –

    +0

    기쁜 소식을 듣고 다행스럽게 늦어서 죄송합니다. 그것은 확실히 가치가있다! – Yoni