2010-03-02 3 views
1

내 응용 프로그램은 ID로 int을 사용하여 메모리와 영구 레지스트리의 개체를 식별합니다. 응용 프로그램의 함수는 id를 인수로 받고, 레지스트리에서 객체를 검색하고 작업을 수행합니다.id 유형 리팩토링

void print(int id, int bar, double zip, int boo) 
{ 
    Object *obj = get_obj_by_id(id); 
    obj->print(bar, zip, boo); 
} 

응용 프로그램이 발전하여 이제 같은 응용 프로그램에 둘 이상의 레지스트리가있을 수 있습니다. 이제 응용 프로그램은 전역 적으로 액세스 할 수있는 '현재'레지스트리를 사용합니다.이 레지스트리는 전역이하는 것처럼 많은 문제를 일으 킵니다.

글로벌 '현재'레지스트리의 개념을 제거하려면 레지스트리에서 개체를 고유하게 식별하는 유형을 도입해야합니다. 사용중인 int의 값을 변경할 수 없으므로 ID 번호 int과 레지스트리의 ID에서 full_id 유형을 만들어야합니다. , 예제 기능은 따라서

void print(full_id id, int bar, double zip, int boo) 
{ 
    Object *obj = get_obj_by_id(id); 
    obj->print(bar, zip, boo); 
} 

ID 인수의 이름 지정 규칙이있다로 변경해야하지만이 엄격 응용 프로그램 전체 따르지 않는, 그래서 ID 인수의 이름에 대해 가정을 할 수 없습니다 또는 항상 첫 번째 인수입니다. 또한 변경해야 할 많은 기능이 있습니다. full_id 유형화 된 ID로 int 유형화 된 ID를 대체하는 가장 효율적이고 안정적인 방법은 무엇입니까?

답변

0

get_obj_by_id에 대한 모든 호출을 찾고 int에서 full_id로 인수를 변경하기 시작합니다. 그런 다음 컴파일하고 컴파일되지 않는 것을 확인한 다음 모든 장소를 찾을 때까지 반복적으로 반복하십시오. 천천히하지만 작동 할 것입니다.

4

아마도 새 유형이 숫자가 아닙니다. 작은 struct과 같은 형식일까요? 귀하의 예제에서 get_obj_by_id() 기능처럼 - 그렇다면

typedef struct _full_id { 
    int registry_id; 
    int object_id; 
} full_id; 

, 당신은 단지 ID를 처리하여 낮은 수준의 기능을 변경하여 시작할 수 있습니다. int 대신 full_id 매개 변수를 사용하도록 해당 함수를 변경 한 후 전체 프로그램을 다시 컴파일하십시오. 이 함수를 호출하는 모든 호출 사이트는 이제 유형 불일치로 인해 오류를보고합니다. 그러면 해당 호출 사이트로 이동하여 매개 변수 유형을 수정할 수 있습니다.

린스, 반복, 결국 결국 모두 고쳐야합니다.

행운을 빕니다 (그리고 나는 당신이 지금, 시작하기 typedef을 사용 좋겠 내기;?)

+0

+1. – Patrick

1

가장 신뢰할 수있는 방법 : 당신이 암시하는 int가 FULL_ID로 변환 할 수 있는지 확인하십시오. 그런 다음 인수를 get_obj_by_id로 full_id로 변경하고 컴파일러가 사물을 변경해야하는 곳에서 작업하게하십시오.

그것은 당신이 ID 할당을 제어 할 수있는 경우

0

, 당신은 특정 레지스트리 및 결정하는() get_obj_by_id에서 ID의 특정 범위를 할당 할 수 있습니다 .. (인간의 오류는 제외) 오히려 비효율적 인,하지만 매우 안정적이다하는 주소를 기입하십시오.

예 :의 typedef이 문제가 더 쉽게 해결 한 것이라고 언급에 대한

Object* get_obj_by_id(int id) 
{ 
    if(id % 2) 
     return registry1[id]; 
    else 
     return registry2[id]; 
}