iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

在使用nameof之前

在實作需要class, property與method名稱的功能時, 程式碼各處寫了hardcode的字串來表示這些名稱.
但總會有寫錯的時候, 也就是typo. 但是字串的typo在編譯時期無法發現問題, 只能得用測試或上線才發現.
即使單元、整合測試會通過, 但還是有一些特殊命名會讓開發者搞混, 比如usernameuserName, 這很容易被忽略, 直到QA測試或上線才抓到問題.

nameof 關鍵字

.NET 提供 nameof 關鍵字,可以將class, property, method與變數的命名, 在編譯時轉成字串.
甚至在用Visaul Studio的Rename功能, 也都能統一更改命名, 不會再有忘記還有哪些hardcode字串尚未變更.

nameof 常用情境

參數驗證

有個時間函式庫NodaTime, 提供Preconditions.CheckNotNull函數, 其中函數宣告:

internal static class Preconditions
{
    internal static T CheckNotNull<T>(T argument, [InvokerParameterName] string paramName) where T : class
    {
        //
    }
}

而我們有個範例是需要檢查參數:

public ZonedDateTime InZone(DateTimeZone zone)
{
    Preconditions.CheckNotNull(zone, nameof(zone));
    // other check flow
}

屬性(Property)變更通知

在開發WPF這類的應用程式, 大都需要實作INotificationPropertyChanged介面, 以MSDN的修改範例:

public class Person : INotifyPropertyChanged
{
    private string name;
    public event PropertyChangedEventHandler PropertyChanged;

    public Person()
    {
    }

    public Person(string value)
    {
        this.name = value;
    }

    public string PersonName
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged();
            OnPropertyChanged(nameof(HighlightPersonName));
        }
    }

    public string HighlightPersonName => $"Our customer: {PersonName}";

    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

其中我們呼叫了兩筆OnPropertyChanged, 第二筆是需要notify HighlightPersonName property, 採用了nameof取得property名稱.

Attributes

Data mapper的知名套件AutoMapper, 提供Attribute Mapping的方式, 在attribute設定source與target兩邊類別/property的關聯.

如它的官方範例

using AutoMapper.Configuration.Annotations;

[AutoMap(typeof(Order))]
public class OrderDto 
{
   [SourceMember(nameof(Order.OrderTotal))]
   public decimal Total { get; set; }
   // ...
}

可以看到, SourceMember內代入nameof, 取得Order的property OrderTotal命名


上一篇
Replace Error Code with Exception 的重構
下一篇
什麼是測試驅動開發(Test Driven Development)
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言