어쩌면 혀가 혀로 보일 수 있지만 Google을 통해이 답변을 찾을 수 없으므로 소프트웨어 엔지니어링이 답을 찾을 수 있도록 다음과 같이하십시오.

도우미 란 무엇입니까?

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

디자인 패턴입니까? 알고리즘입니까? 모듈과 클래스를 모두 somethingsomethinghelper (여기서 something )라고하는 프로그램에서 작업 한 적이 있습니다. em>도 상당히 일반적이었습니다) 그리고 즉시 이름을 제게 이해할 수있는 이름으로 변경했지만 “여기에 뭔가 빠진 것 같습니다!

댓글

  • 도우미는 ‘ 무엇을 불러야할지 모르지만 y 친구 중 한 명을 알고 있습니다. Aaron 대신 ‘ Zack의 친구 ‘라고 부르는 것과 같습니다. Double plus ungood.
  • 도우미는 동형까지의 개인 회원입니다.
  • @ThomasEding 3 년 후 돌아와서 미안하지만 저는 ‘ ” 공개 ” 회원 인 ” 도우미

    (인터페이스 포함). 나는 ‘ 당신의 정의에 대한 소스를 원합니다 (높은 품질 일수록 더 좋습니다). 더 많은 코드 냄새에 대한 감각을 확실히 줄 것이기 때문입니다.

Answer

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

그러나 심각하게는 도우미 클래스의 주요 문제는 다음과 같습니다. 일반적으로 특정 클래스에서 작동하는 작업입니다. 즉, OO 용어로 Feature Envy 의 급성 사례로 고통 받고 있음을 의미합니다. 작동하는 데이터로 동작을 패키징하지 못하기 때문에 개발자가 (내 경험상) 자주 찾지 못하는 이유입니다.

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

댓글

  • 예쁜 SomethingSomethingHelper가 클래스의 실제 이름이 아닌지 확인합니다. ‘ 코드 냄새인지 여부는 특정 도우미 클래스는 Math와 같은 도우미 클래스가 전혀 코드 냄새가 아니기 때문입니다.
  • @RobertHarvey-Enh, 대부분의 경우 ‘ 있는 이름이 SomethingSomethingHelper 인 것을 보았습니다. 지옥, 나 ‘ 지금 <company>.Helpers 네임 스페이스에서 HelperMethods라는 클래스를보고 있습니다. 나에게는 클래스는 *Manager와 동일한 버킷에 있습니다.
  • @Telastyn : 아마도 그럴 수도 있습니다 ‘는 경험적인 것입니다. 저는 ‘ 현재 프로젝트 (여러 개가 있음)의 도우미 클래스를 살펴 봤으며 모두 의미있는 이름을 가지고 있습니다. ‘ ‘에 Helper 접미사가 붙은 유일한 것이 있습니다. div id = “0933616a57”>

