Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类方法中的Console.Writeline。更好的设计_C#_Interface_Console_Console Application_Testability - Fatal编程技术网

C# 类方法中的Console.Writeline。更好的设计

C# 类方法中的Console.Writeline。更好的设计,c#,interface,console,console-application,testability,C#,Interface,Console,Console Application,Testability,我正在编写一个简单的控制台应用程序,我希望能够打印到屏幕上 public class Car{ public void Drive(){ //Here I want to print that the car is driving } } 我可以在我的Drive()函数中使用Console.writeline(),但我认为这不是一个好的设计,因为将来我可能希望将其记录到一个文件中。实现这种多输出日志功能的最佳设计是什么? 是否有控制台和文件输出(Iwritabl

我正在编写一个简单的控制台应用程序,我希望能够打印到屏幕上

public class Car{
    public void Drive(){
        //Here I want to print that the car is driving
    }
}
我可以在我的Drive()函数中使用Console.writeline(),但我认为这不是一个好的设计,因为将来我可能希望将其记录到一个文件中。实现这种多输出日志功能的最佳设计是什么?
是否有控制台和文件输出(Iwritable)的公共接口,我可以将其传递给驱动程序(),以便处理这两种类型的输出。或者有更好的设计来实现这一点吗?

考虑这样的事情很好。它肯定会帮助你完成更复杂的项目。您当然可以创建一个IWritable接口或具有具体实现的抽象类。比如:

public interface IWritable
{
    void Write(string text);
}

public class ConsoleWriter : IWritable
{
    public void Write(string text)
    {
        Console.WriteLine(text);
    }
}
然后您的
Drive()
方法可以接受
IWritable
参数

public class Car
{
    public void Drive(IWritable writable)
    {
        writable.Write("I'm driving!");
    }
}

new Car().Drive(new ConsoleWriter());

当然,如果您的类有几种方法需要做类似的事情,您可以考虑更改构造函数以接受<代码>可写的参数,并将其存储在字段:

中。
public class Car
{
    private readonly IWritable _writer;

    public Car(IWritable writer)
    {
        _writer = writer;
    }

    public void Drive()
    {
        _writer.Write("I'm driving!");
    }
}

这样做的另一个好处是它使类的单元测试变得更加简单。您可以将一些无害的编写器传递给它,这些编写器不会弄乱日志文件或更新数据库,但还是让我们来测试这个类。

“最佳”通常取决于需求和环境。没有人是最优秀的。这里有一个让你开始的想法;您可以将参数(可能是
enum
)传递给
Drive()
方法,说明所需的日志类型:文件、控制台等,并相应地写入输出。控制台将方法输出写入标准输出。您可以将其重定向到一个文件,而无需对程序进行任何更改。打印是应用程序的一项功能,与其余逻辑无关,我可以使用单例来实现这一点,也可以使用AOP来实现安全性等交叉关注。查看Spring AOP或AspectJ感谢您指出这样思考是必要的。也许你想删除上面的草率否决票:)