2011-12-15 3 views
2

필자는 시스템에 명령 패턴을 구현했습니다. 주로 여러 계층이 있고 논리를 원격으로 호출해야하기 때문입니다.명령 패턴에 대한 추악한 경험 : OOP의 모든 점은 무엇입니까?

class DoWorkCommandMessage { int param; } 

class DoWorkCommandHandler : Handler<DoWorkCommandMessage> 
{ 
    Execute(MyObject object) { 
     object.DoWork(message.param); 
    } 
} 

class MyObject 
{ 
    void DoWork(int param) { 
     _proxy.SendMessage(new DoWorkBinaryMessage(param)); 
    } 
} 

당신은 내가 기본적으로 다음 다른 계층에 전송되는 메시지로 다시 변환하는 메서드 호출로 변환, 메시지는 무엇입니까 볼 수 있듯이.

여기 뭔가 잘못 된 것 같습니다.

모든 메서드를 제거하기 위해 리팩터링하는 작업이 끝나고 간단한 ProcessMessage 메서드로 바뀌 었습니다.이 메서드는 메시지를 가져 와서 변환 한 다음 디스패치합니다. myObject에 대부분 단지 변환 코드가 아닌 '객체'었죠 제외

단위 테스트하기 위해 내가 대신 간단한 메서드 호출을 만드는) processMessage를을 (계속 전화해야 ... 확인했다 .

"메시지 & 변형"과 "메시지 -> 방법 -> 메시지"사이의이 전투에 대한 생각을 찾고 있습니다. 분명히 메시지와 방법은 매우 밀접하게 관련되어 있습니다.

+0

MyObject에서 동작이나 논리를 사용할 수없는 이유는 무엇입니까? 당신의 "MyObject"가 좀 더 구체적 일 수 있고 프록시로 서 있기보다는 로직을 수행 할 수 있습니까? – Thurein

+0

MyObject는 실제로 필드에있는 하드웨어의 비트를 나타내는 "개체"입니다. 서버에는이 분야에 수천 개의 하드웨어 장치가 있기 때문에 그러한 많은 객체가 있습니다. 실제 하드웨어 장치는 대부분의 상태를 유지하고 메시지를 보내며 본질적으로 가장 최근의 상태를 서버에 캐시합니다. 나는 OOP 방식으로이 장치를 모델링할지 아니면 그냥 귀찮게하지 않을지에 관해서 찢어진 것이다. 단위 테스트를 작성하면 좋은 방법으로 테스트 할 수있다. 그렇지 않으면 전혀 사용하지 않는다. – Schneider

+0

항상 달성하려고하는 것에 의존한다. . 당신이 필요로하지 않았던 것처럼 보입니다. – ivowiblo

답변

1

나는 혼란 스럽거나 어려움이 실제로 명령 패턴을 사용하지 않는다고 생각합니다. 메시징으로 믹싱 해. 당신은 당신의 명령의 이름으로 이것을 볼 수 있습니다 ... DoWorkCommandMessage. 고전적인 명령 패턴에서 작업은 실제로 Command 객체에 의해 수행됩니다. 메시징 접근법에서 메시지는 DTO로 전달되고 처리기에 의해 실행됩니다.

더 설명하기 위해

, 내가 사용하는 응용 프로그램이

AbstractCommand 
+ Execute() 
+ CanUndo() 
+ Undo() 
+ CanChain(cmd) 
+ Chain(cmd) 

그 클래스의 구체적인 예는 다음과 같습니다

MoveUnitCommand // a unit is a graphic piece on a game board 
+ UnitId 
+ Destination 
+ Execute() 
    { 
     units = Units.Find(UnitId) 
     prevCoords = units.Position 
     units.Position = Destination 
    } 
+ CanUndo() { return true; } 
+ Undo() 
    { 
     units = Units.Find(UnitId) 
     units.Position = prevCoords 
    } 
+ etc, etc 

명령 서브 클래스는, 그것을 무엇을 설명하지 않습니다하는 것으로 실제로 시스템 상태에 따라 작동합니다.

+0

원격 명령을 사용하려면 메시징을 사용해야합니다. 명령을 멀리 할 수 ​​없다는 말입니까? 이것은 어디 까지나 명령 처리자 패턴을 사용하여 끝납니다. 명령은 데이터 (메시지)와 코드 (핸들러) 부분으로 나뉩니다. 내 qn에서 내 "개체"가 다른 계층으로 명령 메시지를 전달하는 것을 끝내는 사실에 대해 고뇌하고 있습니다. 이 메시지가 실제로 개체인지 아닌지에 대한 실존 적 위기가 있습니다. 메시지를 다른 계층으로 보내는 방법으로 메시지를 변환해야합니까? 그렇지 않다면 나는 빈혈증 환자로 끝납니다. 아마도 괜찮습니다. 조언을 원합니다 (도덕적 지원!) – Schneider

+0

내 대답은 "명령 패턴"의 사용을 코딩 한 사람에게 더 많은 의견을 말했습니다. 적어도 고전적인 의미에서는 (모든 패턴 사용이 회색 음영을 가졌지 만) 실제로는 아닙니다. 다른 문제를 해결하기 위해 후속 질문이 있습니다.모든 "명령"은 실제로 메시지가 프로세스 (원격)에서 전송되는 것입니까? 그렇다면, 나는 그들을 단지 메시지로 리팩터링하고 명령 관련 코드를 잊어 버릴 것이다. 직렬화 구현에서 Message를 분리하는 것을 고려해 볼 필요가있는 경우 전선에서 여러 "프로토콜"을 지원할 수 있습니다. – tcarvin