2008-10-22 3 views
43

C#의 유창한 인터페이스에 대한 유용한 팁을 다뤘습니다. 나는 그저 나 자신에 대해서 배우고 있지만 다른 사람들이 내가 읽고있는 기사의 바깥에서 생각하는 것을 듣고 싶어한다. 특히 나는 뒤에있다 :C# 3에서 유창한 인터페이스 작성을위한 팁

  1. 유창하다?
  2. 유창한 패턴이 있습니까?
  3. 유창한 인터페이스를 더 유창하게 만드는 C#은 무엇입니까 (예 : 확장 메서드)
  4. 은 유창한 인터페이스이지만 여전히 유창한 인터페이스입니다.
  5. 유창한 인터페이스에 도달하거나 기존 유창한 인터페이스에 리팩토링하는 리팩토링
  6. 함께 작업했거나 추천 할만한 좋은 예가 있습니까?

팁 하나 또는 생각을 게시 할 수 있거나 게시물마다 무엇이든지 게시 할 수 있습니다. 나는 그들이 어떻게 투표를 받는지보고 싶다.

미리 감사드립니다.

+0

여기 팁이다 : 검색 기능과 단순함이 훨씬 더 중요 유창하게 API는 대부분의 경우에서주는 약간의 추가 가독성보다. LinQ (synatax 메서드) 방식에 능통합니다. C#으로 유창한 DSL을 작성하면 이해하기 어려운 API가 생성됩니다. –

답변

18

네 번째 포인트에서;

예 복잡한 유창한 인터페이스가 여전히 유창하다고 생각합니다.

유창한 인터페이스는 다소 타협적이라고 생각합니다. (좋은 점은 있지만!) 프로그래밍에 자연 언어를 사용하는 것에 대한 많은 연구가있어 왔으며 일반적으로 자연 언어는 프로그램을 표현하기에 충분하지 않습니다.

유창한 인터페이스는 프로그래밍 언어처럼 작성되므로 자연어로 표현할 수있는 작은 부분 집합 만 허용되지만 자연 언어처럼 읽습니다.

예를 들어 rhino mocks를 보면 필기 부분이 일반 라이브러리와 비교하여 복잡해졌습니다. 나는 유창한 인터페이스 때문에 대부분 배우는 데 더 오래 걸렸지 만, 코드를 읽기가 훨씬 쉬워졌습니다. 프로그램은 일반적으로 한 번만 쓰여지고 한 번 이상 읽으면 좋은 균형을 이루기 때문입니다.

내 포인트를 약간 한정 짓기. 글쓰기가 복잡하지만 읽기 쉬운 유창한 인터페이스는 여전히 유창합니다.

+0

Rhino mock이 좋은 예입니다. 또한, 좋은 것에 대한 당신의 견해를 좋아하십시오. 유창한 인터페이스는 일반인에게 공개 되든 그렇지 않든간에 사용자, 다른 코더 등을 위해 사용하기 쉬운 인터페이스를 제공하는 것에 관한 것입니다. 그래서 복잡성의 고통이 모두 나쁜 것은 아닙니다. –

7

그리고 두 번째 및 세 번째 질문에; 이 생성자 및 거래의 디스 포저를 사용

using(var transaction = new Transaction()) 
{ 
    // .. 
    // .. 
} 

: 내가 첫 번째는, 예를 들어 특정 컨텍스트에서 코드를 실행할 수있는 using 문 (C# 2.0)를 사용

나타났습니다

세를 유창하게 구사 패턴 트랜잭션을 설정 한 다음이 컨텍스트에서 코드를 실행합니다.

둘째는 거의 동일하지만 람다를 사용하면 Rhino Mocks에서 많이 사용됩니다.

(new Transaction()).Run(() => mycode();); 

가장 유창한 인터페이스는 리턴 유형을 사용하여 메소드 호출을 체인화하는 것입니다. 대부분의 메소드는 이것을 돌려 주므로, 같은 오브젝트로 호출을 연결할 수 있습니다. 그러나 호출 된 메서드에 따라 다른 개체를 반환하여 컨텍스트를 변경할 수도 있습니다.트랜잭션에서만 실행할 수있는 객체가있는 경우 (미안하지만 다른 예제는 생각할 수 없음), 호출 실행 및 stoptransaction을 실행할 수있는 초기화 된 트랜잭션을 의사 코드로 반환하는 StartTransaction 메소드를 제공 할 수 있습니다 (

). 당신은 오류 처리의 모든 종류를 추가 할 필요가 물론

var runner = new Runner(); 
runner 
    .StartTransaction() 
    .Run() 
    .StopTransaction(); 

처럼 호출이 보이는

class Runner 
{ 
    Transaction StartTransaction() 
    { 
    return new Transaction(this); 
    } 
} 

class Transaction 
{ 
    Transaction Run() 
    Transaction StopTransaction() 
} 

27

유창한 인터페이스의 소비자가 있다는 것입니다 나는이 경험 한 가장 큰 도전 대부분은 진짜 fl하지 않습니다. 인터페이스를 제공합니다. 대신 실제로는 '읽기 쉬운 인터페이스'라고 부르는 경향이 있습니다.

유창한 인터페이스는 읽기 쉬운 인터페이스가 읽기 쉽도록 만드는 반면 읽을 수있는 인터페이스는 읽기 쉽도록 만드는 것이 주 목적임을 의미합니다. 대부분의 유창한 인터페이스는 코드 작성이 엄청나게 어려울 뿐더러 나중에 다른 사람들이 읽을 수 있도록 읽기 쉽도록 대충 읽기 쉽습니다.

Assert().That().This(actual).Is().Equal().To(expected). 
    Except().If(x => x.GreaterThan(10)); 

... 코드에서 실제로 작성하는 것보다 나중에 읽기가 더 쉽습니다.

+0

+1 실제 팁 :-) –

