gpt4 book ai didi

c# - 用于向方法添加入口和导出跟踪的模式

转载 作者:行者123 更新时间:2023-11-30 13:47:15 26 4
gpt4 key购买 nike

当方法有多个导出点时,我试图找出跟踪方法返回值的最佳方法。我有许多方法要添加跟踪。我将介绍我尝试过的内容。

首先,我尝试重构每个方法,使其具有如下所示的单个退出点:

StatusCode CreateResource(string name, string type)
{
Trace.LogEvent("BEGIN CreateResource name=" + name + " type=" + type);
StatusCode status = StatusCode.Ok;
if (!IsValidResourceName(name))
status = StatusCode.InvalidName;
else
{
if (!IsValidResourceType(type))
status = StatusCode.InvalidType;
else
{
if (!SystemOnline())
status = StatusCode.SystemOffline;
//continues to nest with more conditions
}
}
Trace.LogEvent("END CreateResource result=" + status);
return status;
}

但是嵌套的 if 语句使它变得丑陋且可读性差。我大量使用早期退出点作为 guard statements重构这一切只会造成困惑,感觉就像去重构。

我尝试的另一件事是将每个方法包装在另一个跟踪返回值的方法中:

StatusCode CreateResource(string name, string type)
{
Trace.LogEvent("BEGIN CreateResource name=" + name + " type=" + type);
StatusCode status = CreateResource_DONT_CALL_THIS_METHOD(name, type);
Trace.LogEvent("END CreateResource result=" + status);
return status;
}

StatusCode CreateResource_DONT_CALL_THIS_METHOD(string name, string type)
{
if (!IsValidResourceName(name))
return StatusCode.InvalidName;
if (!IsValidResourceType(type))
return StatusCode.InvalidType;
if (!SystemOnline())
return StatusCode.SystemOffline;
return StatusCode.Ok;
}

问题是如何防止将来其他开发人员(或我)调用包装方法并绕过跟踪,因此包装方法的名称可笑(且自相矛盾)。我可以为内部方法定义和调用匿名方法,但在整个项目中使用这种模式非常困惑。

我发现的最可靠和可读性最强的方法是这个,在我看来还不错,但我怀疑这种 for 语句的使用是否会在代码审查中发挥作用:

StatusCode CreateResource_Internal(string name, string type)
{
Trace.LogEvent("BEGIN CreateResource name=" + name + " type=" + type);
StatusCode status = StatusCode.Ok;
for (int i = 0; i < 1; i++)
{
if (!IsValidResourceName(name))
{
status = StatusCode.InvalidName;
break;
}
if (!IsValidResourceType(type))
{
status = StatusCode.InvalidType;
break;
}
if (!SystemOnline())
{
status = StatusCode.SystemOffline;
break;
}
}
Trace.LogEvent("END CreateResource result=" + status);
return status;
}

我尝试了使用 try finally block 的变体:

StatusCode CreateResource_Internal(string name, string type)
{
Trace.LogEvent("BEGIN CreateResource name=" + name + " type=" + type);
StatusCode status = StatusCode.Ok;
try
{
if (!IsValidResourceName(name))
{
status = StatusCode.InvalidName;
return status;
}
if (!IsValidResourceType(type))
{
status = StatusCode.InvalidType;
return status;
}
if (!SystemOnline())
{
status = StatusCode.SystemOffline;
return status;
}
}
finally
{
Trace.LogEvent("END CreateResource result=" + status);
}
return StatusCode.Ok;
}

这里的缺点是可能会在返回之前忘记设置“status”变量,在这种情况下将不会执行跟踪。

我的问题是,是否有执行此操作的最佳实践?我是否需要重构为单个退出点?有什么方法可以防止从其他地方调用包装的方法吗?允许跟踪被绕过的危险是否比重构到单一导出点的不整洁更糟糕?

p.s 我不想引入像面向方面的编程这样沉重的东西。

最佳答案

作为附带答案,您可以查看实现Log4PostSharp,您可以在链接here 中查看教程。 .它可能不会直接回答您的问题,但会对您的场景有所帮助。

关于c# - 用于向方法添加入口和导出跟踪的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com