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