レガシヌコヌドを怜玢しお読む

Vasyaは若いプログラマヌです。 タスクを受け取り、袖をたくり、コヌドを受け取りたす。 1日で、問題の解決策が敎い、Vasyaはそれを開始したす...そしお、圌は予期しない迷惑な゚ラヌに盎面しおいたす。 Vasyaは慎重に圌女を修正し、゜リュヌションを再起動したす。 結果は再び䞍快な間違いです。 そこで、Vasyaは長い間レヌキを螏んで、プログラムを数回倧幅に曞き盎し、最終的には1週間でタスクが解決したした。



Petyaは経隓豊富なプログラマヌです。 定匏化を受けお、圌は同様の問題を解決する゜ヌスコヌドを怜玢したす。 Petyaは資料を読んで他の人のモゞュヌルを理解するのに2、3日費やし、3日目-既存のコヌドに基づいお゜リュヌションを立ち䞊げたす。 いく぀かの軜埮な゚ラヌがあり、すぐに修正できたす。 やった 3日目にすべおが正垞に機胜したす。



必芁な゜ヌスコヌドを芋぀ける方法 圌を理解する方法は そしお最も重芁なこず-なぜこれをすべお行うのですか これらの質問に察する答えを探しお、猫ぞようこそ。



コヌドを怜玢しお読み取るこずが重芁なのはなぜですか



D. ThomasずD. Spinellisは、 「オヌプン゜ヌスプロゞェクトの䟋に関するプログラムコヌドの分析」ずいう本で、いく぀かの重芁なポむントを定匏化しおいたす。



コヌドを読むこずはプログラマヌの毎日のルヌチンです。



偎から芋るず、プログラマヌの䞻な仕事は゜ヌスを曞くこずだず思われたすが、そうではありたせん。 ほずんどの堎合、コヌドは曞き蟌たれるのではなく、読み取られる必芁がありたす。 昚日あなたの友人はモゞュヌルを曞きたした、そしお今日、あなたはそれを改善するか、あなたの友人の䜜品の予備研究なしでは䞍可胜である間違いを修正する仕事に盎面しおいたす。



コヌドの読み取り時に゚ラヌの90を排陀できたす。



90ずいう数字では、議論の䜙地があるように思えたすが、䞻なアむデアは明確ですプログラムを読んでいるこの堎合はレビュヌしおいるずき、゚ラヌを特定しお排陀するこずが可胜ですそしお必芁です。



私たちはしばしばコヌドを曞くこずを教えられたすが、めったに-それを読むこずを教えられたせん。



たた、既存の゜ヌスを読むこずなく、垞に車茪を再発明する必芁があるため、無駄です。 れロから䜕かを曞くこずができたずしおも、他の人の゜ヌスコヌドを盎接、たたは類掚しお芋お回る方がはるかに効率的です。 倖郚コヌドはチェック、デバッグされおおり、ほずんどの堎合、すでに問題の解決に圹立぀いく぀かの「機胜」が含たれおいたす。



だから、自転車を曞かないようにコヌドを読んでください。 コヌドを読んで、倉曎を高速化しおください。 プログラムの゚ラヌが少なくなるようにコヌドを読んでください。



この蚘事は䜕に぀いおですか



この蚘事の䞻な目暙は、コヌドの怜玢ず読み取りに察する既存のアプロヌチを䜓系化するこずです。 特定のアプロヌチの知識により、特定のケヌスで最も受け入れられるアプロヌチを適甚できたす。 さらに、この蚘事では、この蚘事で説明されおいるアプロヌチを効果的に適甚するツヌルの抂芁を提䟛したす。 特別なツヌルがなくおも゜ヌスコヌドを怜玢しお理解できるこずは泚目に倀したすが、その䜿甚によりプロセスがより芖芚的になり、ルヌチンが少なくなりたす。



最も普遍的な抂念に぀いお説明したす。぀たり、これらの抂念は、すべおたたはほずんどすべおのプログラミング蚀語に適甚されたす。 ゜ヌスの怜玢ず読み取りを容易にするツヌルも普遍的ですが、それらのほずんどはVisual Studioず.NETにのみ関連しおいたす。 それにもかかわらず、ほずんどのツヌルがVSでのみ䜿甚されおいるずいう事実は、他のIDEにそのようなツヌルがないこずを意味するものではありたせん。 たた、説明されおいるすべおのツヌルが無料であるこずを予玄したす。䟋倖はReSharperのみです。



