2009-05-14 4 views

답변

10

도트 연산자의 문제보다 더 많은 위반이 Law of Demeter입니다. 이 작업을 수행하는 "깨끗한"방법은 개체 자체를이 알아낼 수있는 논리를 제공하는 것입니다, 그래서 당신은 속성을 가져 오는 정말이 점 연산자 각각의 사용으로 너무 오래

if ([pickerViewController hasPickedName:message]) 
+0

나는 이것을 두 번째로 갈 것이다. 당신은 그것의 심한 남용을 감사하기 위해 열렬하고 엄격한 사용자 또는 LoD의 팬 일 필요는 없으며 아마도 이런 종류의 일들을 코딩하려고 노력할 것입니다. –

+1

동의. 최상위 오브젝트는 비공개가되어야하는 노출 된 속성이있는 너무 많은 하위 레벨 오브젝트의 내부 동작을 너무 많이 알고 있습니다. 관련 메모에서 공용 속성은 "bvc"와 같은 이름을 사용해서는 안됩니다 (다른보기 컨트롤러와 같이 의심스러운 것처럼 들리므로 MVC가 어수선 할 것 같음). Objective-C는 서면의 간결함이 아니라 읽기의 명확성에 기초합니다. 강력한 컴파일러 검사가 부족하여 버그에 대한 가장 강력한 보호 장치 중 하나를 잔인하게 일관되게 명명합니다. –

0

재산 표기법을 과도하게 사용하지 않는다고 생각합니다. 객체에 속성이 있으면 해당 객체에 액세스하십시오. 프로그래머가 무엇을 의미하는지 독자에게 보여줍니다.

아, "구조체처럼 보입니다"여단을 선점했습니다. 만약 당신이 당신의 코드에있는 객체로부터 struc을 말할 수 없다면 당신의 코드를 리팩터링하십시오.

0

처럼 뭔가를 할 수 (즉, 가치를 반환하는 것 이외의 목적으로 일을하는 것에 주로 관심을 갖는 방법이 아닙니다.) 그렇다면 괜찮습니다. 사실, Wil Shipley의 블로그를 확인한 경우, 그는 실제로 필요한만큼 (로컬 변수의 과도한 사용을 싫어하는) 많은 함수 호출을 한 줄로 묶는 팬입니다.

0

이 종류의 디버깅은 항상 가치가있는 것보다 더 문제가 있으므로 각 속성 액세스에 대한 중간 변수를 만드는 경향이 있습니다. 또는 다른 사람들이 제안한 것처럼 리펙토링 도구를 사용하여 사용법 사이트에서 더 스마트하게 보입니다 (메서드에 스마트를 넣음).

0

나는 Chuck 및 의견 작성자에 동의합니다. 귀하의 방법은 너무 많은 다른 개체에 의존하지만 pickerViewControllerhasPickedName:을 입력하면 pickerViewController은 여전히 ​​[picker.bvc.currentResolve.name isEqualToString:message]을 수행해야합니다.

대신 bvchasPickedName:을 넣어 인터페이스 빌더를 사용하여 최상위 객체로 (아마도 id<NamePickerDelegate>를 입력) 대리자로 bvc를 주입 할 수있다. Demeter를 준수하려면 currentResolve 단축키 nameMatches: 방법을 성장 시키십시오.

각 솔루션에서 발생할 수있는 복잡성과 문제로 인해 발생하는 복잡성을 신중하게 고려해야합니다. 원본 코드가 대안보다 간단하고 유지 관리가 쉽다고 판단되면 보관하십시오.

관련 문제