Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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#_Design Patterns_Coding Style_Clean Architecture - Fatal编程技术网

C# 基于干净的代码原则,我的两个示例中哪一个是正确的?

C# 基于干净的代码原则,我的两个示例中哪一个是正确的?,c#,design-patterns,coding-style,clean-architecture,C#,Design Patterns,Coding Style,Clean Architecture,我知道有些人会说这是一个基于意见的问题,但我真的不这么认为,因为这已经是一个惯例,但我遗漏了一些东西 我试图更好地理解干净的编码方式,有时我只是对正确的方法感到困惑 我将使用系统上带有广告的自动登录作为示例。 规则说:用户可以使用广告帐户登录系统。如果他还未被“允许”使用系统,我们必须检查设置中的参数。如果参数显示AutoCreation TRUE,我们将创建一个新凭据并允许他登录 好的,我说,代码来了: // WE HAVE CODE HERE var userInfo = GetUserIn

我知道有些人会说这是一个基于意见的问题,但我真的不这么认为,因为这已经是一个惯例,但我遗漏了一些东西

我试图更好地理解干净的编码方式,有时我只是对正确的方法感到困惑

我将使用系统上带有广告的自动登录作为示例。 规则说:用户可以使用广告帐户登录系统。如果他还未被“允许”使用系统,我们必须检查设置中的参数。如果参数显示AutoCreation TRUE,我们将创建一个新凭据并允许他登录

好的,我说,代码来了:

// WE HAVE CODE HERE
var userInfo = GetUserInfo(request);
if (userInfo == null)
{
    if (IsAutoUserCreationSettingsEnabled())
        userInfo = AutoCreateUser(request);
}
//AND WE HAVE MORE CODE HERE
GetUserInfo方法只调用了数据层并返回了找到的用户。 如果用户为NULL,我们现在调用另一个方法来检查IsAutoUserCreationSettingsEnabled,它标识自动创建是true还是false,如果为true,则在数据库上创建用户

看起来还可以,但是因为我的方法(主方法)有更多的规则,所以5行的函数是不可能的。 因此,我在想,如果正确的方法不是将所有细节都放在GetUserInfo方法上,那么就可以获得用户。因此,主要的方法是:

// WE HAVE CODE HERE
var userInfo = GetUserInfo(request);
//AND WE HAVE MORE CODE HERE

//Get the user from database and more CODE
if (userInfo == null)
{
    if (IsAutoUserCreationSettingsEnabled())
        userInfo = AutoCreateUser(request);
}
//more CODE
进入GetUserInfo的内部。 但是我觉得GetUserInfo(AndCreateUser)方法现在有两个职责,这是错误的

所以现在我对它到底应该如何工作感到困惑。 做一个干净的程序员,正确或更好的方法是什么

提前谢谢各位

**编辑**

更改了方法GetUserAutoCreationStatus()的名称和用法

也就是说,AutoCreateUser方法为某些字段创建通用数据,并在数据库上创建用户。用户将在下次访问时使用其数据更改通用数据

**编辑²**

根据@BionicCode的评论,我想现在应该是这样的:

private void AFewLinesBefore()
{       
  AFewCodeLinesBefore();
  ValidateRequisites(request);
  var userInfo = GetValidUserInfo(request);  
  AFewCodeLinesAfter();
}
在我的GetValidUserInfo上,我应该有:

private UserInfo GetValidUserInfo(LogInUserWithADRequest request)
{
    var userInfo = GetUserInfo(request); 

    if (userInfo == null)
    {
        if (IsAutoUserCreationSettingsEnabled())
        {
            userInfo = AutoCreateUser(request);
        }
    }
    return userInfo;
}

private void AFewCodeLinesBefore()
{
    ...
}

private void AFewCodeLinesAfter()
{
   ...
}

据我所知,这两种方法都会为用户获取一些信息,我猜它们所在的类是某种授权用户类型的类。因此,就我所认为的单一责任而言,AutoCreateUser函数应该在用户创建类中,如果它们所处的类是某种授权类,那么其余的就可以了。

这看起来更适合于。如果
GetAutoUserCreationStatus
告诉您是否启用了自动用户创建,为什么不将方法名称更改为该名称?然后,不需要变量来明确方法调用的作用。一般来说,如果我遇到这段代码,我会发现它很容易理解。有些代码只会触发警报。这并不完全正确。从这个用法,有人可能推断出这个方法的作用。但是如果“获取自动用户创建状态”真的意味着“不存在的用户是自动创建的”,那么它不是一个好的方法名称。如果我们发现自己在说,“当我说这个的时候,我是说那个”,那么为什么不直接说那个呢?不要在方法之间移动代码。如果要减少方法的行数,请将行提取为新方法。您可以按职责和抽象级别设计方法,就像使用更专门的低级操作的高级方法一样。在您的情况下,应该引入一个名为
GetValidUserInfo()
的新方法。此方法包装对
GetUserInfo
的调用和对
AutoCreateUser()
的处理。通过这种方式,您可以减小方法的大小并封装责任和行为。只需选择相关的代码行,并将它们提取到一个具有描述性名称的新方法中。回答您的问题不再可能,因为一些忙碌的人将您的线程标记为“太宽”,从而关闭了您的线程。对不起,是的。这基本上就是我的意思。您可以继续将代码(从提取的方法)提取到新方法,直到它不再可能(或不再有意义)。通过这种方式,您的代码变得更具可读性,因为您将一个具有通用名称的通用方法拆分为几个专门的方法,这些方法执行非常特定的任务,因此具有非常特定的名称。autocreation方法调用此AD用户的数据层(因为它不在我们的系统数据库中)。