2011-03-17 4 views
1

최근에 제 3 자 해시 함수의 코드를 C++에서 C로 리팩터링했습니다.이 프로세스는 상대적으로 어려움이 없었습니다. 이제 자바에서 같은 함수를 작성하고 싶지만 약간의 문제가 있습니다.C 매크로에 대한 Java 대체

C/C++ 코드에는 몇 가지 정수 변수 이름을 인수로 취해 그 내용과 몇 가지 상수로 비트 연산을 수행하는 C 전 처리기 매크로가 있습니다. 이 매크로는 여러 곳에서 사용되기 때문에 코드 존재 자체가 공정한 코드 중복을 피할 수 있습니다.

그러나 Java에서는 C 전 처리기에 해당하는 것이 없습니다. 메소드에 인수로 전달 된 기본 유형에 영향을 줄 수있는 방법도 없습니다. 심지어 자동 보킹은 변경 불가능한 객체를 생성합니다. Java 메소드가 단일 값을 반환한다는 사실과 결합하여 매크로를 다시 작성하는 간단한 방법을 찾지 못하는 것 같습니다.

  • 어디서나 손으로 매크로 확장합니다 : 그것은 작동합니다을하지만, 코드 중복이 일 장기적으로 흥미를 만들 수 내가 생각

    봉사 부문.

  • 배열을 반환하는 방법을 쓰기 : 이것은 또한 작동합니다,하지만 그것은 반복적으로 같은 코드로 될 것입니다 :

    long tmp[] = bitops(k, l, m, x, y, z); 
    
    k = tmp[0]; 
    l = tmp[1]; 
    m = tmp[2]; 
    x = tmp[3]; 
    y = tmp[4]; 
    z = tmp[5]; 
    
  • 인수로 배열을 취하는 방법을 쓰기 : 이것은 모든 변수 이름이 배열 요소 참조로 축소된다는 것을 의미합니다. 어떤 색인이 어떤 변수에 해당하는지 추적하는 것은 다소 어려울 것입니다.

  • 별도의 클래스를 만듭니다. State을 적절한 유형의 public 필드와 함께 사용하고이를 메서드의 인수로 사용하십시오. : 이것이 현재 솔루션입니다. 이 메소드는 변수의 이름을 유지하면서 변수를 변경할 수 있습니다. 그러나 다른 State 객체간에 값을 앞뒤로 복사하지 않으려면 더 많은 매크로와 변수가 추가 될 때 State 클래스가 점점 더 복잡 해지는 단점이 있습니다.

어떻게 Java로 이러한 C 매크로를 다시 작성하겠습니까? 표준 Java 6 Development Kit (타사 라이브러리 또는 별도의 전 처리기없이)에서 제공하는 기능을 사용하여이를 처리하는보다 적절한 방법이 있습니까?

+1

를 사용하여 매크로에 State 이름을 변경하고 실행처럼 결국 프로그램이 보이는 때까지, 상태를 업데이트하는 방법과 코드의 나머지는 모두 교체 귀하의 코드에 전처리 =). –

+0

당신이하는 것처럼'State' 객체를 사용합니다. – Gabe

+0

"어느 색인이 어떤 변수에 해당하는지 추적하는 것은 다소 어려울 것입니다." 이런 종류의 변수에는 항상 final int 변수가 있습니다. 그래서 아마 그렇게 나쁘지 않을 것입니다. 왜냐하면 여러분이'state [k]'가'state.k'와 매우 비슷하게 보이지만, 여전히 선호되지는 않기 때문입니다. –

답변

3

옵션 3, 자신 만의 MutableInteger 래퍼 클래스를 만듭니다.

struct MutableInteger{ 
    public MutableInteger(int v) { this.value = value;} 
    public int value; 
} 

public void swap3(MutableInteger k, MutableInteger l, MutableInteger m) { 
    int t = m.value; 
    m.value = l.value 
    l.value=k.value; 
    k.value=t; 
} 
+0

+1 이미 Mutable 클래스를 많이 작성했기 때문에 왜 이런 생각을하지 않았는지 알 수 없습니다. 나는 책상 위에 머리를 대고 (부드럽게) 잠을 자거나 더 많은 커피를 마셔야합니다. – thkala

+5

"sleep"옵션을 적극 권장합니다. –

+5

@Stephen 내 수면 메소드는'CryingBabyInterruptedException' 던졌습니다 ;-( – corsiKa

1

별도의 클래스를 생성 예를 들어, 적절한 유형의 공공 분야와 국가 과는 방법

이 인수로하지만, 중간 단계로 그 사용합니다. 그런 다음 리팩토링을 계속하십시오. 이상적으로 클래스 상태는 개인 필드 여야합니다. 매크로를이 상태를 업데이트하는 메소드로 바꿉니다.

System.out.println(State(System.in).hexDigest()); 

마지막으로, C를 SHA1이든 ;-)

+0

+1 이것은 'State' 클래스가 정적이 아닌 한 확실히 작동 할 것입니다. C에서 Java 로의 컨텍스트 전환은 내가 해시를 설정했기 때문에 조금 혼란 스러웠습니다. 메소드는 아무 이유없이 정적 인 것입니다 ... – thkala

+0

@thkala : 자바 코드가 C 코드처럼 보이길 원하든 원하지 않든간에 약간의 의존성이 있습니다. 예를 들어 auth 또는 C 코드가 나중에 변경 될 것이므로 일치시킬 Java 코드를 업데이트해야 할 것입니다. 그런 특별한 경우에는 실제로 유지 관리를 방해 할 수 있기 때문에 더 많은 OO 방식으로 다시 작성하지 않을 수도 있습니다. 그것을 돕기보다는. 그러나 이것이 일회성 재 작성이라면, 확실히 원 리 소스에서 멀리 떨어져있는 리팩토링 도구 일 것입니다. –