2010-12-01 4 views
0

에 따라 나는 전화 중 하나 GUI 나 비 그래픽 환경 "이야기"하는 가장 편리한 가장 좋은 방법은 방법은 무엇 (배치 모드)
변경 코드 동작 상황

을 형성 할 수있는 클래스가 배치 모드에서 실행될 때 코드의 GUI 관련 부분을 실행하지 마십시오. 내가 못생긴 추적 경우를 방지 할

나는

public MyMethod() 
    {    
     [@TAG: DOTHIS_ONLY_IF_GUIMODE] 
     ShowPanels(); 
     .... 
    } 

같은 것을 생각 그리고 GUI_MODE_ACTIVATED는, 어딘가에 true 또는 런타임에 false로 설정 프로그램이

에서 호출되는 위치에 따라 할 것/다른 것들은 제 코드 전체에 흩어져 있습니다.
내 작은 엄지 손가락은 AOP가 갈 길이라고 말해 준다. (그러나 더 간단한 대안을 찾으면 내가 갈 것이다.)
그래서, 가장 단순하고 간단한 방법은 무엇일까요?

업데이트 : 대부분의 참여자가 지적했듯이, 비즈니스 코드에서 GUI 코드를 분리하는 엄지 손가락의 규칙입니다,하지만 난 여전히 NO GUI가을 포함하더라도이 작업을 수행하는 방법을 알고에 관심이 있어요 (즉, 배치 모드에서 실행될 때 실행하지 않는 코드의 GUI 관련 부분을 "말씀"하는 가장 편리한 가장 좋은 방법은 방법은 무엇 예를 들어 두 개의 서로 다른 환경에서 서로 다른 두 가지 BATCH 모드)

답변

3

나는 GUI의 특정 코드를 클래스 밖으로 가져 와서 클래스 처리시 주요 시간에 트리거 된 이벤트를 구현하는 것이 가장 좋습니다. GUI에서 호출 할 때 GUI 코드는 해당 이벤트를 구독하고 '올바른 일을합니다.' 배치 코드는 이벤트를 무시하고 모두 정상입니다.

+0

완벽! 이미 어떻게 든 (ShowPanels 메서드는 실제로 이벤트를 발생시킵니다.)하지만 일괄 처리 모드에서 해당 이벤트를 구독하지 않을 때 어떤 이유로 NullPointer 예외가 발생하여 해당 옵션의 유효성을 의심하게되었습니다. 내 코드를 더 자세히 점검 할 것이다. –

+1

전화하기 전에 null 이벤트를 확인하십시오. – n8wrl

+1

이것은 정확히 제가 제안하려고 생각한 것입니다. – mlibby

0

.

이 때문에 비즈니스 논리 문제가 UI 관련 문제와 구분됩니다.

그래서 가장 간단한 방법은 무엇입니까?

UI 관련 문제와 비즈니스 논리가 별개입니다.

+0

나는 그것을 알고있다. 그러나 나는 진정한 선택의 여지가 없다. 나는 반드시 그것을 극복해야만하는 레거시 코드를 가지고있다. –

+0

@Mika Jacobi : 당신이하는 일은 선택의 여지가 없다는 것을 의미합니까? 당신은 분명히 지금 리팩토링 중입니다. – jason

+0

그보다 조금 더 복잡합니다. 응용 프로그램의 아키텍처가 상당히 엄격합니다. (나는 당분간 내 응용 프로그램에 의해 호출되는 코드이므로) 모든 결과를 마스터하지 않으므로주의해야합니다. . –

0

가장 간단하고 직접적인 방법은 if 문을 사용하는 것입니다.

간단하지 만 구조화 된 방법으로 ShowPanels 메서드를 추상화 한 다음 GUI 모드와 배치 모드의 두 클래스를 파생시킵니다.

+0

언급 한 두 번째 아이디어는 흥미 롭습니다. 내가보기에 유일한 단점은 클래스의 복사본이 2 개가 있어야한다는 것입니다. –

+0

아니요 : 일반적인 로직 (코드의 대부분은 기본 클래스에 있습니다)이 기본 클래스에 있습니다. 파생 클래스에는 GUI 모드 또는 일괄 처리 모드에 특정한 논리 만 포함됩니다. –

+0

오키 도키! 게시물에 대한 내 업데이트에 유용합니다. 고맙습니다 –

0

Add Aspects to Object Using Dynamic Decorator .

클래스는 프레젠테이션이 아닌 비즈니스 논리에만 관련되어야합니다 (GUI 또는 일괄 처리 등). 런타임시 프레젠테이션 (GUI 또는 비 GUI) 코드를 필요에 따라 클래스의 객체에 연결할 수 있습니다.

클래스 정의에 추한 속성 코드가 필요하지 않습니다.