>

이 두 가지 접근 방식에 대한 당신의 생각이 궁금합니다 : 오버로딩 방법 대 긴/자세한 방법 이름

업데이트 : 일반적인 패턴/모범 사례를 찾고 있습니다. 다음은 예일뿐입니다.

부모/자녀 관계가있는 조직 구조 제공

> OrgUnit
> - OrgUnit
> -- OrgUnit
> -- OrgUnit

두 가지 방법은 xml 요소의 자식을 얻기 위해 많은 부분에서 동일한 코드를 사용합니다.

// 1) only 1 level down children
getSubOrgUnits()
// 2) all levels down
getSubOrgUnits(boolean includeChildren)
// 3) alternative naming of 1)
getDirectSubOrgUnits()
// 4) alternative naming of 2)
getAllSubOrgUnits()

1과 2는 매개 변수를 사용하고 있습니다 3과 4는 매개 변수가없는 이름을 사용하고 있습니다.

무엇을 원하십니까? 또한 1)과 2)는 getChilds (true, false, null)와 같은 결과를 초래하는 추가 매개 변수를 얻을 수 있지만 3)과 4)는 getDirectSubUnitsExcludeSome ()과 같은 이름을 얻을 수 있습니다.

자바에 따라 다를 수 있지만 이것에 대한 더 넓은 견해는 인정된다.

  • 답변 # 1

    제 생각에 자세한 분석법 이름을 사용하는 것이 더 나은 해결책입니다.

    더 이해하기 쉽고 코드에 적은 주석이 필요합니다

    유지 관리가 쉬우므로 기존 서명에 영향을주지 않고 구현을 변경할 수 있습니다. 회귀없이 새 서명을 계속 추가 할 수 있습니다.

    하지만 상황에 따라 일부 매개 변수를 추가하는 것이 좋습니다

    예제 1

    private List<Element> getElementsByType(MyTypeEnum type);
    public List<Element> getElementsOfType1();
    public List<Element> getElementsOfType2();
    public List<Element> getElementsOfType3();
    /* VS */
    public List<Element> getElementsByType(MyTypeEnum type);
    
    

    모두 구현이 좋으며 MyTypeEnum 의 크기에 따라 다릅니다. 크기가 커질 수 있습니다. 무엇을 노출하고 싶습니까? getElements*** 의 발신자를 원하십니까  모든 유형의 Element 를 얻을 수 있도록  ?

    예제 2

    public void log(Level l, String s, Exception e);
    /* VS */
    public void logInfo(String s);
    public void logWarning(String s);
    public void logError(String s, Exception e);
    
    
    이 경우 두 번째 부분이 더 좋습니다. 더 읽기 쉽고 첫눈에 이해하기 쉽습니다. 그리고 INFO 에 로그인하면  그리고 WARNING  레벨, Exception 를 지정할 필요가 없습니다. . 따라서 방법을 전문화하는 것이 좋습니다. 그러나 방법을 public void log(Level l, String s, Exception e); 로 유지하는 것이 중요합니다  경우에 따라이 일반적인 방법을 사용하는 것이 유용 할 수 있으므로 공개 및 비공개가 아닙니다.

    결론

    실제로 상황에 따라 다르지만 목표 동작을 구체화하는 자세한 이름을 사용하여 특정 방법을 추가 할 수있는 경우이를 수행하십시오.

  • 답변 # 2

    모든 것이 맛으로 귀결됩니다.

    일반적으로 "최소 매개 변수가 더 낫습니다"를 사용할 수 있습니다. 코드 선명도 측면에서 편리하고 실제로 스택 메모리를 절약합니다 (별로는 아니지만 모든 비트가 장기적으로 중요합니다).

    다른 이름을 사용하면 자동 완성 기능을 할당하는 데 도움이됩니다.

    예를 들어 갈 것이다

    GetAllSubOrgUnitsList()
    GetFirstSubOrgUnitsList()
    

    이것의 이유는 내가 얻은 후에 내가 쓴 첫 번째 편지가 내가 원하는 것을 식별 할 것입니다.

    앞서 언급했듯이 직관적 인 이름을 가질 수없는 경우 기본 매개 변수를 추가 할 수 있습니다.

    예를 들어

    GetDirectSubUnitsExcludingSome()
    
    

    최소한의 매개 변수 세트로 바꾸겠습니다

    GetFilteredSuborgUnits(ISuborgFilter aFilter);
    
    
    그런 다음 아키텍처에서 개발자에게 사용자 정의 필터를 구현하도록 요청하십시오. 필터는 계층 적 깊이, 특정 소유권 등을 요구할 수 있습니다 (아키텍트가 결정합니다).

    빠른 요약으로 KISS!

    GetAllSuborgUnits ()가 GetFilteredSubOrgUnits (null)과 동일하게 제공하더라도 복잡한 이름/매개 변수를 갖는 것보다 동작에 대한 빠르고 명확한 대안을 제공하는 것이 좋습니다. 결국, 중복성이 항상 나쁜 것은 아닙니다 :).

  • 답변 # 3

    이름이 길수록 더 나은 방법이라는 데 동의하지 않습니다.

    "의존적"이지만 무언가를 명확히 해보자 :

    같은작업을 수행하지만 다른 옵션을 취하는 두 가지 방법은 IMHO와 동일한 이름 (과부하)이어야합니다.

    다른 것들을 결정하는 두 가지 방법 (결정된 것 이외의 것) 매개 변수 별)의 이름이 달라야합니다. 다른 방법으로 일반적인기능의 이름이어야합니다 (변이 형이 있지만). 다른 기능에 대한 별도의 이름.

    과부하가 JRE에서 사용되는 거의균일 한사례라는 점은 주목할 가치가 있습니다.

    실제적으로 더 긴 이름을 사용할 때는 이점이 거의 없습니다. 부여됨 :

    getSubOrgUnits()
    
    

    보다 분명하다 :

    getSubOrgUnits(true)
    
    

    이를 공식 API에 포함하면 별도의 이름을 지정하거나 두 번째 이름을 상수로 수행합니다.

    getSubOrgUnits(INCLUDE_SUB_UNITS)
    
    

    대부분의 IDE를 사용하면 true 의 방법을 즉시 확인할 수 있습니다  매개 변수는 메소드 위로 마우스를 가져 가면 해석됩니다 (일반적으로 Javadoc을 팝업으로 표시 함).

    나에게 과부하의 장점은 변형을공식으로 연결한다는 것입니다. Javadocs에서도 더 좋은 프리젠 테이션입니다.

  • 답변 # 4

    이러한 구조를 처리하는 일반적인 방법은 다음과 같습니다.

    // Used when you KNOW there is only one child.
    getFirstChild();
    // Used when there may be many children.
    getChildren();
    
    

    이것은 XOM 가 사용하는 패턴입니다  XML 파일의 구조를 걷는 getChildElements 및 getFirstChildElement

    언제나 사용할 수 있습니다 :

    thing.getFirtsChild().getChildren();
    
    

    더 깊은 레벨에 액세스하려면.

  • 답변 # 5

    먼저 getChildren() 메소드라고 부릅니다. getChilds() 가 아닌 . :)

    여러 레벨이 있다면, 심도 레벨에 대한 논증을 소개하지 않겠습니까?

    // Get children up to depthLevel
    getChildren(final int depthLevel)
    // For convenience
    getChildren()
    
    

    매개 변수가없는 방법의 경우, 의미있는 정보를 추가하여 다른 개발자가 자신이 첫 번째 수준 만 반환하는지 아니면 첫 번째 수준 만 반환하는지 알 수 있습니다. <시간>

    수정 :OP :"일반적으로 어떤 접근 방식을 사용 하는가, 왜, 어떤 유스 케이스가 있습니까? 그에 대한 생각을 공유 할 수 있습니다."

    이것은 의견에 근거한 것입니다. @OldCurmudgeon이 언급했듯이 트리와 같은 구조를 처리하는 많은 라이브러리는 전용 메소드를 사용하여 하위 레이어에 액세스합니다. 정기적으로하는 한 괜찮습니다. 다른 한편으로, depthLevel 소개  인수는 특정 레벨의 구조에 액세스하려는 경우 더 많은 권한을 제공합니다. 이것은 일반적인 사용 사례에 따라 다릅니다.

    따라서 객체의 첫 번째 자식을 자주 가져와야 할 경우 getFirstChild() 를 소개하십시오  그리고 getChildren() . 더 깊은 수준의 데이터에 더 자주 액세스하거나 전용 레벨에 액세스해야하는 경우 깊이 매개 변수를 도입하십시오.

  • 이전 standards compliance - C ++에서 동적으로 할당되지 않은 가변 길이 배열을 허용하는 이유는 무엇입니까?
  • 다음 sql server - Docker 컨테이너에서 SSMS를 Linux SqlServer에 연결하는 방법은 무엇입니까?