C#:简化代码

C#:简化代码,c#,oop,C#,Oop,我非常喜欢简化代码以实现可扩展性。我曾试图简化这段代码,但我总是陷入困境。有人知道我如何简化这段代码吗?因为它包含很多丑陋的if。过度复杂化的原因是传递给方法的变量数量。这些都是必需的 谢谢 private void SetVisibility(int AuctionID, int BidStatus, int LoginErrorCode, int IsHome, bool IsGetMoreTokens) { this._dealBidPlacedControl.Visibl

我非常喜欢简化代码以实现可扩展性。我曾试图简化这段代码,但我总是陷入困境。有人知道我如何简化这段代码吗?因为它包含很多丑陋的if。过度复杂化的原因是传递给方法的变量数量。这些都是必需的

谢谢

private void SetVisibility(int AuctionID, int BidStatus, int LoginErrorCode, int IsHome, bool IsGetMoreTokens)
{
        this._dealBidPlacedControl.Visible = false;
        this._dealBidControl.Visible = false;
        this._loginReg.Visible = false;
        this._deals.Visible = false;            

        if (AuctionID > 0)
        {
            if (LoginErrorCode == 0)
            {
                if (BidStatus > 0)
                {
                    this._dealBidPlacedControl.Visible = true;
                }
                else
                {
                    this._dealBidControl.Visible = true;
                }
            }
            else
            {
                this._loginReg.LoginErrorType = LoginErrorCode;
                this._loginReg.Visible = true;
                this._deals.Visible = true;
            }
        }
        else
        {                
            this._loginReg.Visible = true;
            this._deals.Visible = true;                
        }

        if (IsGetMoreTokens)
        {
            this._getMoreTokens.Visible = true;
            this._loginReg.Visible = false;
            this._deals.Visible = false;     
        }

        // set the hidden field which can be used to set visibility if included in a tab control or anything
        // by the parent site
       if (this.AuctionID > 0 || BidStatus > 0 || IsHome > 0 || LoginErrorCode > 0 || IsGetMoreTokens)
            this._visibilityStatus.Value = "1";   
}

您可以尝试通过直接设置布尔值来简化代码,而不是创建if语句并指定
true

_dealBidPlacedControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus > 0
例如:

bool hasAuction = AuctionID > 0;
bool hasLoginError = LoginErrorCode != null;
bool hasBidStatus = BidStatus > 0;

this._dealBidPlacedControl.Visible = hasAction && !hasLoginError && hasBidStatus;
this._dealBidControl.Visible = hasAction && !hasLoginError && !hasBidStatus;
this._loginReg.Visible = this._deals.Visible = !hasAction || hasLoginError;

if (hasAuction && hasLoginError)
{
  this._loginReg.LoginErrorType = LoginErrorCode;
}

if (IsGetMoreTokens)
{
  this._getMoreTokens.Visible = true;
  this._loginReg.Visible = false;
  this._deals.Visible = false;     
}

// set the hidden field which can be used to set visibility if included in a tab control or anything
// by the parent site
if (this.AuctionID > 0 || BidStatus > 0 || IsHome > 0 || LoginErrorCode > 0 || IsGetMoreTokens)
        this._visibilityStatus.Value = "1"; 

就我个人而言,我喜欢将控制外观的代码移到更靠近控件的位置。避免使用大量gui逻辑混乱代码,如下所示:

private void SetVisibility(int AuctionID, int BidStatus, int LoginErrorCode, int     IsHome, bool IsGetMoreTokens)
{
    this._dealBidPlacedControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus > 0;
    this._dealBidControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus <= 0;
    this._loginReg.LoginErrorType = LoginErrorCode;
    this._loginReg.Visible = !IsGetMoreTokens && LoginErrorCode != 0;
    this._deals.Visible = !IsGetMoreTokens && LoginErrorCode != 0;
    this._getMoreTokens.Visible = IsGetMoreTokens;

    // set the hidden field which can be used to set visibility if included in a tab control or anything
    // by the parent site
    if (this.AuctionID > 0 || BidStatus > 0 || IsHome > 0 || LoginErrorCode > 0 || IsGetMoreTokens)
        this._visibilityStatus.Value = "1";   
}
this._dealBidPlacedControl.Visible = AuctionId > 0 && LoginErrorCode == 0 && BidStatus > 0;
this._dealBidControl.Visible = AuctionId > 0 && LoginErrorCode == 0 && BidStatus <= 0;
this._loginReg.Visible = AuctionID > 0 && LoginErrorCode != 0;
this._deals.Visible = LoginErrorCode != 0 && !IsGetMoreTokens;
private void SetVisibility(int-AuctionID、int-BidStatus、int-LoginErrorCode、int-IsHome、bool-isgetmoretokes)
{
此.u dealbiddplacedcontrol.Visible=AuctionID>0&&LoginErrorCode==0&&BidStatus>0;
这是._dealBidControl.Visible=AuctionID>0&&LoginErrorCode==0&&BidStatus 0 | | BidStatus>0 | | IsHome>0 | | LoginErrorCode>0 | | isGetMoreTokes)
这是.\u visibilityStatus.Value=“1”;
}

