유창한 인터페이스가 데메테르의 법칙을 경유하고 있습니까?
위키 피 디아 기사 에 대한 데메테르의 법칙은 말한다 :
이 법칙은 간단히 "하나의 점만 사용하십시오"라고 말할 수 있습니다.
그러나, 간단한 예제 (A)의 유창 인터페이스는 다음과 같이 보일 수 있습니다 :
static void Main(string[] args)
{
new ZRLabs.Yael.Pipeline("cat.jpg")
.Rotate(90)
.Watermark("Monkey")
.RoundCorners(100, Color.Bisque)
.Save("test.png");
}
이게 함께하세요?
글쎄요, 법의 짧은 정의는 너무 짧아 처리합니다. 실제 "법"(실제로는 좋은 API 설계에 대한 조언)은 기본적으로 다음과 같이 사실. 사용자가 직접 생성했거나 인수로 전달받은 객체 액세스합니다. 다른 개체를 통해 간접적으로 개체에 액세스하지 않습니다. 유창한 인터페이스의 방법은 수업을 사용하여 수업을 배우지 않습니다. 다른 메소드는 사용자를 위해 개체를 생성하지 않습니다.
또한 "법"은 "클래식"API에 대한 모범 사례 조언 일뿐입니다. 유창한 인터페이스는 API 설계에 전혀 다른 접근 방식이며 Demeter의 법칙으로 평가할 수 없습니다.
반드시 그런 것은 아닙니다. "하나의 점만 사용하십시오"는 데메테르의 법칙을 부정확하게 요약 한 것입니다.
데메테르의 법칙은 각 점이 여러 점의 사용을 권장하지 않습니다. 예 :
- 첫 번째 점은 ObjectA에서 호출 된 메서드로 ObjectB 유형의 개체를 반환합니다.
- 다음 점은 ObjectB에서만 사용할 수있는 메소드이며 ObjectC 유형의 개체를 반환합니다.
- 다음 점은 ObjectC에서만 사용할 수있는 속성입니다.
- 무한 광고
어느 것이냐는 내 의견이라고 말하는 점의 반환가 원래 호출자와 동일한 유형이면
var List<SomeObj> list = new List<SomeObj>();
//initialize data here
return list.FindAll( i => i == someValue ).Sort( i1, i2 => i2 > i1).ToArray();
위의 예에서 FindAll ()과 Sort ()는 모두 원래 목록과 동일한 유형의 객체를 반환합니다. 데메테르의 법칙은 의심되지 않습니다. 목록은 직계 친구들과 만 대화했습니다.
그 존재는 모든 유창 인터페이스는 호출자와 같은 형식을 반환 단지만큼, 데메테르의 법칙을 위반합니다.
예, 상황에 약간의 실용주의를 적용해야합니다. 나는 항상 규칙이 아닌 데메테르의 법칙을 지침으로 삼습니다.
확실히 다음은 피하는 것이 좋습니다.
CurrentCustomer.Orders[0].Manufacturer.Address.Email(text);
아마도 다음으로 대체하십시오.
CurrentCustomer.Orders[0].EmailManufacturer(text);
더 많은 사람들이 일반적으로 전체 도메인을 개체 그래프로 표시하는 ORM을 사용하는 특정 개체에 대해 허용 가능한 "범위"를 정의하는 것이 아이디어 일 수 있습니다. 아마도 우리는 전체 그래프에 접근 가능한 매핑하지 말아야 제안하기 위해 데메테르의 법칙을 취해야 할 것입니다.
데메테르의 법칙의 정신은 수업 참조 또는 클래스가 주어 졌을 때 두 클래스를 결합하게됩니다.
그들이하고 있기 때문에 유창함 인터페이스는 법률에 허용되는 예외적 속성으로 어느 정도 단단하게 모든 의미로 결합 될 수 있고 방법은 기능적인 것을 형성하기 위해 함께 구성되어 미니 언어의 용어입니다.
1) 전혀 위반하지 않습니다.
코드는 다음과 가변적입니다.
var a = new ZRLabs.Yael.Pipeline("cat.jpg");
a = a.Rotate(90);
a = a.Watermark("Monkey");
a = a.RoundCorners(100, Color.Bisque);
a = a.Save("test.png");
2) Good Ol 'Phil Haack이 말했듯이 : 데메테르의 법칙은 점 계수 운동이 아닙니다.
당신의 예에는 문제가 없습니다. 결국, 당신은 회전, 워터 마킹 등 항상 같은 이미지를 사용하고 있습니다. 코드가 파이프 라인의 클래스에만 의존하는 한 LoD를 위반하지 않는 한 항상 파이프 라인과 이야기하고 많은 생각합니다.
참조 URL : https://stackoverflow.com/questions/67561/do-fluent-interfaces-violate-the-law-of-demeter
'ProgramingTip' 카테고리의 다른 글
Rust의 기본 함수 인수 (0) | 2020.12.29 |
---|---|
++ x % = 10은 C ++에서 잘 정의되어 있습니까? (0) | 2020.12.29 |
전화 및 Callvirt (0) | 2020.12.29 |
파일 / 디렉토리의 내용을 모니터링 하시겠습니까? (0) | 2020.12.29 |
MySQL에서 누계 계산 (0) | 2020.12.29 |