문제

C#의 유창한 인터페이스에 대한 좋은 팁을 얻었습니다. 나는 단지 그것에 대해 배우고 있지만 내가 읽고있는 기사 밖에서 다른 사람들이 어떻게 생각하는지 듣고 싶어합니다. 특히 나는 다음과 같습니다.

  1. 유창한시기는 언제입니까?
  2. 유창한 패턴이 있습니까?
  3. 유창한 인터페이스를보다 유창하게 만드는 C#의 내용 (예 : 확장 방법)
  4. 복잡한 유창한 인터페이스가 여전히 유창한 인터페이스입니까?
  5. 유창한 인터페이스에 도착하거나 기존 유창한 인터페이스를 리팩토링하려면 리팩토링
  6. 당신이 함께 일했거나 추천 할 수있는 좋은 예가 있습니까?

하나의 팁이나 생각 또는 게시물 당 무엇이든 게시 할 수 있다면. 나는 그들이 어떻게 투표하는지보고 싶다.

미리 감사드립니다.

도움이 되었습니까?

해결책

네 번째 지점에;

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

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

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

예를 들어 Rhino Mocks를 보면 글쓰기 부분은 일반 라이브러리에 비해 복잡했습니다. 유창한 인터페이스로 인해 주로 배우는 데 더 오래 걸렸지 만 코드를 훨씬 쉽게 읽을 수 있습니다. 프로그램은 일반적으로 한 번 작성되고 한 번 이상 읽히기 때문에 이것은 좋은 트레이드 오프입니다.

그래서 내 요점을 조금 자격을 갖추려면. 쓰기가 복잡하지만 읽기 쉬운 유창한 인터페이스는 여전히 유창 할 수 있습니다.

다른 팁

유창한 인터페이스의 소비자로서 경험 한 가장 큰 도전은 대부분의 유창한 인터페이스가 아니라 실제로 '읽기 쉬운 인터페이스'라고하는 경향이 있다는 것입니다.

유창한 인터페이스는 기본 목표를 쉽게 말할 수 있도록하는 것이며, 읽기 쉬운 인터페이스는 주요 목표가 읽기 쉬운 것임을 암시합니다. 대부분의 유창한 인터페이스는 코딩하기가 엄청나게 어렵지만 나중에 다른 사람들이 읽기 쉽게 읽기 쉽습니다.

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

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

유창한 인터페이스와 함께 상속을 사용할 때는 벽돌에 부딪칩니다. 다형성 방법을 사용하면 통화 체인이 나뉘어지고 필요하지 않은 곳에서 추악한 주조와 패배성을 사용하여 인터페이스를 비유하게 만들고 싶지 않기 때문입니다. 일반적인 빌더를 사용하여 해결 방법을 제공하는 패턴과 일반적인 제약 조건이있는 일반적인 확장 방법을 제공하는 기사를 작성했습니다.http://liviutrifoi.wordpress.com/2009/02/16/fluent-nterfaces-constraints-at-compile-time/

MOQ는 Equals와 같은 관련되지 않은 방법을 숨 깁니다. ToString 따라서 유창한 인터페이스를 더 쉽게 사용할 수 있도록합니다.

숨어 시스템 객체 이 작업의 이점을 설명하는 기사입니다.

그리고 당신의 두 번째와 세 번째 질문에;

내가 알아 차린 세 가지 유창한 패턴

첫 번째는 사용 명령문 (C# 2.0)을 사용하여 특정 컨텍스트에서 코드를 실행합니다.

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

이는 트랜잭션의 생성자 및 처리자를 사용하여 트랜잭션을 설정 한 다음이 맥락에서 코드를 실행합니다.

두 번째는 거의 동일하지만 Lambda의 경우 Rhino Mocks에서 많이 사용됩니다.

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

가장 잘 알려진 유창한 인터페이스는 리턴 유형을 체인 메소드 호출에 사용하는 것입니다. 대부분 메소드를 반환하여 동일한 개체에서 호출을 체인 할 수 있습니다. 그러나 다른 객체를 반환하여 호출 된 메소드에 따라 컨텍스트를 변경할 수도 있습니다. 트랜잭션에서만 실행할 수있는 객체가있는 경우 (죄송합니다. 다른 예를 생각할 수 없음) 의사 소드에서 호출 실행 및 스톱 트랜잭션을 실행할 수있는 초기 트랜잭션을 반환하는 STARTTRANSACTION 방법을 제공 할 수 있습니다.

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

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

전화가 어떻게 생겼는지

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

물론 모든 종류의 오류 처리 등을 추가해야합니다.

나도 직장에서 작은 앱을위한 유창한 인터페이스를 작성하는 방법을 배우는 데 뛰어 들고 있습니다. 나는 주변에 물었고 조금 조사했고 유창한 인터페이스를 작성하는 좋은 접근 방식이 "Builder Pattern"을 사용하는 것임을 발견했습니다. 여기.

본질적으로 이것이 내가 시작한 방법입니다.

public class Coffee
{
    private bool _cream;
    private int _ounces;

    public Coffee Make { get new Coffee(); }

    public Coffee WithCream()
    {
        _cream = true;
        return this;
    }

    public Coffee WithOuncesToServe(int ounces)
    {
        _ounces = ounces;
        return this;
    }
}

다음은 크로스 포스트입니다 비슷한 질문 유창한 인터페이스에서 클로저를 구현해야합니다.

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

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

vs.

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

언젠가 나는 당신이 지금 가지고있는 것과 같은 의심을 가지고있었습니다. 나는 약간의 연구를 해왔고 이제 그 주제에 도움이되는 게시물을 작성하고 있습니다.

내 블로그에서 확인하십시오.

C# 1 부에서 유창한 인터페이스 설계에 대한 지침

그리고 다음 게시물에서 나는 당신이 언급 한 모든 포인트를 다룰 것입니다.

안부 안드레 비아나

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top