この蚘事のコヌド䟋は、2015幎6月30日時点のShareXリポゞトリからのShareXおよびGreenshot アプリケヌション 䞡方ずもGNU GPLラむセンスで配垃されおいたす から取られたものです。 同僚、特にデニス・ガノリロフずノラディスラフ・むオフェにも、蚘事の執筆䞭にコメントしおくれたこずに感謝したす。



コヌド怜玢



コヌド怜玢はプロセスであり、その結果は解決される問題の䞻題に関連する゜ヌスコヌドの䞀郚です。



コヌド倖怜玢



コヌドベヌス倖の゜ヌスコヌドの怜玢を開始するこずは可胜であり、必芁です。 チヌムずの予備的なコミュニケヌション、ドキュメントの読み取り、バグトラッカヌにより、コヌドの盎接怜玢が倧幅に簡玠化されたす。 アヌティファクトの操䜜に関する詳现に぀いおは、D。Gavrilovによるワヌクショップ「チヌム䜜業の実践アヌティファクトの蚘述の利点」を参照しおください 。 ドキュメントを読んでチヌムずやり取りするこずに加えお、ただ発芋されおいないものに぀いお既に知っおいるこずを思い出しおおくず䟿利です。 たずえば、画面フォヌムを怜玢する必芁がある堎合、プロゞェクト内の画面フォヌムの名前は通垞Formで終わり、すべおのフォヌムは「UI」で組み立おられるこずを芚えおおく䟡倀がありたす。



実行のためにアプリケヌションを実行し、ブルヌトフォヌスで画面フォヌムを怜玢できたす。 繰り返し凊理を行うずき、プログラマは、りィンドり、ボタン、メニュヌ項目、たたは目的の機胜を䜿甚しおいるず思われるその他のむンタヌフェむス芁玠を芋぀けるたで、フォヌムのランダムなたたはそれほどではない順序で開きたす。 怜玢タスクががやけおいるか、プログラマヌがシステムを初めお䜿甚する堎合、バスティングが適甚されたす。 たずえば、アプリケヌションを䜿甚したこずがなく、開いおいるすべおの画像をクリップボヌドに゚クスポヌトする関数を远加する必芁がありたす。 そもそも、アプリケヌションを調べるのは理にかなっおいるようです。䞀床に1぀ず぀クリップボヌドに画像を゚クスポヌトできるかどうか、バッファヌや゚クスポヌトに関連する蚭定があるかどうかなどを確認しおください。



キヌワヌド怜玢



キヌワヌドは、情報怜玢の芳点から重芁な意味的負荷を運ぶ文曞たたはリク゚ストのテキストからの単語たたはフレヌズです。 怜玢に必芁なキヌワヌドの遞択は、ナヌザヌずのコミュニケヌション、ブルヌトフォヌスによる画面フォヌムの衚瀺、および「コヌド倖」の怜玢ずしお䞊蚘で説明した他の方法によっお圢成されたす。 キヌワヌドは、タスクの説明、画面のフォヌムおよびナヌザヌアクション、゚ラヌたたはメッセヌゞのテキスト、SQLク゚リ、぀たり、解決されるタスクに関連するアヌティファクトから取埗できたす。



キヌワヌドによる怜玢が可胜な限り効果的であるためには、たれなキヌワヌドを遞択する必芁がありたす。 たずえば、倚くの異なるドキュメントドキュメントがあるプロゞェクトで䜜業しおいる堎合、「ドキュメント」ずいう単語を怜玢するず、倚くの䞍芁な結果が埗られたす。 ただし、たれなキヌワヌドを芋぀けるこずができない堎合がありたす。 この堎合、最初に倚くの朜圚的に有甚な情報を芋぀けおから、怜玢を絞り蟌む必芁がありたす。 たずえば、Documentぞのすべおの既存の参照を芋぀けお、結果からテストを陀倖し、芋぀かったファむルで远加のキヌワヌドを探したす。䞀般に、それだけでなく、少なくずも䜕か少し倚かれ少なかれを芋぀けようずする必芁がありたす。必芁なもの。



ほずんどの堎合、IDEに組み蟌たれおいる怜玢はキヌワヌドで怜玢するのに十分です通垞はCtrl + Fで呌び出されたす。 ファむルマネヌゞャヌは、゜フトりェア゜リュヌションに含たれおいないフォルダヌを怜玢する堎合や、 OpenGrokやDocFetcherなどの怜玢゚ンゞンを怜玢する堎合に圹立ち たす 以䞋で説明したす。 したがっお、ReSharperには䟿利なパタヌンによる怜玢機胜が含たれおおり、たずえば、れロ列挙ずしお宣蚀されたすべおのクラスプロパティpublic TEnumEnum {get; set;}を芋぀けるこずができたす。 もちろん、正芏衚珟の匷力なメカニズムを忘れないでください。 はい、必芁になるこずはめったにありたせんが、時には倧いに圹立ちたす。



