도우미 란 무엇입니까? 디자인 패턴입니까? 알고리즘입니까?


40

어쩌면 약간의 혀가 있지만 Google을 통해 어디서나이 답변을 찾을 수 없으므로 Software Engineering이 답을 얻도록하십시오.

도우미 란 무엇입니까?

의미가 깊고 의미있는 것처럼 모든 곳에서 사용되는 이름 (모듈 이름, 클래스 이름, 메서드 이름)을 보았지만 컴퓨터 과학의 맥락에서 (도는 없지만) 어떤 곳에서도 설명이나 정의를 보지 못했습니다!

디자인 패턴입니까? 알고리즘입니까? 한 번 모듈과 클래스가 모두 무언가 무언가 도우미라고 불리는 프로그램에서 일했으며 ( 뭔가 도 상당히 일반적인 곳 이었습니다.) 나에게 의미가있는 것으로 즉시 이름을 바꾸었지만 여기에 뭔가 빠진 것 같습니다!


9
도우미는 무엇을 부르는지 모르지만 친구 중 하나를 알고있을 때 무엇을 부르는 것입니다. Aaron 대신 'Zack의 친구'라고 부르는 것과 같습니다. 더블 플러스는 좋지 않습니다.
david.pfx

도우미는 동형에 이르는 모든 개인 구성원입니다.
Thomas Eding

@ThomasEding 3 년 후 다시 오게되어 죄송하지만 인터페이스를 포함하여 "helper"라는 "공개"멤버가 많이 있습니다. 나는 더 많은 코드 냄새에 대한 감각을 분명히 줄 수 있기 때문에 귀하의 정의에 대한 출처를 원합니다 (높을수록 좋습니다).
Aaron Hall

답변:


63

헬퍼 클래스는 일반적으로 사용되는 기타 작업을 코더가 식별하고 부 자연스러운 그룹으로 묶어 재사용 할 수 있도록 시도한 덜 알려진 코드 냄새입니다. 그 후, 연속 개발자들이 프로젝트에 참여하여 헬퍼 클래스가 존재한다는 사실을 깨닫지 못했으며 결과적으로 동일한 공통 조작을 다시 작성하거나 더 많은 헬퍼 클래스를 작성했습니다.

그러나 진지하게도 도우미 클래스의 주요 문제는 일반적으로 특정 클래스에서 작동하는 작업이라는 것입니다. 이는 명백히 Feature Envy 의 급성 사례로 고통 받고 있음을 의미합니다 . 이러한 동작을 데이터와 함께 패키지화하지 못하면 개발자가 내 경험상 자주 찾지 못하는 이유가 있습니다.

이 외에도 SomethingSomethingHelper는 이미 끔찍한 이름입니다. 그것은 설명 적이 지 않으며 클래스가 어떤 종류의 작업을 수행하는지 실제로 도움이되지 않습니다 (도움이됩니까?). 또한 Helper 클래스에 속하는지 여부에 관계없이 새로운 동작을 추가 할 때 명확하지 않습니다. 논리적으로 함께 그룹화되는 관련 동작 행을 따라 이러한 클래스를 분리 한 다음 새 클래스의 이름을 변경하여 수행 한 작업을 반영합니다.


9
SomethingSomethingHelper클래스의 실제 이름이 아님을 확신하십시오 . 코드 냄새인지 여부 는 도우미 클래스가 코드 냄새가 아니기 때문에 도우미 클래스의 특성에 따라 다릅니다 Math.
Robert Harvey

10
@RobertHarvey - Enh에서은, 내가 본 것들의 대부분은 지명되었다 SomethingSomethingHelper. 지옥, 나는 지금 네임 스페이스 HelperMethods에서 명명 된 클래스를보고있다 <company>.Helpers. 나에게 Helper수업은와 같은 버킷에 있습니다 *Manager.
Telastyn

8
@Telastyn : 아마도 경험이 될 것입니다. 나는 현재 프로젝트에서 헬퍼 클래스를 살펴 보았고 (여러 개가 있음) 모두 의미있는 이름을 가지고 있습니다. 접미사가 붙은 것은 단 하나 뿐이며 Helper같은 이름을 가진 .NET Framework의 클래스에서 명확하게 구분해야한다고 생각합니다. 의미있는 *Helper것이면 받아 들일 것 *입니다. HelperMethods상상의 실패 일뿐입니다. 적어도 특정한 개념의 버킷이 있어야합니다.
Robert Harvey

4
@RobertHarvey-당신 말이 맞을 것입니다. 현대 언어를 사용한 나의 경력은 모두 열차 난파선을 청소하고 있습니다.
Telastyn

1
"도우미 함수"라고하는 이들 중 일부가 실제로 유용하고 좋은 패턴입니다. 예를 들어, 함수 내에서 반복해야 할 일반적인 행 집합-표시되는 위치의 예 do..while는 언어가 지원하지 않는 Python 의 루프 가 필요한 경우입니다 ( 두 번째 예 참조 ). 또 다른 경우는 if / elif /.../ else 구조이지만 상단과 하단에서 사례를 반복해야합니다. 가능하다면 그것들은 그 기능에 국한되어야하며 일반적으로 실제로는 "도우미"라고 불리지 않습니다.
이즈 카타

5

도우미는 외부 구성 요소를 보완하는 한 무해한 추가 클래스 또는 메서드입니다. 반대로, 권한이 있으면 코드가 권한에서 제외 되었기 때문에 잘못된 디자인을 나타냅니다.

여기에 무해한 도우미의 예가 있습니다. 나는 FindRep선행 0의 수를 세는 메소드를 사용합니다 .

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

도우미 방법은 매우 간단하지만 복사하여 붙여 넣기가 매우 불편하며 프레임 워크는 솔루션을 제공하지 않습니다.

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

그리고 다음은 나쁜 도우미의 예입니다.

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}

-1

우리 회사는 각 객체에 두 개의 클래스가있는 Base 클래스 / 도우미 클래스 방법을 사용했습니다. 모든 클래스 속성과 정의를 포함하는 Person 클래스와 Person 클래스를 조작 한 모든 메서드, SQL 문 및 논리를 포함하는 PersonHelper 클래스가 있습니다. 모든 응용 프로그램이 SQL 문을 사용하여 데이터를 조작하고 필요에 따라 SQL 문을 쉽게 찾아서 수정할 수 있기 때문에 이것은 우리에게 잘 작동했습니다.

우리는 그 후 계속해서 Person / Base 클래스에 모든 것을 넣었습니다. 우리는 프로젝트에서 더 적은 파일을 원했기 때문에 헬퍼 명명 규칙 사용을 종료했습니다. 또한 일부 클래스 이름의 길이가 제어 할 수 없었습니다. lol.

좋은 예는 아니지만 아이디어를 얻습니다.

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

도우미 명명 규칙을 사용하는 것이 완벽한 솔루션이라고 말하지는 않지만 몇 년 동안 우리에게 효과적이었습니다.


2
이유를 설명하지 않았습니다.
Robert Harvey

2
예, 저도 그 설명을 원합니다.
Aaron Hall

@AaronHall 당신이 그들의 선택을 이해하지 못하는 것이 좋다고 생각하십시오.
Leopold Asperger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.