2011-10-02 16 views
0

테스트 클래스를 통해 한 클래스에서 다른 클래스로 전달하려는 변수 또는 개체가 있다고 가정 해보십시오. 테스트 클래스, 요리사 클래스 및 웨이터 클래스가 있다고 가정 해 보겠습니다.마법의 변수를 갖는 것이 좋지 않습니까?

는 나쁜 테스트 클래스에서이 작업을 수행하는 것입니다 :

같은 주에
chef.makeFood(); 
waiter.deliverFood(chef.getFood()) 

, 내가 대신 이렇게해야

chef.makeFood(); 
Food f = chef.getFood(); 
waiter.deliverFood(f); 
+1

차이가 없습니다. 저는 그것을 "마법의 변수"라고 부르지 않을 것입니다. 어느 쪽이든 충분히 읽을 수 있습니다. 그게 제가 따라야 할 기준입니다. – duffymo

+0

숫자가 1보다 적 으면 좋겠지 만 아마 저만 있습니다. 미래의 자아가 2 개월 또는 2 년 후에 데뷔하는 것이 더 쉬울까요? –

+2

두 번째 예제는 "마술 변수"가 아닙니다. 단지 로컬 변수입니다. –

답변

6

마술 변수가 좋지 않습니까?

"마법"의 의미에 달려 있습니다. "마술"이 당신에게 "이해하기 어렵거나 설명하기 어려운 것을하십시오"라는 뜻이라면, 그것은 나쁘다.

chef.makeFood(); 
    waiter.deliverFood(chef.getFood()) 

내가 그 수업은 어떻게하지 않더라도, 그 코드 자체 잘못 아무것도 표시되지 않습니다

는 나쁜 테스트 클래스에서이 작업을 수행하는 것입니다 정상 (비 테스트) 코드에서 사용됩니다.

chef.makeFood(); 
    Food f = chef.getFood(); 
    waiter.deliverFood(f); 

그것은 OK입니다 : 내가 대신 이렇게해야, 같은 주에

(하지만 ... 당신이 우리를 표시되지 않는 디자인/코드에 문제가있는 것입니다) 그 일을하거나하지 않기 위해서입니다. 그것은 코드가 더 가독성이 있다고 생각 하느냐에 달려 있습니다. (개인적으로, 나는 거기에 지역 변수를 귀찮게하지,하지만 그건 그냥 제 생각입니다.) 한편


, 내가 @으로 음식을 들고 "요리사"개체에 대한 DaveNewton의 의견에 동의 " 음식을 만들다". 분명히 반 직관적이며 약간의 "마술"입니다 ... 의도적 인 디자인 선택이라면.

Food f = chef.makeFood(); 
waiter.deliverFood(f); 

과 완전히 getFood() 방법과 Chef 클래스에서 관련된 상태 변수를 제거 :

간단하고 더 나은 디자인이 될 것입니다.

이 가난한 디자인/나쁜 모델링입니다 이유가 있습니다 : 직관적 인 의미에서

  • , 그것은 요리사 객체가 웨이터가 수행 될 때까지 "접시를 들고 주위를 서"한다는 것을 의미한다 그것.

  • 클래스 모델링 관점에서 Chef의 동작을 구현하는 데 필요하지 않은 상태 변수가 있습니다.

    • 코드는 12 개월 시간에 그것을 볼 때 이해하기 (어) 어려울 것이며,

    • 요리사 : 실제 프로그래밍 관점에서

    • , 즉 것을 의미한다 API는 멀티 스레드 키친 시뮬레이션에서 사용하기 어려울 것입니다.

그럼이 마법의 변수가 아닌

+0

네 편집 내용이 내 방해로 잘 확장된다. –

+0

또는 장은 한 손에는 FIFO 더미를 들고 다른 한 손에는 더 많은 음식을 제공합니다. –

1

이 예에 일반화하기 어렵다.

이 간단한 예제에서는 요리사가 'makeFood()'에 대한 참조를 유지할 이유가 없기 때문에 직접 반환해야합니다. (그리고 getFood()를 제거 할 수 있습니다)

그러나 StringBuilder 또는 더 복잡한 "빌더"와 같은 내부 상태를 유지하고 그 결과를 반환하는 경우가 많이 있습니다. 괜찮을 때.

로컬 변수는 일반적으로 디버깅 할 때 끝납니다. 실제로 중요하지 않습니다.

1

을 ( 당신이 "마법 변수"무슨 뜻인지 경우,이 나쁜 .... 위 참조) 대신 여기 종류의 아무것도 : 첫 번째는 당신이 새로 만든 음식 개체에 대한 참조가 필요하지 않은 경우 더 좋을 수 틀림없이 적은 라인을 필요로하며,

chef.makeFood(); 
waiter.deliverFood(chef.getFood()) 

은, 그러나 많은 사람들이 주장 할 수 당신이 참조가 필요하지 않은 경우에도 아래 코드는 읽기 쉽고 깨끗한 지 : 일반적으로

chef.makeFood(); 
Food f = chef.getFood(); 
waiter.deliverFood(f); 

는 것을 유지한다 누구인지 알고하지 않기 때문에 당신은 항상 더 많은 읽을 수있는 코드로 이동하는 것을 시도해야 나중에 코드.

관련 문제