+13

평범한 것보다 실제로 읽는 것이 더 쉬울 까? 실제> 10'? –

+0

noooooooooooooo –

11

다형성 메서드를 사용하면 호출 체인이 끊어지기 때문에 유창한 인터페이스와 함께 상속을 사용할 때 벽돌을 칠 것입니다. 필요하지 않은 곳에서는 못생긴 캐스팅과 paranthesis를 사용하여 인터페이스를 유창하게 만들고 싶지 않을 것입니다 . http://liviutrifoi.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/

+1

좋은 기사. 나는 그것을 시도 할 것이다. –

+1

기사 링크가 변경된 것 같습니다. http://liviutrifoi.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time – dharmatech

8

MOQ는 그들의 유창한 인터페이스를 만들기 위해 등등, ToString 동일하고 unreleated 방법을 숨 깁니다 나는 일반 건축업자 및 일반 제약 일반적인 확장 방법을 사용하여 해결 방법을 제공 패턴에 대한 기사를 작성했습니다 더욱 사용하기 쉽다.

Hiding System Object이 작업을 수행하는 이점을 설명하는 문서입니다.

+1

+1에 대한 기사입니다. –

+0

링크가 죽었습니다. ( –

+0

업데이트 된 [link] (http://blogs.clariusconsulting.net/kzu/how-to-hide-system-object-members-from-your-interfaces/) –

7

저는 직장에서 작은 앱을위한 유창한 인터페이스를 작성하는 법을 배우기 시작했습니다. 나는 주변에 물어 봤고 약간 연구했고 유창한 인터페이스를 작성하는 좋은 접근법은 "Builder 패턴"을 사용하고 있다는 것을 발견했다. 여기에 대해 더 읽어 보자. link text

내가 본질적으로 시작했다.

public class Coffee 
{ 
    private bool _cream; 

    public Coffee Make { get new Coffee(); } 
    public Coffee WithCream() 
    { 
    _cream = true; 
    return this; 
    } 
    public Coffee WithOuncesToServe(int ounces) 
    { 
    _ounces = ounces; 
    return this; 
    } 

}

는 여기에 내가 유창 인터페이스에서 클로저를 구현하기위한이 비슷한 질문에 대한 상호 게시물입니다. link text

+0

좋은 예입니다. – Boinst

2

언젠가 나는 당신이 지금 가지고있는 의문을 가지고있었습니다. 나는 약간 연구를하고 지금 그 화제에서 돕기 위하여 몇몇 포스트를 쓰고있다.

내 블로그에 그것을 확인 :

Guidelines to Fluent Interface design in C# part 1

그리고 다음 게시물에

난 당신이 언급 한 점의 모든 일을 다룰 것입니다.

안부 앙드레 비아나

+0

링크가 죽었으므로 링크 전용 답변이 권장되지 않는 이유에 대한 좋은 예입니다. 귀하의 의견입니다 : http://www.codeproject.com/Articles/99542/Guidelines-to-Fluent-Interface-design-in -C- 부품 –

3

한 것은 당신이 영어 구문의 형태를 설명하고 아래에 문서화되지 않은 순차적 커플 링을 도입하지 않았는지 확인해야한다는 것입니다.

// Snarky employees get a raise. 
employees.WhereSnarky().GiveRaise(); 

// Depending on implementation, everyone may get a raise. 
employees.GiveRaise().WhereSnarky(); 
관련 문제