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感谢您指出这样思考是必要的。也许你想删除上面的草率否决票:)