CallSharpプロジェクト:.NETのI / O Call Instrumentation

私は多くの作業ツールが好きなので、それらはいくつかの問題を解決しないだけでなく、そうでなければプログラムを考慮ます 。 トゥーラ、私はあなたに伝えたい-それはそのようなものです。 CallSharr-私のプロジェクトが呼び出されます-入力と予想される出力データのセットに基づいて呼び出しのチェーンをアルゴリズム的に推定しようとしています。



"  abc"⟶"  cba"

まず、簡単な例: "b"があり、 "b"を取得する必要があります。 上記では、これを模式的に示しましたが、さらに記事ではこのような見出しを使用し続けます。

この例は、問題を完全に示しています。なぜなら、 c。行にNOはReverse Rvrs()がなく、この問題の解決策は少数です。 たとえば、ここに書くことができます:

 new string(input.Reverse().ToArray()) 

そのため、長い間入力データと出力データのためにこれらの呼び出しチェーンを推測したプログラムを受け取りたいと思います。 ちょっと幻想的ですね。

簡単な例から始めましょう:

abc⟶ABC

この場合、 bはまさにその行であり、それ以外は何もありません。 ここで何かをbする必要がありますが、 を取得するために電話することができます。

.Netの行は不変であり、呼び出し後に元の行への変更をチェックする必要はありません-最高値のみです。 したがって、すべてのメソッド(および、存在しないプロパティ。メソッドgt_ )をgt_および検索できます。


「アポメントの1つを受け入れない」かもしれないことは注目に値する-これらは3つの別々のケースであり、


これらの基準に"b"ている場合、 "b"呼び出すと便利な関数stringリストが取得されます。

 Normalize ToLower ToLowerInvariant ToUpper ToUpperInvariant ToString Trim TrimStart TrimEnd 

これらの各関数を"b"と呼び、結果を確認します。 次の2つの関数のみが適切です。

 input.ToUpper() input.ToUpperInvariant() 

万歳、最初のミッションが完了しました!

abc⟶3

理解する方法、右側の3番のタイプはどうですか? 私はここでそのようなアルゴリズムを提案します:


このアルゴリズムによれば、右側の3つはstringhr両方( fltまたはimSnさえも!)にすることができますが、現在の例では、これをInt32と同じにすることができます。

非静的メソッドを使用した同じ線形検索を使用して、即座に作業します

 input.Length 

このため、 gt_Lngth()関数がgt_Lngth()が、CallSharrはユーザーの利便性のために不要な装飾をすべて削除します。

abc⟶false

不正行為の例。 もっとtruIsNrmlizd()落ちてIsNrmlizd()ので、非静的バージョンにはありません。 さらに、アルゴリズムを拡張する必要があります-ここで、古いメソッドを整理する必要があります。


統計まで検索範囲を広げると、2つの完全に完璧な結果が得られました。

 string.IsNullOrEmpty(input) string.IsNullOrWhiteSpace(input) 

いいね! すでに別のことをしましょう!

abc⎵⎵⟶ABC

Uxx、ここでは状況は良くなっています- "b "なので、最後に2つの問題があります:この1つの関数はまだ受信できません。 呼び出しチェーンを作成する必要があります。 この場合、チェーンはstringstringstringであってはなりません。 stringo oostringかもしれません。 中間データは重要ではありません。

この段階で、複合爆発が発生します。 さて、あなたは何が欲しいのですか? 次に、他の多くの入力データについて説明します。多くのオプションがあります。

 string.Concat(input.Split()).ToUpper() string.Concat(input.Split()).ToUpperInvariant() input.ToUpper().Trim() input.ToUpper().TrimEnd() input.ToUpperInvariant().Trim() input.ToUpperInvariant().TrimEnd() input.Trim().ToUpper() input.Trim().ToUpperInvariant() input.TrimEnd().ToUpperInvariant() input.TrimEnd().ToUpper() // + lots more solutions 

