저는 최근 소프트웨어 개발 회사에 인턴으로 입사 한 학생입니다. 대학으로 돌아와서 제 교수 중 한 명이 “낮은 결합과 높은 응집력”을 달성하기 위해 노력해야한다고 말했습니다.

저 결합의 의미를 이해합니다. 이는 별도의 구성 요소의 코드를 별도로 유지하여 한 곳에서 변경해도 다른 곳에서 코드가 깨지지 않도록하는 것을 의미합니다.

하지만 높은 응집력이란 의미입니다. 동일한 구성 요소의 다양한 조각을 서로 잘 통합하는 것을 의미한다면 그것이 어떻게 유리 해지는 지 이해할 수 없습니다.

높은 응집력이란 무엇입니까? 이점을 이해하기위한 예를 설명 할 수 있습니까?

댓글

  • 의 중복 가능성이 있습니까? 응집력과 결합을위한 메트릭스?
  • 위키피디아 기사가 질문에 충분히 답하지 않습니까? en.wikipedia.org/wiki/Cohesion_ (computer_science)
  • msdn.microsoft.com/en-us/magazine/cc947917.aspx
  • @EoinCarroll : 안타깝게도 현재 위키 백과 기사는 좋은 정보를 제공하지 않습니다. 구체적인 예 . 이론은 훌륭하지만 ' ' 낮은 응집력을 둘러싼 실수를 저질렀을 때까지 실제로 고착되지 않습니다. 높은 응집력은 왜 중요한지, 그리고 그것을 달성하는 데 어떻게 가 필요한지 완전히 이해하기 위해 몇 년 동안 프로그래밍을해야하는 주제 중 하나입니다.
  • 읽기 전까지는 응집력을 전혀 이해하지 못했습니다. 깨끗한 코드. 당신도 그래야합니다.

답변

OO의 관점에서 응집력을 보는 한 가지 방법은 클래스가 개인 속성을 사용하고 있습니다. 이 답변 에서 gnat가 지적한대로 LCOM4 (결합 방법 부족)와 같은 측정 항목을 사용하여 리팩토링 할 수있는 클래스를 식별 할 수 있습니다. 메서드 또는 클래스를 더 응집력있게 리팩터링하려는 이유는 다른 사용자가 코드를 더 쉽게 사용할 수 있도록하기 때문입니다. . 날 믿어; 대부분의 기술 리드와 유지 보수 프로그래머는 이러한 문제를 해결할 때 당신을 좋아할 것입니다.

소나 와 같은 도구를 빌드 프로세스에서 사용할 수 있습니다. 코드베이스에서 낮은 응집력을 식별합니다. “응집성”에서 메소드가 낮은 경우를 생각할 수있는 몇 가지 매우 일반적인 경우가 있습니다.

사례 1 : 메소드가 클래스와 전혀 관련이 없습니다 h2>

다음 예를 고려하세요.

 public class Food { private int _foodValue = 10; public void Eat() { _foodValue -= 1; } public void Replenish() { _foodValue += 1; } public void Discharge() { Console.WriteLine("Nnngghhh!"); } }  

방법 중 하나 , Discharge()는 “수업”의 비공개 멤버를 건드리지 않기 때문에 응집력이 부족합니다. 이 경우 개인 회원은 한 명뿐입니다 : _foodValue. “클래스 내부에 아무 작업도 수행하지 않으면 실제로 거기에 속합니까?”메서드는 이름이 FoodDischarger 인 다른 클래스로 이동할 수 있습니다.

 // Non-cohesive function extracted to another class, which can // be potentially reused in other contexts public FoodDischarger { public void Discharge() { Console.WriteLine("Nnngghhh!"); } }  

함수는 일류 객체이기 때문에 자바 스크립트로 수행합니다. 무료 함수일 수 있습니다.

 function Food() { this._foodValue = 10; } Food.prototype.eat = function() { this._foodValue -= 1; }; Food.prototype.replenish = function() { this._foodValue += 1; }; // This Food.prototype.discharge = function() { console.log("Nnngghhh!"); }; // can easily be refactored to: var discharge = function() { console.log("Nnngghhh!"); }; // making it easily reusable without creating a class  

사례 2 : 유틸리티 클래스

