0

Mercurial のコマンド ライン クライアントをラップするクラス ライブラリがあります。

私の意図は、すべての組み込みコマンドのサポートを実装することですが、それらに加えて、そこにはたくさんの拡張機能があります.

したがって、他の人も私も拡張機能のサポートを追加できるという意味で、ライブラリを拡張可能にする必要があります。より一般的で典型的な拡張機能 (少なくとも Mercurial にバンドルされている拡張機能のかなりの数) のサポートを追加する予定ですが、それでも外部から拡張できるようにしたいと考えています。

現時点では、コマンドの構文は次のようになります。

Repo.Execute(new CommitCommand
{
    Message = "Your commit message",
    AddRemove = true,
});

ただし、これは、プログラマーが拡張機能が単に追加された部分であると感じない限り、拡張機能にはあまり適していません。

たとえば、手動でこれを行うことができるように、追加のコマンド ライン引数のパブリック コレクションを公開するとします。

var cmd = new CommitCommand
{
    Message = "Your commit message",
    AddRemove = true,
};
cmd.Arguments.Add("--my-commit-extension");
Repo.Execute(cmd);

オブジェクト初期化子の一部として設定できるように追加の拡張機能を追加する簡単な方法はないようです。

私は流暢なインターフェイス構文に追加するか、おそらく切り替えることを考えていました。この場合、次のように書くことができます。

Repo.Execute(new CommitCommand()
    .Message("Your commit message")
    .AddRemove()
    .MyCommitExtension());

しかし、人々は流暢なインターフェースが好きではなく、おしゃべりになりすぎると感じています。

他にどのようなオプションがありますか?

私が欲しいもの、基本的に:

  • 1 つの一般的な構文スタイル
    • 組み込みのものの両方について
    • 私のライブラリのユーザーによって追加された拡張機能と同様に

私のライブラリのユーザーは、新しいクラスと拡張メソッドを追加して Intellisense サポートを取得することでライブラリを拡張すると思いますが、オブジェクト初期化子で拡張メソッドを使用することはできません。それは私が望むものではありません。

どんなアイデアでも大歓迎です。

4

3 に答える 3

1

私はMercurialに精通しておらず、あなたの質問は一般的すぎて具体的に取り上げることができないようですが、1つの特定のコメントに取り組むことができます。

var cmd = new CommitCommand 
{ 
    Message = "Your commit message", 
    AddRemove = true, 
}; 
cmd.Arguments.Add("--my-commit-extension"); 
Repo.Execute(cmd); 

CommitCommand.Argumentsの場合IList<T>、初期化構文を使用する機能がすでにあります。

class CommitCommand
{
    public string Message { get; set; }
    public bool AddRemove { get; set; }
    public List<string> Arguments = new List<string>();
}

Repo.Execute(new CommitCommand
{
    Message = "Your commit message",
    AddRemove = true,
    Arguments = { "--my-commit-extension", "--my-other-commit-extension" }
});
于 2010-12-05T14:47:12.480 に答える
1

私も Mercurial にはあまり詳しくありませんが、1 つのオプションは、intellisense を破棄して匿名型を使用することです。

Repo.Execute(new 
{
    Message = "Your commit message",
    AddRemove = true,
    MyCommitExtension = null
});

プロパティ名にハイフンを使用することはできないため、PascalCase をハイフン小文字に置き換える必要があります。または、アンダースコアをハイフンに置き換えることもできます。

人々がこれらの拡張機能を使用する頻度について詳しく知らずに、このアプローチをお勧めするかどうかはわかりません. このアプローチは、ASP.NET MVC フレームワークで HTML 属性を処理する場合にうまく機能しますが、そのシナリオは、フレームワークが値を処理する必要がなく、値を出力に直接書き込むだけであるという点で異なります。この方法で提供された値に基づいて条件付きアクションを実行している場合、または Mercurial のコマンド ライン構文を知らない人が API を見つけやすくしたい場合は、別の方法を試すことができます。

于 2010-12-05T15:02:32.277 に答える
0

私としては、流暢なインターフェースは問題ありません。しかし、それを避けたい場合は、おそらく次のようにsmthを使用します。

interface IExtension { ... }

class SomeExtension1 : IExtension { ... }
class SomeExtension2 : IExtension { ... }

class CommitCommand
{
    public string Message;
    public bool AddRemove;
    public readonly IList<IExtension> Extensions = new List<IExtension>();
}

次の方法でコマンドを使用できます。

new CommitCommand
{
    Message = "",
    AddRemove = true,
    Extensions = {new SomeExtension1(), new SomeExtension2()}
};
于 2011-01-26T19:56:07.040 に答える