今回は記事でVMではないので[GLOVA1]、グラフとして整理したオブジェクトやオブジェクト参照の取り扱いが少々難しい。そのため、ParseTreeのS-exprツリー表現を使う。S-exprは入れ子になったリストで、各リストがツリー内のノードを表し、最初の要素がノード型を指定している。サンプルでは、ノードが仮想メソッド(vcall)への呼び出しを表す。パラメータはレシーバ(呼び出されたメソッド内のそれ「自身」)、メソッド名、パラメータである。ツール向けのアイデアは型検査であり、動的解析ツールあるいは自動リファクタリングになるだろう。した種類のツールが機能するための必要条件の1つが型推論で、変数あるいは式の型を決定する。次のASTはto_sメソッドへの呼び出しを表す。その判断は難しいが、to_sはオブジェクトの文字列表現を返すメソッドなので、「文字列」を返すとだけ言っておこう。これは必ずしも真実ではなく、推測である。コード補完機能のようなツールでは十分だろうが、こうした事柄が100%正確というわけにはいかない。場合によっては、もっとたくさんの情報を集めることもでき、そうなればアナライザはいっそう正確な情報を判断できるだろう。アナライザはツリーに取り掛かり、そして決定したメタデータをASTにアノテートする。コードベースをモジュールにしておくための良いアイデアは、アナライザをメタデータ消費者から分離しておくことである。メタデータ消費者とはつまり、ASTを動かして[GLOVA2]メタデータに何らかの処置を施すコードのことである。Rubyのエディタは、スーパークラスで別のメソッドをオーバーライドするメソッドを強調表示することができる。ソリューションかいつまんで話すと、ParseTreeノードをアノテートするソリューションは以下のとおりである。:String)一体何をやっているのか?秘密のソース:シングルトンクラスRubyではあらゆるオブジェクトがクラスのインスタンスである。他の多数のOOP言語とは異なり、Rubyではオブジェクトのクラスを変更できる。これをオープンクラスと混同してはいけない。Rubyでは、ランタイム時にさえ、クラスの修正が可能である。シングルトンクラスは類似しているが、単一オブジェクトのクラスのみに影響を与える点で異なる。小さな相違に見えるかもしれないが、影響を受けるオブジェクトだけにクラス修正の効力を制限するという点で、大きな利点がある。それに比べてオープンクラスは、こうしたクラスの全コードと全オブジェクトのクラス定義を変更する。有用だが、他人のコードにも手を出すことになり、そして共通クラスのあまりにも多数のコードに変更が起これば、既存メソッドとの名称衝突が起こる可能性がある。ParseTreeノード(普通のRuby配列)のケースでは、ヒープ上のすべての配列ではなく、実際に使用された配列オブジェクトだけが影響を受けることを意味する。別の見方をすると:シングルトンクラスを使えば、クラスを作成して使用するコードに局所的にクラス変更を加えることができ、外に見せる必要はまったくない。他方、オープンクラスはグローバルな変更である。クラス名はグローバル変数であり、すなわち「文字列」は文字列を表すクラスオブジェクトを指す。適用範囲を絞った変数(ローカル変数、メンバー変数)がグローバル変数より望ましいのと同様に、オープンクラスよりシングルトンクラスが望ましいのである。どちらのソリューション(シングルトンもしくはオープンクラス)を選ぶかは個々の状況に左右される。オープンクラスでは、クラスへの変更は1度で、その後は、そのクラスの全オブジェクトにメソッドが加わっている。シングルトンクラスでは、クラスへの変更(すなわち、シングルトンクラスの作成とそれを指し示すオブジェクトのクラスポインターの変更)は、すべての変更で発生する。構文は前述したように単純である。codeendオブジェクトを指し示す変数はメソッド名のプレフィックスになっている。これよりも柔軟で、モジュール的な方法はMixinの使用である。すればモジュールでアスペクトを処理するメソッドをまとめて一括でミックスできる。:String)Mixinでは、モジュール内で定義された機能をクラス内へとミックスできる。このサンプルでは、ノードオブジェクトのシングルトンクラスである。一度言うが、このオブジェクトに限ってこうしたメソッドが存在することになる。静的アナライザコードが抽象的過ぎるなら、別のツールを試してみよう。不要コードのリムーバだ。「不要コード」とは、単に何もしないコードであり、取り除いてもプログラムの動作は変わらない。doendアノテーションのコンセプトでは、こういった種類のコードを探し、次のようにアノテートすることができる。:true)けれども、コードに不要と印をつけるのは、ほんの第一歩に過ぎず、今度は除去する必要がある。ここへ来て、解析と処置の分割が合理的であることが簡単に理解できるだろう。IDEは若干のコードを不要コードとして強調表示したいだけかもしれないが、簡単なコード削除方法(応急処置)を提供することもある。ASTからノードをダンプした後にRuby2Ruby(source)を使ってRubyソースを吐かせることは可能であろう。気持ちの良いソリューションとは言えない。ASTをRubyソースコードに変えるが、フォーマット(空白スペース)やコメントのなどの多数の有用情報を失ってしまう。した情報を無くしてしまうことは、IDEやリファクタリング/クリーンアップツールで容認できるものではない。メタデータの助け船:ノードはソースの場所、つまり、この特定ノードが元々のソースコードで見つかる場所でアノテートすることができる。それがあれば、ことは簡単である。クリーンアップコードは単にコード中を走って、:dead_codeと印のついた全ノードを見つけ出し、ソース場所メタデータの文字オフセットを使ってソースファイルで印つきのノードを除去する(もちろん、ノードを除去すると、残存ノードのオフセットに狂いが生じる。これを解決するには、削除した文字数を覚えておいて、実際のオフセットから差し引けば良いだけである。すれば、ソースの再パーズと再解析は必要ない)。結論この記事の例は言語ツールに焦点を当てたが、ここで述べたアイデアはあらゆる種類のオブジェクトコレクションで利用できる。オブジェクトグラフにアノテーションが必要な場所なら、単独で書かれたアナライザによる複数のパスという可能性もあり、その場所がどこになってもノードと一緒にアノテーションを保管しておけば好都合である。ParseTreeにおける配列クラス)、シングルトンクラスを選択すれば良いだろう。その他の状況では、オープンクラスがより良いソリューションとなるかもしれない。1.8.x向けに利用可能である。JRuby版は個々のノードにもソースの場所を付加するので、ソースの修正がさらに容易になる。ツールのアイデア出しやツール書きを楽しもう。Rubyでは簡単にできるのだから。毎週火曜日に前週のまとめコンテンツがお送りいたします。25万人ものシニアデベロッパーのコミュニティーにぜひご参加ください。サンプルを見るあなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。登録するとさまざまなことができます。アカウント登録をしてInfoQをお楽しみください。あなたの意見をお聞かせください。毎週火曜日に前週のまとめコンテンツがお送りいたします。25万人ものシニアデベロッパーのコミュニティーにぜひご参加ください。サンプルを見る様々なイノベーターとアーリーアダプターがお送りするテクノロジーの概要を見る。自分がまだ知らないことに気づいていないと知るあなたが興味のあるトピックスをいつでも最新な情報に。あなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。よい世界へ私たちが暮らす世界を大切に思い、よりよいものにしたいと考えています。人のためのソフトウェア開発を加速し私たちのミッションを実現することで、この思いを成し遂げようとしています。私たちは利益の1%をさまざまな慈善団体に寄付しています。会社として、また従業員として、そうしたことの価値を強く信じているからです。with.プライバシーBTあなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。アドレス*Eメールを変更すると確認のメールが配信されます。会社名:現在の会社名をご入力ください。Other組織規模:現在の組織規模をご入力ください。2,501+国:現在の国を設定してください。Zimbabwe都道府県:現在の都道府県に設定してください。次の都道府県にアップデートする:ニュースレターを購読しますか?インダストリーメールを購読しますか?本Eメールに登録すると、以前より関心のあったトピックの関連情報をお送りする場合がございます。詳細はこちらのプライバシーポリシーをご覧ください。newsletter?新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。