2009-07-06 3 views
5

유창한 인터페이스는 많은 작업에서 매우 편리하다고 생각합니다. 하지만 유창한 방법을 혼합하고 한 클래스에서 메서드를 수정하면 결국 불안해집니다.유창한 인터페이스와 유창한 인터페이스를 하나의 클래스로 혼합하기

그냥 예 (조금 인위적인이다, 나와 함께 곰하시기 바랍니다) :

트리밍, 문자열 유틸리티 클래스를 가정 체인 좋은 것 같다

Str & Str::Trim() { return TrimLeft().TrimRight(); } 

다른 방법은 자연스럽게 새로운 객체를 반환 :

Str Str::GetFirstToken() const 
{ 
    // result = first token; 
    return result; 
} 

그리고 탑승객 중에 3 종류, 그 - 그 자체로는 - 논리적으로 RET 개체를 변이 것 새로운 URN :

Str Str::SplitFirstToken() 
{ 
    result = GetFirstToken(); 
    // this = remainder 
    return result; 
} 

을 나는 개별적으로 각각의 방법에 대한 가장 명백한 서명을 사용하는 경우, 나는이 세 가지 유형으로 결국, 나는 그것이 클래스를 소비하는 매우 직관적 아니다 두려워, 특히 반환 유형이 mroe 또는 그 이하이기 때문에 특히 그렇습니다. SplitToken 같은 방법은 핵심 기능을 제공하기 때문에 -


이미 Str 불변 만들기에 대 한 결정했다. 나의 주요 문제는 유창한 방법을 혼합하는 것입니다. 당신은 무엇을 할 것입니까?

  • "은 하나 유창한 경우 모든 수정 방법 유창한 있어야"(아래 참조) 하위 인터페이스로 이동

    그 인터페이스

  • 유창한 방법을 사용하지?

  • 유창한 방법에 대한 접두사 접두어를 사용 하시겠습니까?

  • 걱정하지 않으시겠습니까?

  • ???

서브 인터페이스 아이디어 :

void CStr::Trim() { TrimLeft(); TrimRight(); } 
CStrFluent & Str::Fluent() { return CStrFluent(*this); } 
.... 
str.Fluent().TrimLeft().TrimRight(); 

내가 정말 여분의 "유창한"좋아한다, 이것에 미정이다는 - 그것은 무엇

++ C에서 메서드 호출 특히 있음 너 생각하니?

[편집] 코드에서 영어 문장을 만드는 고급 감각이 아니라, 단일 인스턴스에서 체인 메소드 호출의 기본 의미에 대해 "유창함"을 사용하고 있습니다.

답변

3

유창한 인터페이스로 많은 작업을하지는 않았지만 (일반적으로 DSL을 사용 해본 적이 있지만),이 방법에 도움이 될 수 있지만이 경우에는 특별히 필요하지 않습니다. . 어쩌면 내가 뭔가를 놓친 것 같지만, 당신이 다른 문자열을 참조하지 않고 하나의 문자열에 대해 많은 작업을 수행 할 가능성이 없다고 생각합니다. 이것이 당신이 여기서 끝낸 것입니다.나는 아마 그 생각

Str String = OtherString.GetFirstToken().SplitFirstToken().Trim(); 

: 또한이 체인에 무슨 생각 특히, 유창 인터페이스의 목적을 위반 다시 보인다 체인의 중간에 새로운 객체로 전환하고 이 유형의 상대적으로 낮은 수준의 유틸리티 클래스는 유창한 인터페이스를 시도하기에 잘못된 곳입니다. 유창함은 내가 핵심 논리에 일시적이고 보조적 일 때보다 당신의 대상이 지속적이고 집중적 인 관심을 가질 때 훨씬 중요하게 생각됩니다.

+0

"체인의 중간에있는 새 오브젝트로 전환 중입니다."- 정확히 말하면 그것이 내 관심사의 핵심입니다. firstName = line.SplitToken (...). 그러나 Trim()은 표준적인 일을하는 것처럼 보입니다. – peterchen