gpt4 book ai didi

c# - 这个类最好的设计是什么?

转载 作者:行者123 更新时间:2023-11-30 14:41:04 25 4
gpt4 key购买 nike

假设这个类:

public class Logger
{
static TextWriter fs = null;

public Logger(string path)
{
fs = File.CreateText(path);
}

public static void Log(Exception ex)
{
///do logging
}

public static void Log(string text)
{
///do logging
}
}

我必须像这样使用它:

Logger log = new Logger(path);

然后使用 Logger.Log() 记录我想要的内容。我只使用一个记录器。问题是:这是一个好的设计吗?实例化一个类然后总是调用它的静态方法?任何更好设计的建议都会受到赞赏。

根据 Marc 编辑的回答:

我在 Log 的最后一行刷新,打开文件时我不需要读取文件,文件未完全关闭的问题是正确的。这个类只是满足我的要求,不需要线程安全。我只想读一下实例化部分,我应该进入你说的 SetPath,有关闭文件的建议吗?

最佳答案

是的,只为此使用构造函数是糟糕的设计。可以仅调用一次(否则抛出异常)的静态SetPath 方法似乎更好。您可以在应用程序启动等期间设置路径。

然后你可以让它成为一个static class,或者如果它需要满足一些基于接口(interface)的场景需要一个单例。

接下来:您必须在此处添加同步!那不是线程安全的。如果两个线程同时尝试记录,我希望这会崩溃。它不需要很复杂;最简单的:

private readonly object syncLock = new object();
public static void Log(string value) {
lock(syncLock) {
//...
}
}

(但请注意,这可能会产生一些阻塞成本;这可以通过更复杂的代码进行改进 - 见下文)

现有的日志库会考虑更多问题——文件分区、异步(以阻止您的代码被 IO 阻塞)、批处理等;为什么不只使用其中一个呢?特别是,此时您的文件不会在应用程序退出时完全关闭,不会定期刷新,并且大部分时间都会保持文件锁定。不好。

关于c# - 这个类最好的设计是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638747/

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