데이터 클램프

Data clump

객체 지향 프로그래밍에서 "데이터 클램프"는 프로그램의 다양한 부분을 통해 함께 (클램프로) 전달되는 변수 그룹에 붙여진 이름입니다.데이터 뭉치는 다른 코드 냄새와 마찬가지로 프로그램 설계 또는 구현에 더 심각한 문제가 있음을 나타낼 수 있습니다.일반적으로 데이터 클램프를 구성하는 변수 그룹은 밀접하게 관련되어 있거나 상호의존적이며 그 결과 그룹 내에서 함께 사용되는 경우가 많습니다.데이터 클램프는 클래스 레벨의 코드 냄새의 특정 종류로도 알려져 있으며, 소스 코드가 제대로 작성되지 않은 증상일 수 있습니다.

데이터 그룹 리팩터링

일반적으로 데이터 덩어리는 리팩터링해야 합니다.데이터 클램의 존재는 일반적으로 소프트웨어 설계가 불량하다는 것을 나타냅니다.이는 다양한 변수를 공식적으로 단일 개체로 그룹화하고 다수의 원시 요소가 아닌 이 개체만 전달하는 것이 더 적절하기 때문입니다.개체를 사용하여 데이터 클램프를 교체하면 전체 코드 크기를 줄일 수 있을 뿐만 아니라 프로그램 코드가 더 잘 정리되고 읽기 쉬우며 디버깅이 쉬워집니다.

데이터 풀을 제거하는 프로세스에서는 다른 유형의 코드 냄새(데이터만 저장하고 실제로 데이터를 조작하는 메서드가 없는 클래스)가 생성될 위험이 있습니다.다만, 클래스의 작성에 의해서,[1] 프로그래머는 여기에 포함되는 기능도 확인할 수 있게 됩니다.[2]

객체 지향 프로그래밍에서 객체의 목적은 관련 데이터(필드)와 이 [3]데이터에 대해 수행할 수 있는 연산(메서드)을 모두 캡슐화하는 것입니다.필드를 함께 실제 개체로 그룹화하지 못하면 관련 작업의 연결이 끊어질 수 있습니다.

파라미터/변수 리스트가 길다고 해서 반드시 데이터 클램프를 나타내는 것은 아닙니다.다양한 값이 밀접하고 논리적으로 관련되어 있는 경우에만 이들 값이 데이터 클램프로 간주됩니다.이러한 경우는 드물지만, 하나의 개체로 완전히 변환할 수 없었던 완전히 관련되지 않은 6개 이상의 파라미터를 메서드가 합법적으로 취할 수 있습니다.그러나 이는 이 방법이 너무 많은 것을 시도하고 있으며, 여러 가지 방법으로 분할하는 것이 낫다는 것을 나타냅니다.이 방법들은 각각 전체 책임의 작은 부분을 담당합니다.이는 코드의 품질을 향상시키기 위해 리팩터링을 사용하는 또 다른 기회라고 할 수 있습니다.

데이터 뭉침을 제거하기 위한 리팩터링은 수동으로 수행할 필요가 없습니다.현대의 많은 풀기능 IDE에는 이 리팩터링을 자동 또는 거의 실행할 수 있는 기능(종종 "Extract Class"라고 불립니다)이 있습니다.이를 통해 비용을 절감하고 리팩터링의 신뢰성을 향상할 수 있으므로 그렇지 않으면 꺼리는 개발자가 쉽게 리팩터링을 수행할 수 있습니다.

당연히 모든 객체 지향 프로그래밍 언어로 데이터 뭉치가 존재할 수 있습니다.다음 예는 단순히 범위와 구문이 단순하다는 이유로 선택되었습니다.

인 C#

리팩터 전

일반의 무효 애드코드(인트 x, 인트 y, 인트 z) { /* … */ } 

포스트 리팩터

일반의 무효 애드코드(좌표 코디자이너스) { /* … */ }  일반의 학급 좌표 {     일반의 좌표(인트 x, 인트 y, 인트 z)     {         X = x;         Y = y;         Z = z;     }      일반의 인트 X { 얻다; }     일반의 인트 Y { 얻다; }     일반의 인트 Z { 얻다; } } 