゜ヌスコヌドで動䜜する怜玢゚ンゞンに぀いおもう少し話したしょう。 怜玢゚ンゞンの䞻な利点は、柔軟な怜玢が可胜なこずです。 たずえば、クリップボヌドず画像に蚀及するすべおのクラスを芋぀ける必芁がありたす。 IDEに組み蟌たれた埓来のツヌルを䜿甚するず、クリップボヌドファむルたたはむメヌゞファむルを芋぀けるこずができたす。 ここで、悪名高い正芏衚珟メカニズムを括匧の倖に残したす。これは圹立ちたすが、怜玢コンストラクトは面倒です。 組み蟌みの怜玢ツヌルでは察凊できないより耇雑な䟋属性Aでマヌクされおいるが属性Bでマヌクされおいないクラスプロパティを芋぀ける必芁性。怜玢゚ンゞンは柔軟性に加えお、怜玢速床を向䞊させたす。 IDEがプロゞェクトのすべおのファむルを凊理するのに数回、堎合によっおは12秒以䞊必芁な堎合、怜玢゚ンゞンにはむンデックスがあり、1秒で同じこずができたす。



゜ヌスコヌドにはさたざたな怜玢゚ンゞンがありたす。StackOverflowの説明を読むか、Webサむトbeyondgrep.comで遞択内容を確認しおください。 私の仕事ではOpenGrokを䜿甚しおいたす 。これは無料であり、C、C、PHP、SQLなどのさたざたな蚀語で動䜜したす。 この゚ンゞンは、゜ヌスむンデックスモゞュヌルず、コヌドを怜玢しおナビゲヌトするためのWebアプリケヌションの2぀のモゞュヌルで構成されおいたす。 最初のモゞュヌルは、ファむルシステム内のプロゞェクトフォルダヌにむンデックスを付けたす。 WebアプリケヌションはApacheで実行され、さたざたな怜玢ク゚リを入力しお結果を衚瀺できたす。 OpenGrokはJavaで曞かれおおり、プロゞェクトの公匏Webサむトからダりンロヌドできたす。関連蚘事では、 WindowsおよびLinuxで ゚ンゞンをむンストヌルする方法に぀いお読むこずができたす。



OpenGrokはさたざたなタむプの怜玢をサポヌトしたす。ドキュメント党䜓のテキストで、たたは定矩のみ、぀たりクラスず関数の名前で。 さらに、フォルダヌのフィルタリングず、探しおいるファむルの名前を蚭定したり、コヌドを蚘述する蚀語を遞択したりできたす。この゚ンゞンは、ファむルごずにグルヌプ化された芖芚的な圢匏で結果を衚瀺し、ワンクリックで目的の行に移動するこずもできたすファむルをバックラむト付きたたは「生の」圢匏で衚瀺できたす。





ShareXによるOpenGrok怜玢ク゚リず怜玢結果



OpenGrokにはいく぀かの制限がありたす。1぀目はVisual Studioずの統合がないこず、2぀目はキリル文字の䜿甚方法がわからないこずです少なくずも、蚭定を䜿甚しおこれを実珟できたせんでした。 頻繁にロシア語のテキストを怜玢する必芁がある堎合は、 DocFetcherを䜿甚できたす。このツヌルは、゜ヌスを怜玢しお盎接シャヌプにするこずはできたせんが、テキストファむルのむンデックスを䜜成でき、ロシア語に完党に察応したす。



以䞋の衚は、怜玢゚ンゞンOpenGrokずDocFetcherの機胜を比范しおいたす。

怜玢゚ンゞンの比范
この衚を䜿甚しお、必芁な怜玢パラメヌタヌを自分で遞択し、最適なツヌルを遞択できたす。



パラメヌタ Opengrok Docfetcher
怜玢の柔軟性怜玢蚀語のサポヌトによる はい はい
怜玢速床むンデックス䜜成による はい はい
特別なコヌド怜玢ツヌル はい いや
キリル文字を䜿甚する いや はい
Visual Studioの統合 いや いや
マルチプラットフォヌム はい はい
免蚱 CDDL Eclipse Public License


分類子による怜玢



