Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 静态或对象什么';这样比较好吗?_C#_.net_Oop - Fatal编程技术网

C# 静态或对象什么';这样比较好吗?

C# 静态或对象什么';这样比较好吗?,c#,.net,oop,C#,.net,Oop,我有一个类似于以下内容的WCF方法: public GetRecordsResponse GetRecords(GetRecordsRequest request) { GetRecordsResponse response = new GetRecordsResponse(); Util.GetRecords.VerifyMandatoryParameters(request); //ma

我有一个类似于以下内容的WCF方法:

public GetRecordsResponse GetRecords(GetRecordsRequest request)
        {
            GetRecordsResponse response = new GetRecordsResponse();

                Util.GetRecords.VerifyMandatoryParameters(request);
                //make sure mandatory parameters have correct values.
                Util.GetRecords.SetDefaultValues(request);

                Util.GetRecords.SetDefaultResponseValues(request, response);

                DataReader.GetRecords.GetAllRecords(request, response);

            return response;
        }

我把整个DAL和许多Helper方法作为静态类和方法,这是错误的吗?如果是这样,为什么?

这是主观的问题,但我认为静态方法通常是邪恶的(除了极少数情况)

下面是一个讨论这是一个问题原因的演讲的链接:


虽然演讲者谈论的是Java,但它是一种非常相似的语言,两种语言中使用静态方法的方式几乎相同。

由于使用静态方法,您可以访问属性和字段等实例变量,这意味着您需要将请求传递给每个方法

如果您使用GetRecords的实例,您可以做一些事情

   GetRecords gr = new gr();
   gr.Request = request;
   gr.VerifyMandatoryParameters();
   gr.SetDefaultValues();
   gr.SetDefaultResponseValues(response);
   gr.GetAllRecords();
同样,如果你实现了一个流畅的界面,你也可以这样写

   GetRecords gr = new gr();
   gr.SetRequest(request)
     .VerifyMandatoryParameters()
     .SetDefaultValues()
     .SetDefaultResponseValues(response)
     .GetAllRecords();
但是你所做的没有什么“错”

简言之,是的

我认为您对代码执行的单元测试很少甚至没有。如果您计划在任何时候添加任何内容;一个静态访问的DAL将给你带来无尽的悲伤(我现在正在处理这个确切的场景)

相反,您应该传入一个DataAccessService接口,该接口可以模拟进行测试,并指向生产中的实际数据存储实现

因此,我希望您的代码看起来更像:

public GetRecordsResponse GetRecords(GetRecordsRequest request, DataAccessService dataAccess)
        {
            var response = new GetRecordsResponse();

            Util.GetRecords.VerifyMandatoryParameters(request);
            Util.GetRecords.SetDefaultValues(request);    
            Util.GetRecords.SetDefaultResponseValues(request, response);

            dataAccess.GetAllRecords(request, response);

            return response;
        }

就个人而言,我们在DAL(数据访问层)中使用了几种静态方法。请注意,你的工厂没有创造太多的东西。我最想做的是命名。如果代码中有实名,可能还有改进的余地。因为您必须验证强制参数,这些参数对于每个RequestObject都不同,但对于RequestObject是特定的,因此我建议您使用DAL类创建专用方法。同样,使用整个DAL静态也没有什么好处(没有单元测试?)我唯一使用
static
方法的时候是针对实用程序的。我发现要求创建/使用新实例同样简单(我发现这通常可以修改为注入/存根/测试/接口,在使用静态方法时很容易“放弃”)。希望您传递的GetRecordsRequest参数是线程安全的。感谢Conrad。。。请你详细说明你的第一句话好吗。我如何不必将请求传递给每个方法?你的意思是我将拥有一个主GetRecords对象,我将在其中传递调用所有util方法以及DAL方法的请求?谢谢,我感谢你的更新(+1)。请原谅我没有马上给你这个问题的答案。我想让它“酝酿”,看看是否有新的想法出现。