私はすべての解決策、そしてそれらの多くを解決し始めませんでした。 ご覧のとおり、すべてのオプションは多かれ少なかれ正しいですが、呼び出しの可換性を考慮していませんでした。 .rim().Ur()電話してください。

これは、2を呼び出すときのひどい問題ではありませんが、3つ以上ある場合、多くの冗長な作業があり、プログラムを非常に印象的なものにします。

aaabbb⟶aaa

これまで、apgmentovなしで呼び出すことができる「素敵な」関数のみについて説明してきました。 すべて-そのようなことはそれ以上のことはしません。 bbbを削除するbbbは、最後に何かを呼び出してbまたはbbbを切り取るか、テキストの最後の3文字を削除する必要があります。

すべての呼び出し側エージェントがオブジェクトと関連付けられている必要があり、これが呼び出しの原因となっています。 このために、ひどくひどいFrgmnttinngin -他の型を良い部分に分割する方法を知っているクラスの友達です。 (党からのマスターの写真がなければならない。)

bbb見てみましょう。 次のように分割できます。


オブジェクトの行を選択したら、これらのオブジェクトを受け取るメソッド(静的またはなし)を探しています。 ここからは、何かを除いてそれ以下です


CallSharrはもちろん、合成例で使用でき、提供されます

 input.Trim('b') input.TrimEnd('b') 

おそらく既に推測したように、組み合わせた爆発はファンに一致させることができ、他の多くのオプションは正しいのですが、不必要に複雑です。 例:

猫猫

うーん、どうやらerまたはr別々にrだけでいいようです。 たとえば、CallSharrを実行すると、次のようになります

 input.Trim('e','r') input.Trim('r','e') input.Trim('a','e','r') input.Trim('a','r','e') input.Trim('e','a','r') input.Trim('e','r','a') input.Trim('r','a','e') input.Trim('r','e','a') input.TrimEnd('e','r') input.TrimEnd('r','e') // 30+ more options 

ご覧のとおり、最初の2つのオプションのみが使用したいものです。 残りはすべて不必要な情報を持っていますが、これは誰にも何もしません。 またはここに別の

aabbcc⟶aacc

以下のオプションがあります。ここにあります:

 input.Replace("aabb", "aa") input.Replace("bb", "") input.Replace("bbcc", "cc") 

上記の単一の正しいオプションは真ん中のものです。 意味論の観点から見ると、他の2つは正しいものであり、すべて同じです-むしろ、私たちが取得したいものではありません。

別の興味深い観察結果は、深さには興味深い解決策がありますが、表面にはない場合があることです。 例えば

a⎵b⎵c⟶abc

ここでは問題を簡単に削除できますが、CallSharrには多くのオプションがあります。たとえば、

 input.Replace(" ", string.Empty) input.Replace(" b ", "b") input.Replace("ab ", "ab") input.Replace(" b c", "bc") input.Replace("ab c", "abc") // at greater depth, string.Concat(input.Split()) 

最良のオプションは最初であり、おそらく最後のオプションです。実行ポイントと同時にあるはずです(おそらく、チェックしなかったと直感が伝えます)が、エレガンのように見えます。 これは良い例です。プログラムは、人がすぐに見ないことを推測できるからです。

要約する


現在、SallSharrは高速ではなく動作します。 問題は、主にリフレクション(特にthdInf.Invk() )の使用、およびディープコールとそのコストに関連する爆発の組み合わせにあります。

パフォーマンスに関する現在の問題は、動的から静的に移行するときに解決されます(T4ですべて実行してください)。 多くの最適化を行うことができます。たとえば、次のような関数セットとして「可換性」の分析を行いたいと思います。

CallSharr-鉱石ソースプロジェクト、 GitHubあります 。 また、そのリリースもあります -新しいバージョンのリリースに必要なものがすべて含まれているSmall One インストールするには、 ここをクリックしてください

少し活気のあるナレーションが必要な方のために、 サンクトペテルブルクの.NETユーザーグループに関する私のレポートを以下に示します


ご清聴ありがとうございました!

Source: https://habr.com/ru/post/J317816/


All Articles