分類子は、名前付きオブゞェクトの䜓系的なリストです。 私の意芋では、プログラマに最も人気のある分類子は、゜フトりェア゜リュヌションのすべおのクラスのリストです。 他の分類子の䟋ずしおは、クラスで゜ヌトされたクラスのメンバヌのリスト、フォルダヌで゜ヌトされたファむルのリストなどがありたす。





ShareXアプリケヌションクラス



䞀方では、分類子はツリヌリストを操䜜するためのツヌルずしお䜿甚できたす。 ゜フトりェア゜リュヌションのベヌスネヌムスペヌスを「拡匵」し、目的のモゞュヌルのネヌムスペヌスを「拡匵」し、最終的に目的のクラスに到達するたで続きたす。 䞀方、゚ンドツヌ゚ンド怜玢は分類子内で実行できたす。 たずえば、* Document *ず入力するず、分類子はDocumentが怜出された名前のすべおのクラスを衚瀺したす。



ReSharperを䜿甚しおいる堎合は、Go to Everything関数に぀いおおそらく知っおいるでしょう。これにより、゜フトりェア゜リュヌション党䜓の任意のクラス、メ゜ッド、プロパティ、たたはファむルに移動できたす。 Visual Studioには、゜リュヌション゚クスプロヌラヌアセンブリ、フォルダヌ、ファむル、クラス、およびそのメンバヌを分類、クラスビュヌ名前空間、クラス、およびそのメンバヌを分類、およびオブゞェクトブラりザヌアセンブリ、名前空間、クラスを分類およびそのメンバヌ。 ゜リュヌション゚クスプロヌラヌずクラスビュヌは、゜リュヌション内のクラスのリスト、および゜リュヌションず䜿甚されおいるサヌドパヌティアセンブリの䞡方のオブゞェクトブラりザヌを提䟛したす。 OpenGrokでは、ワむルドカヌド*ドキュメント*の䜿甚を含め、定矩定矩で怜玢できたす。 別の分類子は、フォルダヌに配眮されたアヌティファクトを衚瀺する通垞のファむルマネヌゞャヌです。



分類子はい぀䜿甚する必芁がありたすか 分類子を正垞に䜿甚するには、プログラマヌが゜フトりェア補品に぀いお十分な知識を持っおいる必芁がありたす。 特に、呜名芏則たずえば、* Formはオンスクリヌンフォヌムであり、DocumentNameListFormはDocumentNameタむプのドキュメントのリストフォヌムです、およびクラスがフォルダヌおよび名前空間に線成される原則ディクショナリヌにディレクトリがありたす、およびドキュメント内-ドキュメント。 分類子による怜玢を適甚する別の可胜性は、クラスたたはそのメンバヌの正確な名前がわかっおいる状況です。



゚ラヌ怜玢



定期的に、䜕らかの゚ラヌが発生するコヌド行を芋぀けるタスクが発生したす。 たたは、既知の゚ラヌ番号で目的の行を芋぀けるこずができたす。 この堎合、゚ラヌ番号は、怜玢が実行されるキヌワヌドですキヌワヌドによる怜玢に぀いおは䞊蚘で説明したした。 別の状況では、゚ラヌスタックのトレヌスがわかっおいる堎合がありたす。 ReSharperにはStack Tracesず呌ばれる䟿利なツヌルがありたす。これにより、スタックを衚瀺し、゚ラヌが発生する前に呌び出されたメ゜ッドをナビゲヌトできたす。 スタックトレヌスを䜿甚するには、゚ラヌスタックをクリップボヌドにコピヌし、Visual StudioでShift + Ctrl + Eを抌す必芁がありたす。





Stack TracesでShareXスタックを衚瀺およびナビゲヌトする



゚ラヌ番号たたはスタックトレヌスに関する情報がない堎合は、プロゞェクトを開始し、誀っお割り蟌みを有効にするこずができたす。 Visual Studioは、 Exception Breakerの䟿利なアドオンを䜜成したした。これにより、ワンクリックで誀っお割り蟌みをオンたたはオフにできたす。



ナヌザヌアクションによる



ボタンが抌されたずき、たたは別のナヌザヌアクションが呌び出されたずきにどのメ゜ッドが呌び出されるかを調べるこずが必芁な堎合がありたす。 この堎合、呌び出されたメ゜ッドが存圚するクラスを最初に芋぀けおたずえば、キヌワヌドたたは分類子で怜玢しお、次にこのクラスのすべおのメンバヌにブレヌクポむントを蚭定しお、アプリケヌションを起動できたす。 Webアプリケヌションでは、堎合によっおはFiddlerが圹立぀こずがありたす。特に、呌び出されたWCF関数の名前ずそれに枡されたパラメヌタヌの倀を確認できたす。



たずめ



コヌドの怜玢を開始する前に、チヌムず通信し、ドキュメントを読み、画面フォヌムを䞊べ替えるのに少し時間をかける必芁がありたす。 これは、キヌワヌドを収集し、クラスずメ゜ッドの名前を芋぀けるために必芁です。これがないず、それ以䞊の怜玢が困難になりたす。 最も簡単なものから始める䟡倀がありたすが、必芁なものより少し倚いか少し少ないものを芋぀けるこずができたす。 キヌワヌドたたは分類子を䜿甚しお゜ヌスを怜玢するこずもできたす。 ナヌザヌアクションによっお呌び出される゚ラヌず機胜を怜玢するための特別な手法がありたす。



次の衚は、䞊蚘のコヌド怜玢方法を瀺しおいたす。
方法 説明 ツヌル
コヌド倖怜玢 事前準備

盎接コヌド怜玢、

特に怜玢タスクががやけおいる堎合

たたはプログラマヌが初めお

システム付き
  • チヌムたたはナヌザヌずのコミュニケヌション
  • ドキュメントずバグトラッカヌを読む
  • 画面怜玢


キヌワヌド怜玢 それらが発生するコヌドを怜玢する

䞎えられたキヌワヌド


分類子による怜玢 クラスたたは他のオブゞェクトを怜玢し、

カテゎリヌで䞊べ替え

䟋名前空間、

特にプログラマヌがいいずき

アプリケヌションに粟通しおいるか、既知の

クラスたたはそのメンバヌの正確な名前
  • ReSharper
    • すべおに行きたす
  • ビゞュアルスタゞオ
    • ゜リュヌション゚クスプロヌラヌ
    • クラスビュヌ
    • オブゞェクトブラりザ
  • ファむルマネヌゞャヌ
゚ラヌ怜玢 次のコヌド行を怜玢したす

゚ラヌが発生する
ナヌザヌアクションで怜玢 呌び出されおいるメ゜ッドを怜玢したす

ナヌザヌアクションによる




コヌドの理解



コヌド怜玢は、その理解ず密接に関連しおいたす。 怜玢䞭に埗られた結果の修正方法ず䜿甚方法を理解するために、問題を解決するのに本圓に圹立぀発芋されたすべおの゜ヌスブロックから遞択するためには、理解が必芁です。



コヌドを読たずに理解する



コヌドベヌスの倖郚では、コヌドの怜玢が開始されるだけでなく、それを理解するプロセスも開始されたす。 アプリケヌションの実行、ドキュメントの読み取り、バグトラッカヌ、アプリケヌションログたたはバヌゞョン管理システム、チヌムおよびたたはナヌザヌずの通信により、アプリケヌション内で䜕が起こっおいるかを把握できたす。 ゜ヌスを怜玢するずきず同様に、コヌドを盎接読み取る前に、分析察象の領域に぀いおすでにわかっおいるこずを芚えおおくこずが重芁です。



ブラックボックスリヌディング



コヌドを「ブラックボックス」ずしお読むこずは、倖郚の兆候によっお、関数たたはクラス内で䜕が起こっおいるかを確立しようずしおいるこずを瀺唆しおいたす。 オブゞェクトの名前、受け入れられるパラメヌタヌ、および戻り倀を芋るこずで、オブゞェクトの目的を掚枬できたす。 䟋えば



public ResultOrError SetToClipboard(Image image)
      
      





ほずんどの堎合、画像むメヌゞをクリップボヌドに配眮し、返されたResultOrErrorで発生した゚ラヌに関する情報を配眮したす。



「ブラックボックス」を読むには、呜名芏則、぀たり、プレフィックス、ポストフィックス、およびプロゞェクトで受け入れられる名前の他の郚分に぀いお知るこずが重芁です。 「ブラックボックス」ずは、関数内の説明やコメントを読むこずを指したす。



関数の目的に関する仮定が正しいこずを確認するために、その䜿甚法を調べるこずができたす。 たた、関数呌び出しに぀ながるナヌザヌアクションたずえば、ナヌザヌが[クリップボヌドにコピヌ]ボタンをクリックしたを芋぀け、この知識に基づいお、関数の結果ずしおナヌザヌが受け取るものを理解したすこの堎合、明らかに、クリップボヌド。



ReSharperには、関数の呌び出し元の堎所を芋぀けるこずができる匷力なInspect ThisツヌルずFind Usagesツヌルがありたす。 怜査これは、関数が呌び出される堎所などが呌び出されるコヌドフラグメントを簡単か぀明確にさらに怜玢できるため、より䟿利なようです。 Visual Studio自䜓では、[階局の呌び出し]ツヌルをすぐに䜿甚できたす。このツヌルには、[Inspect This]ず同様の機胜がありたす。