자바어

일반의 정적인 무효 주된(스트링 args[]) {     스트링 이름 = args[0];     스트링  = args[1];     정수 나이 = 신규 정수(args[2]);     스트링 성별 = args[3];     스트링 직종. = args[4];     스트링 도시 = args[5];     환영합니다 신기능(이름, , 나이, 성별, 직종., 도시); }  일반의 정적인 무효 환영합니다 신기능(스트링 이름, 스트링 , 정수 나이, 스트링 성별, 스트링 직종., 스트링 도시) {     시스템..나가..인쇄물("%s %s를 환영합니다.%s에서 %d년 된 %s를 a%s\n으로 작업합니다.\ n,이름, , 나이, 성별, 도시, 직종.); } 

위의 예에서는 모든 변수를 단일 "개인" 개체로 캡슐화할 수 있으며, 이 개체는 단독으로 전달할 수 있습니다.또한 프로그래머는 다음 사항을 인식할 수 있습니다.welcomeNew이 방법을 사용하는 것이 보다 적절할 것입니다.Person해당 개인과 관련된 기타 관련 작업을 수행할 수 있습니다.예를 들어 다음과 같이 코드를 리팩터링하고 확장할 수 있습니다.

일반의 정적인 무효 주된(스트링 args[]) {     스트링 이름 = args[0];     스트링  = args[1];     정수 나이 = 신규 정수(args[2]);     스트링 성별 = args[3];     스트링 직종. = args[4];     스트링 도시 = args[5];      사람인 조. = 신규 사람인(이름, , 나이, 성별, 직종., 도시);     조..환영합니다 신기능();     조..일하다.(); }  사적인 정적인 학급 사람인 {     /* 모든 파라미터가 새로운 [Person]클래스로 이동되어 적절하게 그룹화 및 캡슐화 되었습니다.     스트링 이름;     스트링 ;     정수 나이;     스트링 성별;     스트링 직종.;     스트링 도시;          일반의 사람인(스트링 이름, 스트링 , 정수 나이, 스트링 성별, 스트링 직종., 스트링 도시) {         이것..이름 = 이름;         이것.. = ;         이것..나이 = 나이;         이것..성별 = 성별;         이것..직종. = 직종.;         이것..도시 = 도시;     }          /* 데이터와 관련된 기존 기능을 새로운 클래스에 통합하여 범위 충돌 위험을 줄일 수 있습니다. */     일반의 무효 환영합니다 신기능() {         시스템..나가..인쇄물("%s %s를 환영합니다.%s에서 %d년 된 %s를 a%s\n으로 작업합니다.\ n, 이름, , 나이, 성별, 도시, 직종.);     }     /* 또한 새로운 클래스는 새로운 기능을 추가할 수 있는 기회가 될 수 있습니다.* /     일반의 무효 일하다.() {         시스템..나가..인쇄물(%s의 %s에서 열심히 작업하고 있는 %s입니다., 이름, 직종., 도시);     } } 

이로 인해 코드 길이가 늘어났지만, 이제 단일 사용자는 다양한 (관련되지 않은 것처럼 보이는) 필드가 아닌 하나의 개체로 쉽게 전달될 수 있습니다.또한 관련 메서드를 클래스로 이동하여 개별 인스턴스에서 쉽게 작동할 수 있도록 할 수 있습니다.이러한 메서드는 더 이상 지루한 매개 변수 목록을 전달할 필요가 없습니다. 대신 개체 인스턴스 [4]자체에 인스턴스 변수로 저장되기 때문입니다.

레퍼런스

  1. ^ Fowler, Martin. "DataClump". Retrieved 10 February 2017.
  2. ^ "Data Clumps". SourceMaking. Retrieved 10 February 2017.
  3. ^ Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  4. ^ "What's the difference between a class variable and an instance variable? - Programmer and Software Interview Questions and Answers". Programmer and Software Interview Questions and Answers. Retrieved 2017-02-20.