代码之家  ›  专栏  ›  技术社区  ›  Benny

这个检查逻辑应该放在哪里?

c#
  •  2
  • Benny  · 技术社区  · 15 年前

    我有一个在图形上绘制图像的函数:

    private void DrawSmallImage(Graphics g)
    {
                if (this.SmallImage == null) return; 
    
                var smallPicHeight = this.Height / 5;
    
                var x = this.ClientSize.Width - smallPicHeight;
                var y = this.ClientSize.Height - smallPicHeight;
    
                g.DrawImage(this.SmallImage, x, y, smallPicHeight, smallPicHeight);
     }
    

    支票 if (this.SmallImage == null) return; 应该在函数drawsmallimage中,还是应该在调用方中?哪个更好?

    5 回复  |  直到 15 年前
        1
  •  2
  •   codemonkeh    15 年前

    放置检查逻辑的最佳位置是调用方法。

    一般认为,为一个特定的目的设计一种方法是最好的。这样不仅可以保持设计的整洁,还可以减少方法上的耦合,使其可重用。

        2
  •  1
  •   Chuck Conway    15 年前

    我会把它放在打电话的人那里。方法drawsmallimage不应该知道类的状态。它的目的是绘制小图像。

        3
  •  0
  •   Adriaan Stander    15 年前

    我会把支票留在那里,然后通过 SmallImage 作为 DrawSmallImage 方法。

    这样它就可以被任何图像重用。

    有点像

    private void DrawSmallImage(Graphics g, Image smallImage) 
    { 
                if (smallImage == null) return;  
    
                var smallPicHeight = this.Height / 5; 
    
                var x = this.ClientSize.Width - smallPicHeight; 
                var y = this.ClientSize.Height - smallPicHeight; 
    
                g.DrawImage(smallImage, x, y, smallPicHeight, smallPicHeight); 
     }
    
        4
  •  0
  •   Keltex    15 年前

    发生这种情况时,您可能希望引发异常:

    if (this.SmallImage == null) 
        throw new NullReferenceException("Small image can't be null");
    

    然后期望调用者检查如下属性:

    bool HasSmallImage
    {
        get { return this.SmallImage!=null; }
    }
    
        5
  •  0
  •   Matthew Flaschen    15 年前

    smallimage是一个成员字段。在我看来,最好的设计是防止它永远为空(例如,让它在每个构造函数中初始化,并在即将设置为空时引发ArgumentException)。当然,你没有提供太多背景,所以这可能是不可能的。但这绝对是一件值得考虑的事情。

    无论哪种方法,您都可以明确地指定在调用此方法时它必须是非空的。这是一种先决条件。