簡體   English   中英

在Winforms和ASP.NET中重構

[英]Refactoring in Winforms and ASP.NET

當我為Winforms和ASP.NET創建用戶控件時,我發現自己一遍又一遍地為表單上的每個屬性編寫相同的代碼段,這是:

private string _url;

public string Url
{
  get { return _url; }
  set
  {
    if (_url == value)
      return;

    _url = value;
    OnUrlChange(EventArgs.Empty);
  }
}

public event EventHandler UrlChanged;

protected virtual void OnUrlChange(EventArgs e)
{
  //Maybe add some extra logic here

  if(UrlChanged != null)
    UrlChanged(this, e);
}

有時會有奇怪的變化。 也許我會編寫自己的類,它來自EventArgs並使用它。

這似乎是一項常見的任務。 也許我做錯了,有一個更簡單的方法來寫這個地段? 但如果沒有,是否有任何自定義重構工具,我可以設置為在給定屬性名稱Url填寫此代碼?

你的模式很常見,幾乎是最好的方法。

話雖這么說,你絕對應該使用Visual Studio Snippets 它們允許輕松地為這樣的代碼創建模板。 您可以定義自己的占位符,當您插入代碼段時,Visual Studio會突出顯示占位符並允許您對其進行制表。

我還推薦了Snippet Designer插件,它將使代碼片段創建更容易,更有趣。 它還有助於找出您不知道存在的代碼段功能。

幾個月前我曾經想過這個並玩弄了這個:

    public event PropertyChangedEventHandler PropertyChanged;

    int _MyProperty;
    public int MyProperty
    {
        get { return _MyProperty; }
        set { ChangeIfUnequal(ref _MyProperty, value, "MyProperty"); }
    }

    int _AnotherProperty;
    public int AnotherProperty
    {
        get { return _AnotherProperty; }
        set { ChangeIfUnequal(ref _AnotherProperty, value); }
    }


    void ChangeIfUnequal<T>(ref T Val, T NewValue, string Identifier="")
    {
        if (!Val.Equals(NewValue))
        {
            Val = NewValue;
            var temp = PropertyChanged;
            if(temp != null)
                temp(this, new PropertyChangedEventArgs(Identifier));
        }
    }

但是我從來沒有在生產中運行它並且沒有花足夠的時間來思考這是否是一個微小的改進或不必要的並發症。 毫無疑問,它不像在每個屬性中明確設置它那樣靈活,因為這只會提高!equals。 拿它或者離開我猜。

是否有任何自定義重構工具,我可以設置為在給定屬性名稱Url填寫此代碼?

您可以創建自己的代碼段來完成該操作。

這取決於您的體系結構,但如果您嘗試減少冗余,則可以創建一個包含任何共享屬性和方法的基類,並讓您的控件繼承它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM