2012-05-25 3 views
1

A, B 및 C의 3 가지 클래스가 있다고 가정 해 보겠습니다. 각 클래스에는 다른 클래스가 있습니다. 이처럼 : 편집 :POJO 클래스에서 코드 중복 방지

+-----+ +-----+ +-----+ 
| A | | B | | C | 
------- ------- ------- 
| X x | | X x | | Z z | 
| Z z | | Y Y | | Y y | 
------- ------- ------- 

게터와 세터가 중복됩니다. 그래서, 나쁜 습관이고 이것을 피해야합니까? 아니면 코드 분석기 (예 : PMB)에서 중복 코드로 사용해서는 안됩니까? 나는 "전략 패턴"에 대한 생각,하지만 난 그냥 getter 및 setter를 들어, 너무 어쩌면 생각

...

편집 : 내 첫 번째 질문은 어쩌면 정말 분명하지 않다. 우리가 공통 속성과 똑같은 getter/setter를 가진 두 개의 클래스 (링크되지 않은)를 가지고 있다면 문제가됩니다. Sonar 또는 PMD는 이러한 방법을 중복 된 코드로 간주해야합니까? 그리고 그렇지 않다면 수정 될 것인가?

+1

이 클래스들은 매우 밀접하게 결합 된 것처럼 보입니다. 왜 그랬어? –

+0

코드 중복이 잘못되었습니다. 왜 A 클래스에서 B 클래스를 참조하고 그런 식으로 메소드를 사용할 수 없습니까? – Limey

+3

A.getB()는 C.getB()와 같은 의미 일 필요는 없습니다. 중복되지 않습니다. 즉, 나는 그것을 단순화하는 데 도움이되는 @ @ Getter 및 @ Setter 주석을 보았습니다 (어떤 프레임 워크/라이브러리인지는 기억하지 못합니다). – SJuan76

답변

2

이미 언급했듯이 먼저 복제가 필요한지 여부를 먼저 고려하십시오. 어쩌면 주변을 지나가는 공통된 물체에 있어야합니다. 아마 그들은 필요하지 않습니다.

이제 실제로 필요하다고 가정합니다. 물론 그럴 수 있습니다. PMD의 복사 붙여 넣기 감지기를 사용하면 복제본으로 간주되기 전에 최소 줄 수를 설정할 수 있습니다. getter/setter는 각각 세 줄 (또는 두 가지 모두 6 개)이기 때문에 바로 위의 임계 값을 설정할 수 있습니다.

1

이것은 순환 참조이며 일반적으로 나쁜 습관입니다. 이 일을하지 않도록 재 설계 할 수 있습니까?

+0

네, 맞습니다. 제 실제적인 경우 순환 참조가 없습니다. 더 좋은 예를보기 위해 내 글을 편집 할 것입니다. – Pith

0

세터와 게터는 자동으로 생성 된 코드이므로 절대 코드 중복이 없습니다 (수동으로 작성하는 사람)?

데이터 중복이 있다면 고려해야 할 유일한 문제는 무엇입니까? 클래스 'A'와 'C'의 필드 'b'는 다른 의미를 가질 수 있기 때문에 귀하의 예를 들어 말할 방법이 없습니다.

'클라이언트'및 '건물'의 '주소'필드와 같습니다. 그것은 다른 것을 의미합니다.

+1

자바에서는 getters와 setter가 자동으로 생성되지 않습니다. C#을 생각하고 있어야합니다. –

+0

@Matt Ball : Java Devs는 getclipse와 setter를 생성 할 수 있도록 java dev를위한 연습을하고 get/setters의 필드 이름도 반영합니다. – Synox

1

중복 코드는 항상 잘못된 생각이 아니며, 어떤 경우에는 일부 복제본을 만드는 것이 불가피합니다. setter 및 getter가 생성되지만 for 및 while 루프도 생성되므로이 코드는 수동으로 유지 관리 할 때 자동으로 제외되지 않아야합니다. 아무런 고려도없이 코드 중복을 적극적으로 제거하는 것은 좋은 생각이 아닙니다. 기본적으로 모든 복제가 나쁜 것은 아니며 항상 중복 제거에 도움이되지는 않습니다. 비용 절감은 소위 복제 관리입니다. 즉 기존 복제본을 추적하고 실제로 문제를 일으키는 복제본을 제거합니다. 이를 위해서는 CloneManager 모듈을 통합 한 FrontEndART의 QualityGate과 같은 정교한 도구가 필요합니다. 복제본을 나열 할뿐만 아니라 버전을 통해 수명을 추적하고 더 자세히 볼 수있는 복제본을 알려줍니다. online demo version of QualityGate에서이 도구를 확인할 수 있습니다.