예, 단점이 있습니다
읽기 쉬운 코드는 좋지만 코드가 통신 하는 내용도주의하십시오 . 객체의 메소드가 항상 객체를 반환하면 몇 가지 사항을 전달합니다.
- 어떤 순서로 설정하거나 구성해야하는지 확실하지 않은 고급 구성이 필요합니다.
- 각 후속 메소드 호출은 마지막에 빌드됩니다.
유효한 사용 사례 : Ad Hoc 데이터베이스 쿼리
클래스 라이브러리는 대부분의 모든 언어로 존재하므로 하드 코딩 된 SQL에 의존하지 않고 데이터베이스를 쿼리 할 수 있습니다. Entity Framework for .NET을 예로 들어 보겠습니다.
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
이것은 각 후속 메소드 호출이 이전 메소드 호출을 빌드하는 유연한 인터페이스입니다. 이러한 호출을 읽는 것은 데이터베이스 쿼리 컨텍스트에서 논리적으로 의미가 있습니다.
잘못된 사용 사례 : 속성 설정을위한 구문 설탕
이제 Post
클래스 와 동일한 패턴을 사용합시다 :
public class Post
{
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Body { get; set; }
public Post SetTitle(string title)
{
Title = title;
return this;
}
public Post SetDateCreated(DateTime created)
{
DateCreated = created;
return this;
}
public Post SetBody(string body)
{
Body = body;
return this;
}
}
이제이 클래스를 어떻게 사용할지 봅시다 :
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
이 코드가 표시되면 즉시 다음과 같은 질문을합니다. "호출 한 후 SetBody
데이터베이스를 쿼리합니까? '완료되었습니다'라는 다른 방법을 호출해야합니까?"
체인 메소드 호출 은 클래스를 사용하여 코드와 통신 하는 것은 무엇입니까 Post
?
- 복잡한 설정이 있습니다
- 각 메소드 호출은 이전 메소드에서 빌드됩니다.
입니다 실제로 사실? 아니요. Post
수업 에 복잡한 설정 이 없습니다 . 제목, 생성 날짜 및 본문을 설정해도 더 복잡한 최종 목표를 향해 구축 되지 않습니다 . 당신은 둥근 구멍에 사각형 못을 으깬다.
자체 참조 메소드 체인의 단점은 무언가를 수행하기 위해 여러 메소드 호출이 필요하며 각 호출이 마지막에 생성된다는 것을 전달한다는 것입니다. 이것이 사실이 아닌 경우, 메소드 체인은 잘못된 것을 다른 프로그래머에게 전달할 수 있습니다.
동료가 말했을 때 :
유창한 인터페이스는 편의를 위해서가 아니라 의미를 위해 구현되어야합니다
그들은 절대적으로 정확했습니다. 유창한 인터페이스 또는 메소드 체인은 사실이 아닐 수도있는 무언가를 전달합니다.