이것은 실제로 응집력을 깨는 일반적인 경우입니다. 모든 사람이 유틸리티 클래스를 좋아합니다 . 그러나 이는 일반적으로 디자인 결함을 나타내며 대부분의 경우 코드베이스를 유지 관리하기가 더 까다로워집니다 (유틸리티 클래스와 관련된 높은 종속성 때문에). 다음 클래스를 고려하십시오.

 public class Food { public int FoodValue { get; set; } } public static class FoodHelper { public static void EatFood(Food food) { food.FoodValue -= 1; } public static void ReplenishFood(Food food) { food.FoodValue += 1; } }  

여기에서 유틸리티 클래스에 필요한 Food 클래스의 속성에 액세스합니다. 이 경우 유틸리티 클래스의 메서드는 작업을 수행하기 위해 외부 리소스가 필요하기 때문에 전혀 응집력이 없습니다.이 경우 자체적으로 작업하는 클래스에 메서드를 사용하는 것이 더 낫지 않을까요? 첫 번째 경우처럼)?

사례 2b : 유틸리티 클래스의 숨겨진 개체

실현되지 않은 도메인 개체가있는 유틸리티 클래스의 또 다른 경우가 있습니다. 프로그래머는 문자열 조작을 프로그래밍 할 때 유틸리티 클래스를 작성해야합니다.다음은 몇 가지 일반적인 문자열 표현을 검증하는 것과 같습니다.

 public static class StringUtils { public static bool ValidateZipCode(string zipcode) { // validation logic } public static bool ValidatePhoneNumber(string phoneNumber) { // validation logic } }  

What 대부분의 사람들은 우편 번호, 전화 번호 또는 기타 문자열 표현이 객체 자체가 될 수 있다는 사실을 인식하지 못합니다.

 public class ZipCode { private string _zipCode; public bool Validates() { // validation logic for _zipCode } } public class PhoneNumber { private string _phoneNumber; public bool Validates() { // validation logic for _phoneNumber } }  

문자열을 직접 처리해서는 안된다는 개념은 @codemonkeyism의이 블로그 게시물 에 자세히 설명되어 있습니다. 그러나 프로그래머가 유틸리티 클래스에 로직을 넣어 문자열을 사용하는 방식 때문에 응집력과 밀접한 관련이 있습니다.

코멘트

답변

높은 응집력이란 콘텐츠, 기능, 을 공유하는 부분을 결합하거나 융합하기 위해 유사하거나 관련된 것들을 함께 유지하는 것을 의미합니다. 이유 또는 목표 . 즉, 낮은 응집력은 예를 들어 “ 포인트 “가 아닌 여러 목적을 제공하는 함수 / 클래스 / 코드 엔티티를 의미 할 수 있습니다. 전달하는 아이디어 중 하나는 한 가지를 잘 수행 하는 것입니다. 다른 것들은 당신이 유사한 기능을 여러 곳에서 복제하지 않는다는 명백한 사실을 포함 할 수 있습니다. 이것은 또한 코드베이스의 지역성 을 향상시킵니다. 특정 종류의 물건은 특정 장소 (파일, 클래스, 세트)에서 발견됩니다. …).

예를 들어, 두 가지 또는 세 가지 목적을 제공하는 클래스를 고려하십시오. 리소스 (예 : 파일)를로드 / 저장 한 다음 분석 및 표시 이러한 클래스는 전혀 관련이없는 두 개의 개별 작업 (파일 I / O, 분석 및 표시)을 적어도 관리하기 때문에 응집력이 낮습니다 . 높은 응집력 설계는 리소스를로드 및 저장하고, 분석 한 다음 표시하기 위해 고유 한 클래스를 사용할 수 있습니다.

반면, 낮은 결합은 고유 한 것을 분리하여 서로 상호 작용하도록하는 것을 목표로합니다. 복잡성을 줄이고 설계를 단순화합니다.

답변

이것은 개체의 일부가 개체의 기능과 밀접한 관련이 있음을 의미합니다. 이는 기능 또는 책임 측면에서 객체 내에 낭비가 거의 또는 전혀 없음을 의미합니다. 그러면 해당 개체의 용도에 대한 이해도를 높일 수 있습니다.

댓글

  • 사용하지 않음 ' 물체보다 더 높은 수준에도 적용되지 않습니까? 예 : 네임 스페이스의 작업과 관련된 개체 / 함수 그룹화?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다