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 메인 블록의 코드를 강조하는 방법을 모르겠어요.
나는 당신이 말한대로 대의원을 고려했다; 그래서 당신은 대리자가 GetProcessedExpression의 비 선택적 매개 변수가되어야한다고 말하고 있습니까? 아니면 내가 잘못 알고있어 GetProcessedExpression이 너무 일반적인 엔트리 포인트입니다. 아마도이 호출자와 수신자 사이에 다른 클래스가 있어야할까요? ... –
실제로 제어 흐름에 따라 ** Strategy Pattern ** 또는 ** Visitor **에 대해 더 많이 생각했습니다. ** 위임 **은 다른 수업 (예 : 중앙 서비스 또는 이와 유사한 것)으로 과제를 제출하는 것을 의미합니다. 여기서는 원하는 동작을 실행하는 객체 자체를 넘겨줍니다. –