문제

유창한 인터페이스에 대한 질문이 있습니다.

SQL 인터페이스의 매개 변수 객체로 사용되는 객체가 있습니다. 예는 다음과 같습니다.

using (DatabaseCommand cmd = conn.CreateCommand(
    "SELECT A, B, C FROM tablename WHERE ID = :ID",
    SqlParameter.Int32(":ID", 1234)))
{
    ...
}

이러한 매개 변수 중 일부의 경우 일부 전문화 된 옵션을 활성화하고 싶지만 Int32 메소드 (많은 것 중 하나)에 더 많은 속성을 추가하는 대신 유창한 인터페이스를 살펴볼 것이라고 생각했습니다.

다음은 내가 조사하고있는 것을 추가 한 예입니다.

SqlParameter.Int32(":ID", 1234).With(SqlParameterOption
    .Substitute
    .Precision(15)
)

이 두 가지 옵션이 이러한 유형의 매개 변수에 적합하지 않다는 것을 알고 있습니다. 그러나 이것이 질문에 관한 것이 아닙니다.

위의 경우, 대체물은 sqlparameteroption 클래스에서 정적 속성 (또는 괄호를 추가하는 경우 방법)이어야하지만 정밀도는 인스턴스 방법이어야합니다.

내가 그것들을 다시 주문하면?

SqlParameter.Int32(":ID", 1234).With(SqlParameterOption
    .Precision(15)
    .Substitute
)

그러면 대체물은 인스턴스 특성이어야하며 정적 방법을 정밀하게해야합니다. 물론 이것은 컴파일하지 않을 것입니다. 나는 정적 및 비 정적 속성 또는 동일한 이름의 비 정적 속성 또는 메소드를 모두 가질 수 없습니다.

어떻게해야합니까? 내가 여기에서 완전히 잘못된 트랙에 있습니까?

질문을 다시 읽는 동안 아이디어가 있었는데 아래 의이 다른 구문이 더 의미가 있습니까?

SqlParameter.Int32(":ID", 1234).With
    .Precision(15)
    .Substitute

이 경우 둘 다 반환이있는 모든 것에 대한 인스턴스 메소드가 될 것입니다. 덤프하고 싶지는 않습니다 .와 함께 파트, 이것은 단지 객체의 모든 방법을 노출시킬 것입니다. 유창한 하나.

조언과 좋은 URL은 가장 환영받을 것입니다. 많은 예를 oured습니다. 그러나 그들은 다음과 같은 예를 보여주는 경향이 있습니다.

order
    .AddFreeShipping()
    .IncludeItem(15)
        .SuppressTax();

(들어 올렸다 이 페이지)


편집하다: 응답 후 후속 조치 @marxidad:

class SqlParameterOption
{
    public SqlParameterOption Precision(int p) {/* ... */; return this;}
    public SqlParameterOption Substitute() {/* ... */; return this;}
    /* ... */       
}

/* ... */
SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption()
                                           .Precision(15)
                                           .Substitute());

이 접근법을 사용하면 객체를 가져 와서 매개 변수에 적용해야합니다. 난 괜찮아.

구문을 사용하면 예제로 추가 한 경우 다음과 같습니다.

SqlParameter.Int32(":ID", 1234).With
                               .Precision(15)
                               .Substitute());

이 경우 체인이 언제 종료되었는지 알 수 없으므로 각 옵션은 효과를 직접 적용해야합니다.

선호되는 것은 무엇입니까? 옵션이 나중에 적용 해야하는 효과 객체를 구축하거나 각 효과가 그 효과를 직접 적용 하는가?

나의 결정: 처럼 @marxidad 변화가 돌이킬 수없고 잠재적으로 반전 될 수 있고, 상태를 구축하고 어느 시점에서 실패 할 수 있다면, 내가 갈 방법을 제외하고는 말합니다.

그러나이 경우 SQLPARAMETER 객체를 직접 수정하는 간단한 접근 방식으로 가고 있습니다.

이 경우 내 코드는 다음과 같습니다.

SqlParameter.Int32(":ID", 1234).With
                               .Precision(15)
                               .Substitute());

편집하다: 가, 그게 내가 한 가지에 집중할 때 어떻게 되는가입니다.

나는 그 구문을 사용할 수 없다. @marxidad:

SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption()
                                           .Precision(15)
                                           .Substitute());

물론 SQLPARAMETER 객체를 인수로 가져 오는 방법이 반환 된 객체에 대처할 수 없으므로 SQLPARAMETER 객체가 제대로 구성되고 설정되었지만 의도 된 사용법과 호환되지 않기 때문입니다.

도움이 되었습니까?

해결책

SqlParameterOption's 메소드는 모두 동일한 개체를 반환하는 인스턴스 메소드가 될 수 있습니다.

class SqlParameterOption
 {
    public SqlParameterOption Precision(int p) {/* ... */; return this;}
    public SqlParameterOption Substitute() {/* ... */; return this;}
    /* ... */       
 }

/* ... */
SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption()
                                           .Precision(15)
                                           .Substitute());

Re : 나중에 적용 할 상태를 구축하는 것과 각 통화마다 직접 신청, 어느 경우에도 실제로 돌이킬 수없는 부작용이 없다면, 그것은 중요하지 않으며 그것은 당신의 개인적인 취향에 달려 있습니다. 각 메소드 호출로 옵션이 커밋되고이를 취소하고 싶을 가능성이 있다면 먼저 상태를 구축 한 다음 적용 할 수 있습니다. 매개 변수 객체가 적용 할 때 속성간에 유효성 검사를하는 경우 직접 응용 프로그램을 사용하여 유효성 검사 피드백을 올바르게 얻는 것이 좋습니다.

다른 팁

과부하가 걸릴 수 있습니다 행동 양식 그렇지만. 예를 들어, 대체 () 인 경우. 일반적으로 정적 및 인스턴스 버전의 메소드를 가질 수는 없지만 확장 메소드는 어느 정도 사용될 수 있습니다. 그러나 두 가지 버전의 대체물이 다른 의미를 갖는 경우 단순히 다른 유형을 반환하는 것이 더 깨끗합니다. 대체 ()의 두 변형은 충돌 할 수 없다는 것입니다.

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