関数が䜿甚される堎所ShareX.UploadManager.UploadFile66-80



ホワむトボックスを読む



「ブラックボックス」内でメ゜ッドコヌドが「閉じられた」堎合境界および関数呚蟺の゜ヌスを調査する堎合、「ホワむトボックス」では調査䞭のメ゜ッド内のコヌドを調査するこずになりたす。



「ホワむトボックス」では、゜ヌスコヌドの読み取り順序が重芁です。 䞀方では、コヌドを理解するために、コヌド党䜓を読む必芁はありたせん。したがっお、重芁性の䜎い行をスキップしお、コヌドの最も重芁な郚分から読み始める必芁がありたす。 䞀方、理解の速床は読みの順序に䟝存したす。 巊から右、䞊から䞋ぞ読むこずは、゜ヌスに飛び蟌む最良の方法ではありたせん。



「ホワむトボックス」を読み取る方法の1぀は、「詳现」を読み取るこずです。最初に第1レベルのコヌドを読み取り、次にレベルを2番目に進みたす。





ディヌプリヌディングShareX.UploadManager.UploadFile43-64



Visual Studioの堎合、 Cアりトラむンアドオンがあり、if、for、およびその他の制埡構造内のテキストを折りたたんだり展開したりできたすVisual Studioは、名前空間、クラス、領域、メ゜ッドを折りたたんで展開できたすが、if、forなどはできたせん建蚭。



「ホワむトボックス」ずしおコヌドを読み取るもう1぀の方法は、「キヌプレヌスから」を読み取るこずです。 原則ずしお、これらは関数が結果を返したり蚈算したり、䜕らかの方法で入力パラメヌタヌを䜿甚したり、ファむル、画面、たたは他のデバむスに出力したりする堎所です。 異なる機胜の重芁な堎所は異なる堎合がありたす。 最初にそれらを芋぀けお読むこずができるこずが重芁です。



Visual Studioには、遞択されたキヌワヌドの出珟箇所が芋぀かったすべおの堎所を゚ディタヌおよびスクロヌルバヌで匷調衚瀺するRockMarginアドオンがありたす。 たずえば、taskSettingsをダブルクリックするず、RockMarginはファむル内でtaskSettingsが芋぀かったすべおの堎所を匷調衚瀺したす。





ShareX \ UploadManager.csのRockMarginバックラむト



アプリケヌションには、倚くの堎合、類䌌したテンプレヌトが倚数ありたす。 䞀般的に䜿甚されるテンプレヌトシングルトンなど、たたはプロゞェクト固有のテンプレヌトUI構築の䞀郚の機胜などのいずれかです。 2぀たたは3぀のキヌワヌドによっおテンプレヌトの機胜を理解できるため、「文字を解析する」こずなく「完党に」テンプレヌトを読む方法を孊ぶ必芁がありたす。 たずえば、䞋の図-シングルトンクラス。赀で匷調衚瀺されおいる2行のコヌドから掚枬できたす。





クラスシングルトンGreenshot.Drawing.Fields.Binding.DecimalFloatConverter29-52



゜ヌスコヌドを読むずきに埓うべき別のシヌケンスは、単玔なものから耇雑なものたでを読むこずです。 たず、䜕が明確であるかを理解しおから、より耇雑な蚭蚈に進みたす。



「ホワむトボックス」のセクションの終わりに、コヌドをレビュヌするずきに読むこずに぀いお、いく぀かの蚀葉を述べたいず思いたす。 盎接読む前に特にボリュヌムリビゞョンを確認しおいる堎合、倉曎されたすべおのファむルの名前を確認し、重芁な倉曎が発生したファむルを理解する必芁がありたす。 読み取りは、重芁な倉曎を含むファむルから開始する必芁がありたす。このファむルから、䞀般的な本質を把握し、他のすべおの改善点をよりよく理解したす。



コヌド改善



゜ヌスコヌドを理解するには、それを読むだけでなく、改善するこずもできたす。 コヌドの認識を改善する最も簡単な方法は、正しくむンデントするこずです。 読みやすさを改善する別の方法は、リファクタリングです。 最も単玔な長い関数の名前倉曎ずいく぀かの短い関数ぞの分割により、プログラムのテキストをより理解しやすくするこずができたす。



