繁體中文
English 简体中文 繁體中文
Methodox 首頁

C# 技巧

為 Divooka 外掛編寫 C# 程式碼時,遵循一些慣用模式並使用 XML 註解,可以確保你的方法和型別在圖編輯器中清晰地呈現。在 Divooka 中,任何打算作為獨立節點公開的方法都應宣告為 public static 函式。由於靜態方法不持有例項狀態,Divooka 會自動生成一個節點,其輸入引腳對應方法的參數,主輸出引腳則反映方法的返回型別。例如,考慮一個計算平方的簡單靜態方法:

/// <summary>
/// Returns the square of an integer.
/// </summary>
public static int Square(int x) => x * x;

載入這段程式碼後,Divooka 會呈現一個名為“Square”的節點,它有一個輸入(型別為 int 的 x)和一個以其型別命名的輸出 Integer,無需任何額外的連線或樣板程式碼。

除了返回值之外,C# 的 out 參數也作為額外的輸出引腳受到支援。如果你像這樣宣告一個方法:

/// <summary>
/// Divides an integer and returns quotient and remainder.
/// </summary>
public static int Divide(int dividend, int divisor, out int remainder)
{
    remainder = dividend % divisor;
    return dividend / divisor;
}

Divooka 會建立兩個輸出——一個對應返回值(商),一個對應 out 參數(remainder)。關鍵在於,out 參數不會作為節點的輸入出現,而是自動成為額外的輸出引腳。這樣就能直接公開返回多個值的方法,而不會讓節點的輸入側變得雜亂。

相比之下,例項方法預設是隱藏的,除非你明確選擇公開。要在純資料流圖中公開一個例項方法(使其表現得像靜態函式一樣),請在其 XML 文件中新增 <const>true</const>。例如:

public class MathHelpers
{
    /// <summary>
    /// Adds two numbers together.
    /// </summary>
    /// <const>true</const>
    public int Add(int a, int b) => a + b;
}

有了 <const>true</const>,Divooka 會把 Add 當作靜態方法處理——顯示一個接受兩個整數並返回其和的節點。省略 <const> 則告訴 Divooka 該方法可能依賴內部狀態或副作用,因此它只在維護著顯式物件例項的過程式上下文中可用。

XML 文件是節點後設資料(工具提示、顯示名稱、輸入格式等)的權威來源。Divooka 能識別以下幾種標籤和特性:

  • <summary> 和 <remarks> 用於填充節點的工具提示或幫助面板,為使用者提供上下文指導。
  • <param name="…" textFormat="…"> 控制 Divooka 如何呈現或約束該參數——例如,textFormat="text" 表示純文字,textFormat="Password" 用於遮蓋敏感輸入。
  • <snap>URL</snap> 連結到一張截圖,它會顯示在節點的文件窗格中,幫助終端使用者一目瞭然地理解用法。
  • <hidden>true</hidden> 阻止該方法或型別出現在工具箱中,即使它原本是可被發現的。
  • <const>true</const>(用於例項方法)強制 Divooka 在資料流圖中將該方法視為純函式。

例如,如果你這樣寫:

/// <summary>
/// Executes a query and returns a DataGrid.
/// </summary>
/// <snap>https://cdn.example.com/snaps/QueryNode.png</snap>
public static DivookaDataGrid Query(string sql, ODBCConfiguration? config = null)
{
    // Implementation omitted…
}

Divooka 會將“Executes a query and returns a DataGrid”顯示為工具提示,並在使用者檢視節點文件時顯示所引用的圖片。如果你新增 <hidden>true</hidden>,即使滿足其他公開條件,Divooka 也會將該方法從面向使用者的工具箱中完全隱藏。

Divooka 還支援基於委託的節點:如果一個靜態方法或例項方法包含 Func<…> 或 Action<…> 參數,該參數在圖中就會成為一個 lambda 佔位符。例如:

/// <summary>
/// Applies a lambda to each element in an integer array.
/// </summary>
public static int[] Map(int[] items, Func<int, int> transformer)
{
    return items.Select(transformer).ToArray();
}

拖入圖中後,“Map”會顯示一個 items 輸入、一個 transformer 子圖佔位符和一個 int[] 輸出。在底層,Divooka 會把使用者的子圖編譯為委託,並在執行時將其應用於每個元素。

泛型方法和泛型型別同樣會變成節點。例如這樣一個方法

public static T Identity<T>(T value) => value;

是一個帶有 T 選擇塊的節點:在其上選擇一個型別,或者將一個值連入 value,T 就會根據連入的值推斷出來。

最後,Divooka 在填充工具箱時不識別繼承層次結構或多型分派。如果你定義了一個基類和一個派生類,它們都實現了 Compute(double),Divooka 會把兩者分別列出;它不會將它們合併到一個共享的“Compute”節點下,也不會執行基於執行時型別的分派。如果你需要多型行為,請實現顯式的包裝方法,或利用過程式上下文在執行時檢查型別。

XML 標籤和特性

下面彙總了為 Divooka 註解 C# 程式碼時最有用的 XML 標籤和特性。編寫文件註解時,可將其用作快速參考:

標籤 / 特性 用途 說明
<summary>…</summary> 提供節點的主要描述。 在圖編輯器中顯示為工具提示文字。
<remarks>…</remarks> 提供額外的說明文字。 顯示在詳細文件窗格中,位於摘要下方。
<param name="…" …>…</param> 描述一個參數及其輸入格式(可選)。 特性:textFormat="text"(純文字)、textFormat="Password"(遮蓋輸入)、default="White"(用於預設值,例如顏色)等。
<snap>URL</snap> 嵌入截圖或插圖的 URL。 Divooka 會在節點的文件窗格中顯示這張圖片,作為直觀的指導。
<hidden>true</hidden> 在工具箱中隱藏該方法或型別。 即使其他條件會公開它,此標籤也會強制 Divooka 將其從介面中省略。
<const>true</const> 將例項方法標記為資料流上下文中的純函式。 沒有此標籤時,例項方法只能在過程式上下文中使用。
<name>…</name> 覆蓋節點的標題。 如果省略,標題就是成員名拆分成單詞後的形式:DiameterOf 顯示為 Diameter Of。
<returns name="…">…</returns> 為返回型別命名或加以描述。 很少需要——Divooka 會自動推斷返回型別;僅在需要宣告自訂的返回引腳名稱時使用。

請始終如一地使用這些標籤,這樣當使用者把你的自訂節點拖入圖中時,就能獲得精緻且自帶文件的體驗。

待辦事項:

  • 補充關於可序列化為字串的複合型別的預設值的說明。
  • 補充關於繞過 C# 位置參數限制的參數預設值的說明。

文字格式

格式 名稱 描述
文字方塊 textFormat="text" 顯示多行文字方塊,而不是單行文字方塊。
密碼輸入 textFormat="password" 顯示一個單行文字方塊,字元以掩碼符號顯示。
圖名稱選擇器 textFormat="graphPicker" 彈出圖選擇器。
資源路徑選擇器 textFormat="assetPath" 彈出資源路徑選擇器。

參考資料

另請參閱:

  • 關於外掛開發的一般說明。