SO 에 대한 이 질문 에서는 OP가 생각하는 기능 부러움 코드를 수정하는 방법에 대해 설명합니다 . 이 멋진 문구가 인용 된 또 다른 예는 최근 프로그래머가 여기 에 주어진 대답에 있습니다 . 나는 그 대답에 대한 정보를 묻는 의견 을 들었지만 Q & A를 따르는 프로그래머가 feature-envy 라는 용어의 의미를 이해하는 것이 일반적으로 도움이 될 것이라고 생각했습니다 . 적절하다고 생각되면 추가 태그를 자유롭게 편집하십시오.
SO 에 대한 이 질문 에서는 OP가 생각하는 기능 부러움 코드를 수정하는 방법에 대해 설명합니다 . 이 멋진 문구가 인용 된 또 다른 예는 최근 프로그래머가 여기 에 주어진 대답에 있습니다 . 나는 그 대답에 대한 정보를 묻는 의견 을 들었지만 Q & A를 따르는 프로그래머가 feature-envy 라는 용어의 의미를 이해하는 것이 일반적으로 도움이 될 것이라고 생각했습니다 . 적절하다고 생각되면 추가 태그를 자유롭게 편집하십시오.
답변:
기능 부러움 은 객체 자체에 계산을 요구하지 않고 일종의 계산을 수행하거나 결정을하기 위해 한 객체가 다른 객체의 필드에 도달하는 상황을 설명하는 데 사용되는 용어입니다.
사소한 예로서 직사각형을 나타내는 클래스를 생각해보십시오. 사각형의 사용자는 해당 영역을 알아야합니다. 프로그래머는 필드 width
와 height
필드를 노출 한 다음 Rectangle
클래스 외부에서 계산을 수행 할 수 있습니다. 또는 및 필드를 비공개로 Rectangle
유지하고 방법을 제공 할 수 있습니다. 이것은 아마도 더 나은 접근법 일 것입니다.width
height
getArea
첫 번째 상황의 문제점과 그것이 코드 냄새로 간주되는 이유는 캡슐화가 깨지기 때문입니다.
일반적으로 다른 클래스의 필드를 광범위하게 사용하여 모든 종류의 논리 또는 계산을 수행 할 때마다 해당 논리를 클래스 자체의 메서드로 이동하는 것이 좋습니다.
클래스 / 구조체가 데이터의 컨테이너 인 경우 다른 클래스 / 구조체 메소드를 광범위하게 사용하는 것이 가능한 상황이있을 수 있습니다. 일반적으로 외부 컨텍스트없이이 데이터로 수행 할 수있는 작업이 조금 있습니다.
이러한 클래스는 여전히 일부 내부 논리를 보유 할 수 있지만 컨테이너로 사용되는 경우가 더 많습니다.
class YourUid {
public:
YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
int id_in_workplace;
int id_in_living_place;
private:
int id_in_FBI_database_;
const DB* FBI_database_;
};
@jhewlett은 그의 답변에서 다른 기사를 광범위하게 사용해서는 안된다는 것을 증명하기 위해이 기사를 언급하지만 다른 예제가 내 예제를 옹호하는 상황을 냄새 맡고 있습니다.
긴 매개 변수 목록. 주어진 방법에 필요한 매개 변수의 수를 제한하거나 개체를 사용하여 매개 변수를 결합하십시오.