2014-02-21 3 views
1

개체가 다른 개체의 컨텍스트로 전달되는 아래의 다른 대체 패턴이 더 좋은지 알고 싶습니다. 필요한 출력. 발신자/발신자를 인터페이스로 만들고 인터페이스로 전달하려고 시도했지만 실제로 호출자가 누구인지를 아는 것이 좋습니다. 즉 다른 발신자와 구별하고 필요한 경우 별도의 조치를 취하는 것이 좋습니다. ? 퍼즐 조각을 놓치고 있습니까?호출자의 유형에 따라 조치를 취하는 수신자

Caller (CGQuery): 
     public string RenderForLoop() 
     { 
... 
      sb.Append(string.Join("",this.ContentIsCGExpressions.Select(exp => exp.GetProcessedExpression(this)))); 
... 

Callee (CGExpression): 
     public string GetProcessedExpression(object context = null) 
     { 
... 
      retv = ReplaceCodes(retv, context); 
... 
     private string ReplaceCodes(string retv, object context = null) 
     { 
...   retv = ReplaceContextSequenceCode(retv, context); 
      return retv; 
     } 
... 
     private string ReplaceContextSequenceCode(string retv, object context = null) 
     { 
      var _regx = new Regex("(?i)<q_ctx_seq>"); 
      var _matchresult = _regx.Match(retv); 
      while (_matchresult.Success) 
      { 
       string replacement = FetchContextSequenceQueryTableFieldExpression(context); 
       retv = retv.Replace(_matchresult.Groups[0].Value, replacement); 
       _matchresult = _matchresult.NextMatch(); 
      } 
      return retv; 
     } 

     private string FetchContextSequenceQueryTableFieldExpression(object context = null) 
     { 

      if (context != null && context is CGQuery) 
      { 
       return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression(); 
      } 
      return this.CGStatementsUsedAsParamsFor.Any() ? 
       this.CGStatementsUsedAsParamsFor.Single().FetchContextSequenceQueryTableFieldExpression(context) 
       : 
       this.CGQueriesContentFor.Single().FetchContextSequenceQueryTableFieldExpression(); 
     } 

그것은 내가 대해 걱정하는 위의이 행의 (캡슐화를 위반하는 것?)

 if (context != null && context is CGQuery) 
     { 
      return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression(); 
     } 

죄송 I 메인 블록의 코드를 강조하는 방법을 모르겠어요.

답변

0

호출자가 실행할 작업이 들어있는 호출 수신자가 호출 수신자에게 객체를 전달하게하는 방법은 무엇입니까? 피 호출자는 피 호출자가 존재를 인식하지 않고이 작업 내에서 질의를받을 수 있습니다.

일반적으로 호출하는 개체의 클래스에서 동작을 결정하는 것은 좋지 않은 OOP 연습이라고합니다.

+0

나는 당신이 말한대로 대의원을 고려했다; 그래서 당신은 대리자가 GetProcessedExpression의 비 선택적 매개 변수가되어야한다고 말하고 있습니까? 아니면 내가 잘못 알고있어 GetProcessedExpression이 너무 일반적인 엔트리 포인트입니다. 아마도이 호출자와 수신자 사이에 다른 클래스가 있어야할까요? ... –

+0

실제로 제어 흐름에 따라 ** Strategy Pattern ** 또는 ** Visitor **에 대해 더 많이 생각했습니다. ** 위임 **은 다른 수업 (예 : 중앙 서비스 또는 이와 유사한 것)으로 과제를 제출하는 것을 의미합니다. 여기서는 원하는 동작을 실행하는 객체 자체를 넘겨줍니다. –

관련 문제