耇雑な論理構造を理解するために、ドモヌガンの法則を適甚できたす。



 !(a && b) = (!a) || (!b) !(a || b) = (!a) && (!b)
      
      





コヌドを改善するためのツヌルずしお、ReSharperをお勧めしたす。ReSharperはさたざたな耇雑さの改善に察応したす。



デバッグモヌド



デバッグモヌドでは、゜ヌスコヌドの読み取り䞭に行われた仮定を確認できたす。 デバッグモヌドでの読み取りには、ブレヌクポむントなどのツヌルの䜿甚が含たれたすたずえば、特定の倉数倀でのみトリガヌされる「条件による」ブレヌクポむントを含む、スタックトレヌスの衚瀺、プログラムのステップごずの実行、倉数の倀の衚瀺ず倉曎。



党䜓像



読むずきは、分解されるモゞュヌルで䜕が起こっおいるかに぀いおの䞀般的な考え方を維持し、「パズル」のさたざたな堎所をすばやく移動できるこずが重芁です。



党䜓像を念頭に眮くために、プロゞェクトに存圚する図ず新しい図の䞡方を䜿甚できたす。 特にSQLク゚リの堎合、䞀郚のチャヌトは自動的に䜜成できたす。 たずえば、PL / SQL Developerには、ク゚リに関係するテヌブルずその関係を瀺すク゚リビルダがありたす。 たずえば、Visual Studioでは、クラス図の衚瀺ツヌルを䜿甚しおクラス図を自動的に䜜成できたす。 ただし、倚くの堎合、手描きの図でも十分です。



ReSharper、Inspect This、たたはVisual Studio Viewに組み蟌たれおいるCall Hierarchyツヌルを䜿甚しお、呌び出されたメ゜ッドを読むず䟿利です。 「ブラックボックス」のセクションでは、これらのツヌルは既に怜蚎されおいたすが、関数が呌び出された堎所が調査されたした。 ここでは、関数内で呌び出されるメ゜ッドの衚瀺に぀いお説明しおいたす。 これを怜査し、コヌル階局を衚瀺するず、コヌルツリヌ党䜓が衚瀺される完党な画像が衚瀺され、すばやく移動できたす。



コヌドの任意のブロックをすばやくゞャンプするには、タブを固定し䜜業䞭に開く必芁があった他の20から100ず、密接に䜜業する5から10のクラスを区別するため、゚ディタヌをブックマヌクするか、手動で曞き蟌みたす。クラスずそのメンバヌの名前を曞きたす。



ファむル内のクむックトランゞションには、ReSharper-ファむル構造珟圚のクラスのメンバヌを衚瀺、Visual Studio-メンバヌファむル構造に類䌌たたはRockMargin 瞮小された゜ヌスコヌドを幅の広いスクロヌルバヌ、色合いのブックマヌク、ブレヌクポむントに衚瀺で䟿利です。



たずめ



゜ヌスコヌドを盎接読む前に、コヌドベヌス以倖のさたざたな゜ヌスに目を向けるこずが重芁です。チヌムず通信し、ドキュメントを読み、実行のためにアプリケヌションを実行したす。 これにより、アプリケヌションの基本的な理解が埗られ、コヌドを盎接読むこずができたす。 ゜ヌスコヌドを「ブラックボックス」ずしお読み取り、メ゜ッドの名前、受け入れられるパラメヌタヌなどを「ホワむトボックス」ずしお分析し、メ゜ッド内の内容を分析できたす。 コヌドの認識を容易にするために、たずえばむンデントを改善できたす。 アプリケヌションを実行するず、デバッグモヌドで行われた仮定を怜蚌できたす。 最埌に、本を読むずきは、頭の䞭で党䜓像を保ち、調査䞭のモゞュヌルのさたざたな郚分をすばやく移動できるこずが重芁です。



次の衚は、䞊蚘のコヌドを理解する方法をたずめたものです。
方法 説明 ツヌル
コヌドを読たずに理解する 䞀般的なアむデアを埗る

゜ヌスを衚瀺せずにモゞュヌルに぀いお
  • チヌムたたはナヌザヌずのコミュニケヌション
  • ドキュメントずバグトラッカヌを読む
  • アプリケヌションの起動

ブラックボックスリヌディング 内郚で䜕が起こっおいるのかを理解する

䞀郚の関数たたはクラス

倖向きのサむン撮圱した名前

パラメヌタ、戻り倀

など
  • ReSharper
    • これを調べお
    • 甚途を芋぀ける
  • ビゞュアルスタゞオ
    • 呌び出し階局

ホワむトボックスを読む 調査察象の内郚のコヌドを調査する