如果你有一个昂贵的操作,你可以把它缓存在一个局部变量中,但我会这样做。

你可以使用布尔表达式,如下所示:

private void SetVisibility(int AuctionID, int BidStatus, int LoginErrorCode, int     IsHome, bool IsGetMoreTokens)
{
    this._dealBidPlacedControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus > 0;
    this._dealBidControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus <= 0;
    this._loginReg.LoginErrorType = LoginErrorCode;
    this._loginReg.Visible = !IsGetMoreTokens && LoginErrorCode != 0;
    this._deals.Visible = !IsGetMoreTokens && LoginErrorCode != 0;
    this._getMoreTokens.Visible = IsGetMoreTokens;

    // set the hidden field which can be used to set visibility if included in a tab control or anything
    // by the parent site
    if (this.AuctionID > 0 || BidStatus > 0 || IsHome > 0 || LoginErrorCode > 0 || IsGetMoreTokens)
        this._visibilityStatus.Value = "1";   
}
this._dealBidPlacedControl.Visible = AuctionId > 0 && LoginErrorCode == 0 && BidStatus > 0;
this._dealBidControl.Visible = AuctionId > 0 && LoginErrorCode == 0 && BidStatus <= 0;
this._loginReg.Visible = AuctionID > 0 && LoginErrorCode != 0;
this._deals.Visible = LoginErrorCode != 0 && !IsGetMoreTokens;
this.\u dealbiddplacedcontrol.Visible=AuctionId>0&&LoginErrorCode==0&&BidStatus>0;
此._dealBidControl.Visible=AuctionId>0&&LoginErrorCode==0&&BidStatus 0&&LoginErrorCode!=0;
此。_deals.Visible=LoginErrorCode!=0 && !IsGetMoreTokes;

此外,还可以使用枚举或布尔值代替ID和代码
HasAuction
AuctionId>0

更清晰,换个角度看怎么样

private void SetVisibility(int AuctionID, int BidStatus, int LoginErrorCode, int     IsHome, bool IsGetMoreTokens)
{
    this._dealBidPlacedControl.Visible = AuctionID > 0 && LoginErrorCode == 0 && BidStatus > 0;
    this._dealBidControl.Visible       = AuctionID > 0 && LoginErrorCode == 0 && BidStatus <= 0;
    this._loginReg.Visible             = AuctionID > 0 && LoginErrorCode != 0;
    this._deals.Visible                = AuctionID > 0 && LoginErrorCode != 0;

    etc.
}
以便您的方法在将来更易于扩展:

  private void SetVisibility( VisibilityParamteres parameters ) 
  {
  }
这使您有机会从方法体中提取布尔表达式:

private void SetVisibility( VisibilityParameters parameters )
{
    this._dealBidPlacedControl.Visible = DealBidPlaceVisible( parameters );

    etc.
}

private bool DealBidPlaceVisible( VisibilityParameters parameters )
{
     return parameters.AuctionID > 0 && parameters.LoginErrorCode == 0 && parameters.BidStatus > 0
}
if(AuctionID>0&&LoginErrorCode==0&&BidStatus>0)
{
此._dealbiddlacedcontrol.Visible=true;
}
否则如果(AuctionID>0&&LoginErrorCode==0&&AuctionID 0&&LoginErrorCode!=0)
{
这是.\u loginReg.LoginErrorType=LoginErrorCode;
这是.\u loginReg.Visible=true;
这._deals.Visible=true;
}

else if(AuctionID,但这会稍微改变代码的行为,因为原始代码的路径没有为某些参数赋值。@Jan所有变量在函数开始时都设置为“false”。所以这应该是正确的。@Stefan:好的,我们忽略了这一点。您的答案完全正确:)听起来您很感兴趣