我想知道是否存在除下面之外的一些替代更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象又使用上下文或缺少逻辑来构建必要的输出。我已经尝试将调用者/发送者作为接口并将其自身作为接口传递,但真正的问题是被调用对象甚至知道其调用者是谁,即将其与其他调用者区分开来并在必要时采取单独操作的良好实践?我错过了拼图吗?
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();
}
抱歉,我不知道如何突出显示主要块中的代码。
答案 0 :(得分:0)
让调用者将一个对象传递给包含要执行的操作的被调用者怎么样?可以在此操作中查询调用者,而被调用者不知道其存在。
一般来说,我会说在决定调用对象的类上的行为是不好的OOP练习。