方法
コヌド改善 コヌドの読みやすさの改善
  • ReSharper

デバッグモヌド デバッグモヌドでのアプリケヌションの実行
  • デバッグツヌル

党䜓像 䞀般的なビュヌの維持

解析されたもので䜕が起こるかに぀いお

モゞュヌル; 動き回る

コヌド内のさたざたな堎所ぞ
  • ReSharper
    • これを調べお
    • ファむル構造
  • ビゞュアルスタゞオ
    • 呌び出し階局
    • クラス図を芋る
    • 䌚員
  • Visual Studioアドオン


おわりに



コヌドを芋぀けお理解するこずは、゜フトりェア補品を扱う䞊で重芁なステップです。 怜玢ず理解は、リポゞトリの倖郚から始たりたす。チヌムず通信し、ドキュメント、バグトラッカヌを読んで、実行のためにアプリケヌションを起動したす。 怜玢ず理解は、既存のモゞュヌルを完成させるずき既存のモゞュヌルを完成させるために、それがどのように機胜するかを理解する必芁がありたすず、新しい機胜を開発するずきに必芁ですはい、新しいモゞュヌルはコヌドを1行も読たずに開発できたすが、プロゞェクトでは、同様の機胜を実装する個別のブロックがあり、関数ずクラスの実装のテンプレヌトずしお䜿甚できたす。



私の意芋では、広矩のコヌド぀たり、゜ヌスの怜玢ず理解の䞡方でのコヌドの読み取りは、開発者がタスクの䜜業の別の段階に割り圓おる必芁がありたす。 この段階の結果は、特定のコヌドブロックの䜜業の䞀般的なアむデアだけでなく、タスクで䜜業するずきに圹立぀メ゜ッドずファむルのブックマヌクのセットです。 盎接プログラミングのフレヌムワヌクで既に、゜ヌスの怜玢を継続する必芁がありたす。 たずえば、次のように、新しいクラスに出䌚い、䜿甚されおいる堎所を芋぀け、䟿利なブックマヌクのリストを曎新したした。 おそらく、チヌム内の別の機胜でブックマヌクの遞択を区別できたす。技術リヌダヌたたは担圓の開発者が有甚なブックマヌクのリストを䜜成し、その埌、プログラマヌが仕事に取りかかりたす。



゜ヌスの怜玢ず理解の䞡方のために、名前の芏則ずクラスフォルダヌ、名前空間を敎理する方法を知るこずが重芁です。 著者の経隓によるず、このような理解はプロゞェクトの䜜業䞭に埗られたすが、コヌドデザむンに関する合意コヌドスタむルガむドず同じ方法で、合意を正匏なものにしお新しい開発者に䌝えるこずができたす。

クラスの順序の名前ず方法に関する実際の既存の合意を明らかにする自動化ツヌルを開発するこずは有望なようです。 最も䞀般的なフォルダ名、接尟蟞、接尟蟞などを識別するツヌルが圹立぀ようです。



コヌドを読むずき、および通垞の本を読むずきは、読む目的を理解し、念頭に眮くこずが重芁です。 コヌドを読むために、プレヌンテキストの読み方に関する蚘事からいく぀かのトリックを適甚できたすたずえば、 「読んだテキストを理解する胜力を向䞊させる方法」を参照。



評䟡できる限り、コヌドの怜玢ず理解は、囜内倖の文献ではあたり觊れられおいないトピックです。 提瀺された蚘事が、コヌドベヌスを䜿甚した効果的な䜜業のテクニックを習埗するのに圹立぀こずを願っおいたす。





ツヌル

コヌドを怜玢するには



  • Opengrok
  • Docfetcher
  • フィドラヌ
  • ReSharper
  • ビゞュアルスタゞオ
    • むンラむン怜玢Ctrl + F
    • ゜リュヌション゚クスプロヌラヌ
    • クラスビュヌ
    • オブゞェクトブラりザ
    • ブレヌクポむント
  • Visual Studioアドオン
  • ファむルマネヌゞャヌ
  • 画面怜玢


コヌドを理解するには



  • ReSharper

    • これを調べお
    • 甚途を芋぀ける
    • ファむル構造
    • リファクタリングツヌル
  • ビゞュアルスタゞオ
    • 呌び出し階局
    • クラス図を芋る
    • 䌚員
    • デバッグツヌル
  • Visual Studioアドオン
  • アプリケヌションの起動


䞀般的な方法



  • チヌムたたはナヌザヌずのコミュニケヌション
  • ドキュメントずバグトラッカヌを読む



All Articles