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つはstring



hr



両方( flt



またはimSn



さえも!)にすることができますが、現在の例では、これをInt32



と同じにすることができます。



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



 input.Length
      
      





このため、 gt_Lngth()



関数がgt_Lngth()



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



abc⟶false






不正行為の例。 もっとtru



IsNrmlizd()



落ちてIsNrmlizd()



ので、非静的バージョンにはありません。 さらに、アルゴリズムを拡張する必要があります-ここで、古いメソッドを整理する必要があります。





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



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





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



abc⎵⎵⟶ABC






Uxx、ここでは状況は良くなっています- "b "



なので、最後に2つの問題があります:この1つの関数はまだ受信できません。 呼び出しチェーンを作成する必要があります。 この場合、チェーンはstring



string



string



であってはなりません。 string



o oo



string



かもしれません。 中間データは重要ではありません。



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



 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ユーザーグループに関する私のレポートを以下に示します





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



All Articles