를 사용하여 동일한 이름을 가진 .NET Framework의 클래스와 명확하게 구분합니다. ‘*가 의미있는 것이면*Helper허용되는 것으로 간주합니다.HelperMethods는 상상의 실패 일뿐입니다. 최소한 구체적인 개념적 버킷이 있어야합니다.

  • @RobertHarvey-당신이 ‘ 아마 맞습니다. 현대 언어를 사용하는 모든 경력은 열차 난파선을 청소하는 것이 었습니다.
  • ” 도우미 기능 , 실제로 유용하고 좋은 패턴입니다.예를 들어, 함수 내에서 반복되어야하는 공통 라인 세트-이들이 표시되는 위치의 한 가지 예는 Python에서 do..while 루프가 필요할 때입니다. ‘ 지원하지 않습니다 ( 여기에서 두 번째 예 참조). 다른 하나는 if / elif /…/ else 구조이지만 상단과 하단에서 케이스를 반복해야합니다. 가능하면 해당 함수에 로컬로 지정해야하며 일반적으로 실제로 ” helper “라고 부르지 않습니다.
  • Answer

    헬퍼는 외부 구성 요소를 보완하는 한 무해한 추가 클래스 또는 메서드입니다. 반대로하면 권한이 전혀 없다면 코드가 권한에서 배제되어 잘못된 디자인을 의미하는 것입니다.

    다음은 무해한 도우미의 예입니다. 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; } } }  

    댓글

    • DutchZipcodeHelper가 어떻게 수행되어야하는지 보여 주시겠습니까?
    • @ powder366 Validate는 비공개입니다. DutchZipcode의 메소드

    Answer

    Helper는 일반적으로 사용되는 이름 부속물입니다.

    그러나 , 그것은 아주 작은 의사 소통 그것이 무엇을하는지에 대해. 사용하는 것을 볼 때마다 차선의 이름 인 것으로 나타났습니다.

    사실 그 아래에 더 많은 문제를 나타내는 코드 냄새라고 생각합니다.

    예 h3>

    ” WidgetHelper ” (여기 ” widget “는 모든 종류의 프로그래밍 가능한 기능에 대한 독립 이름이며 반드시 UI 위젯 일 필요는 없습니다) :

     class WidgetHelper: ...  

    이름에서 무엇을 배울 수 있습니까? 우리는 객체 나 함수가 위젯에 보조적인 일을한다는 것을 압니다. 이것이 사실이 아닐 수도 있고, 이름에서 ” helper “를 삭제하고 커뮤니케이션을 개선 할 수 있다는 것은 제 경험입니다.

    다른 가능성을 위해 ” WidgetHelper “는 위젯 코드 자체가 알 수 있도록 위젯을 래핑 할 수 있습니다. 도우미에 대한 것은 없습니다. 의미는이 의사 코드 예제의 WidgetHelper가 공용 API의 일부라는 것입니다.

     class WidgetHelper: def __init__(self): self.widget = Widget() ...  

    이 경우 ” WidgetAPI “와 같은 이름이 더 나은 이름이됩니다. 최소한 사용자에게 Widget 클래스와의 관계를 알려주기 때문입니다. 또는 이름에서 ” Helper “를 삭제하고 추가로 Widget의 이름을 다음과 같이 변경합니다. WidgetImplementation.

    또는 위젯에 의해 래핑 및 호출 될 수 있습니다. 이는 공개 API의 일부가 아닌 것을 의미하지만 구현 세부 정보의 일부입니다.

     class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...  

    이 경우에도 적은 양의 정보가 ” helper. “에 대해 개선되었습니다. ”

    WidgetImplementation. ”

    ” 구현 ” 구현시 더 정확한 이름을 지정하기에는 너무 많은 작업을 수행 할 수 있으므로 정확할 수 있습니다. 또는 그 자체가 너무 모호 할 수 있습니다. 이것은 이름 작성자의 재량입니다.

    하지만 우리가 살펴본 것처럼 이름은 ” helper,

    는 주요 관심 개체에 대한 부수적 인 것 외에는 코드에서 진행되는 작업을 이해하는 데 도움이되지 않습니다. ” 도우미, “는 여러 종류의 관계를 의미 할 수 있습니다. 따라서 지나치게 모호하고 모호하며 사용자에게 개체의 기능을 알리는 목적에 적합하지 않습니다.

    결론

    이름을 지정하는 것은 컴퓨터 과학에서 어려운 문제 중 하나입니다.

    이름에서 바람직한 것은 이름이 지정된 것이 무엇을해야하는지 사용자에게 알려주는 것입니다.

    그러나 상상할 수있는 모든 경우에 ” helper “가 아닌 다른 이름을 사용하거나 간단히 모두 제거하십시오.

    내 경험과이 토론의 결과로서 이름에서 ” 도우미 “를 선택하는 것은 이름 작성자의 적은 노력 또는 정교함 (올바른지 여부). 실제로 코드 냄새입니다.

    아무것도 ” 도우미라고 부르지 마세요. ”

    답변

    실제로 둘 다 아닙니다.

    ” Helper “는 기능 그룹의 집합 명사입니다.

    도우미는 프로젝트 전체에서 작동하며 작은 일을합니다. 이 사람들은 종종 클래스로 구성되지 않고 언어 자체의 기능이나 기능을 확장 할뿐입니다. 다음은 도우미의 아주 좋은 예입니다.

     function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }  

    이 작은 함수는 코드를 구성하는 방법에 큰 영향을 줄 수 있지만 (여러 줄 문자열에 리터럴 목록을 넣는 것을 좋아할 것입니다) 그 자체로는 아무 것도 의미하지 않습니다. “미화 된 정규식 패턴입니다. 그래도 다음과 같이 말할 때 코드를 훨씬 더 쉽게 읽을 수 있습니다.

     $a = linesOf(" apples bananas cherries ");  

    순수한 정규 표현식 대신

    그게 헬퍼가되는 것입니다. 특정 클래스에 속하지 않는 일반 작업을위한 작은 도구입니다. 강제로 하나로 만들 수 있지만 (linesOf는 문자열 클래스의 메서드 일 수 있음) 실제로 속하는 위치는 전역 네임 스페이스 또는 이러한 도구의 정적 컬렉션입니다.

    엄지 손가락 규칙 : 도움이되지만 어디에도 속하지 않는 것 같으면 도우미 일 수 있습니다.

    답변

    물론 ” 이것은 회색 영역이지만 ” 제 실용적인 경험은 사람들이 자신에게 유용한 공통 코드 세트를 식별 할 때 ” 도우미 “를 발명한다는 것입니다. “다시 구현하고 싶지 않습니다. (일부 언어에서는이를 ” 믹신이라고합니다. “)

    문제는 공통 코드가 ” 도움이 될 수있는 다른 각 클래스와 접선 적으로 관련됩니다. ” 엄격한 클래스 계층 구조이므로 ” ” [모두 …]를 지원합니다. 이 전략은 소스 코드의 중복을 피하지만 위험이없는 것은 아닙니다.

    답변

    저희 회사는 Base를 사용했습니다. 각 개체에 두 개의 클래스가있는 클래스 / 헬퍼 클래스 방법론. 모든 클래스 속성 및 정의가 포함 된 Person 클래스와 Person 클래스를 조작 한 모든 메서드, SQL 문 및 Logic이 포함 된 PersonHelper 클래스가 있습니다. 모든 응용 프로그램이 SQL 문을 사용하여 데이터를 조작하고 필요에 따라 SQL 문을 찾고 수정하는 것이 매우 쉬웠 기 때문에 이는 우리에게 효과적이었습니다.

    우리는 이후로 넘어 가서 이제 모든 것을 Person / Base 클래스에 넣습니다. 프로젝트에 더 적은 파일을 포함하고 싶었 기 때문에 도우미 명명 규칙 사용을 중단했습니다. 또한 일부 클래스 이름의 길이가 통제를 벗어났습니다. 롤.

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

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

    나는 도우미 명명 규칙을 사용하는 것이 완벽하다고 말하는 것이 아닙니다. 하지만 몇 년 동안 효과가있었습니다.

    댓글

    • 당신은 ‘ 이유를 설명해주세요.
    • 예, ‘ 그 설명도 좋아합니다.
    • @AaronHall 이해하지 못하는 것이 좋은 것이라고 생각합니다.
    • 일반적인 이유는 ” 누군가가 이것이 좋은 아이디어라고 생각했기 때문입니다 “.

    답글 남기기

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