2014-01-05 3 views
1

데이터를 가져 오기 위해 웹 서비스를 사용하고 있습니다. 프로젝트가 진행됨에 따라 함수간에 전달되는 매개 변수의 수가 증가했습니다. 미래에 사전을 생각할 때 매개 변수를 더 쉽게 읽고 쉽게 추가/제거 할 수 있습니다. 따라서 모든 함수 호출에는 필요한 매개 변수가 모두 포함 된 사전이 하나만있는 매개 변수가 있습니다.긴 매개 변수를 사용하여 함수 이름 최소화

매개 변수를 설정하려면 [aDictionary setObject:foo forkey:@"bar"]을 수행하고 매개 변수를 얻으려면 [aDictionary objectForKey:@"bar"]이되어야합니다.

변수에 쉽게 액세스하려면 모든 일반 매개 변수가 속성으로 사용 된 Model 클래스를 사용하는 것이 좋습니다. 따라서 하나의 함수 호출에 대해 10 개의 속성 중 3 개가 사용되며 나머지는 설정되지 않습니다. 그래서 그것은 paramModel.foo = @"bar"과 같을 것입니다.

이렇게하면 어떻게 초기화되지 않은 사용되지 않는 속성에 대한 메모리가 낭비됩니까? 그렇게하는 것이 옳은가?

답변

1

아니요, 이상합니다. (물론 주관적인 의견입니다.)

A. "프로젝트가 진행됨에 따라 함수간에 전달되는 매개 변수의 수가 증가했습니다."

소프트웨어의 크기와 메서드 매개 변수의 수 사이에는 연결 만 있습니다 (예를 들어 기능이 없음). 디자인에 문제가있는 경우.

코드를 모듈로 나눠서 클래스로 정의하고 이들 사이의 좋은 관계를 정의하십시오. 연결된 데이터를 저장할 수있는 클래스를 정의하십시오.

[receiver doSomethingWithA:@"a" 
         B:@"b" 
         C:@"c"]; 

NSMutableDictionary *aDictionary = [NSMutableDictionary new]; 
[aDictionary setObject:@"a" forKey:@"A"]; 
[aDictionary setObject:@"b" forKey:@"B"]; 
[aDictionary setObject:@"c" forKey:@"C"]; 
[receiver doSomethingWithABC:aDictionary]; 

(이 추가 인스턴스 객체를 필요로하기 때문에) 그것은, 더 복잡한 코드 더 많은 코드입니다, 인수와 "매개 변수 대상 : 사전을 사용하여 더 많은 읽을하게 내가 무엇을 볼 수 없습니다

B., "따로 떨어져있다.

메서드 내부에서 사전에서 인수를 읽어야합니다. 이것은 보일러 플레이트의 추가 코드입니다.

+0

옵션 B와 같은 작업을하고 싶었습니다.내가 읽을 수 없다고 언급했듯이, 모든 매개 변수를 보유 할 다른 클래스를 사용하는 것을 피하기 위해. 어떤 함수는 6 ~ 10 개의 매개 변수를 사용하기 때문에 호출을 최소화해야합니다. – user88975

+0

다른 클래스는 첫 번째 명령문의 일반적인 사용보다 더 복잡합니다. –

2

계속 : Amin Negm-Awad 's points : 많은 방법으로 많은 매개 변수를 전달하는 경우 거의 틀림없이 모델 클래스가 잘못 정의 된 것입니다. 일반 사전을 만드는 대신 관련 속성을 보유하는 간단한 값 개체를 만듭니다.

예를 들어, NSURL을 고려하십시오. 이 작업을 수행하지 않을 것 :

NSURL *URL = [[NSURL alloc] initWithScheme:scheme host:host path:path]; 
[self handleURL:URL]; 

이 매개 변수를 통합하고 디자인을 개선하기 위해 올바른 방법입니다 :

[self handleScheme:scheme host:host path:path]; 

이 대신이 작업을 수행.

또한 부울 매개 변수 나 다른 종류의 "옵션"을 많이 사용하는 경우 먼저 너무 많은 일을하는 메서드가 있는지 고려하십시오. 아마 그것은 단지 각각이 특정한 방법으로 작동하는 여러 방법으로 분해되어야합니다. ObjC에서 여러 부울 옵션을 실제로 전달해야하는 경우 많은 매개 변수가 아닌 비트 필드를 사용하여이 작업을 수행하는 경우가 많습니다. 예를 들어 [NSString rangeOfString:options:]을보십시오.

관련 문제