読者です 読者をやめる 読者になる 読者になる

流れるようなインターフェイス書いてて思ったこと

流れるようなインターフェイス書いてて、「これメソッドのグルーピングに使えるんじゃね?」って思った。
例えば Visual Studio でも Eclipse でも、補完機能って平坦なリストなんだよね。
オーバーロードは一つにまとめてくれるけど、似たような名前のメソッドはずらずらと一覧に出てきてしまってうっとうしい。


オブジェクト指向的にはひとつのクラスにそんなにメソッド詰め込むな、ってことだろうけど、基本的なライブラリとかだとやっぱりメソッドの数はそれなりになるわけで・・・


てことで、流れるようなインターフェイスを応用して、メソッドのグルーピングをする例。

StringUtil.cs

一番大元。でも何も記述しない。

public static partial class StringUtil {}

StringUtil.Substr.cs

部分文字列のグループ。

partial class StringUtil
{
    public static SubstrContext Substr(this string str)
    {
        return new SubstrContext(str);
    }
    public sealed class SubstrContext
    {
        public SubstrFromContext From(int from) { ... }
        ...
    }
}

StringUtil.SubstrByRegex.cs

正規表現による部分文字列のグループ。

partial class StringUtil
{
    public static SubstrByRegexContext SubstrByRegex(this string str)
    {
        return new SubstrByRegexContext(str);
    }
    public sealed class SubstrByRegexContext
    {
        public string After(Patern separator) { ... }
        public string After(string sepRegex) { ... }
        ...
    }
}

StringUtil.Traits.cs

IsXxx のグループ。

partial class StringUtil
{
    public static IsContext Is(this string str)
    {
        return new IsContext(str);
    }
    public sealed class IsContext
    {
        public bool OnlyAsciiPrintable { get { ... } }
        public bool OnlyAlpha { get { ... } }
    }
}

使用例

if (str.Is().OnlyAlpha)
{
    Console.WriteLine(str.SubstrByRegex().After("[^a-f]"));
}

ここで、str. まで打ったときに IsOnlyAlphanumeric やら IsOnlyAsciiPrintable やら IsBlank やらは出ずに、Is とか Substr とかのグループで候補が表示される。
で、更に Is(). まで打ったときに初めて OnlyAlphanumeric やら OnlyAsciiPrintable やら Blank やらが表示される。
また、Is(). まで打った後は関係のない Substr().From... とかその他諸々は表示されない。


・・・Is(). がキモイってのはあるけど、まぁ、多分慣れれば問題なくなるよ。多分。

IDE 改良案 (妄想)

常識的に考えて、IDE の方をどうにかすればいいんじゃないの?
例えば、最初の一単語が同じものはグルーピングするとか。
イメージとしては、

str.I
    +-----------+
    | Insert |> |
    |+---------+|+--------------------+
    ||Is     |>|||IsOnlyAsciiPrintable|
    |+---------+||IsOnlyAlphanumeric  |
    +-----------+|IsBlank             |
                 |...                 |
                 +--------------------+

こんな感じ?
・・・わかりにくいけど、str.I まで打った場面で、候補として Insert と Is が出てて、Is が選択状態になっててグルーピングされた候補が表示されてる感じ。