コード折り畳み

vimにおけるPHPでのコード折り畳みの例。

コード折り畳み (: code folding、コードおりたたみ)は、テキストエディターソースコードエディター統合開発環境などに備わっている機能であり、ユーザーは、日々行う編集操作の中で、現在編集中のファイルのセクションについて選択的に表示/非表示(「折り畳み」)を切り替えることができるというもの。これにより、ユーザーは、関連するテキストのサブセクションのみを表示しながら編集することができるため、大きなサイズのテキストファイルを編集する際に利便性が向上する。

折り目の識別は自動で行われる。コンピューター言語の構文上の境目、インデントが異なる領域を認識することができる。または折りたたむ範囲を手動で指定できる場合もある。

多くのエディターは、行番号の横にあるサイドバーにコードを折りたたむボタンを表示する。折り畳み可能な領域の先頭に[-]や▼などのボタンを、展開可能な領域の先頭に[+]や▶などのボタンを表示する。この機能は、ソースコードを管理するコンピュータープログラマーや、データ比較を行うエディターなどで使用される。

テキスト折り畳み (: text folding、テキストおりたたみ)は、折り畳み機能付きエディタ、アウトラインプロセッサワードプロセッサに実装されている同様の機能だが、コードではなく通常のテキスト向けに使うことができる。ソースコードの構文の替わりに、人間が使用する言語の構文、特に段落やセクションレベルに基づいて折り畳みを行う。

データ折り畳み (: data folding、データおりたたみ)も、データに対する似たような機能である。これは、一部のバイナリエディタに実装され、バイナリファイルを構造化するか、RAMエディターでアクセスできないデータセクションを非表示にするために使用される[1]

このような機能には、「展開と折りたたみ」、「コードの非表示」、「アウトライン」など、さまざまな代替用語がある。マイクロソフトでは折り畳み可能なアウトライン (: collapsible outlining) という用語で呼ばれる。

歴史

[編集]

エディターへのコード折り畳み機能の実装で、有名な最古の例はNLSであろう[2]。 最初に広く利用された折り畳み機能付きエディターは、IBM 370メインフレーム用の1974 Structured Programming Facility (SPF) エディターであり、インデントに基づいて行を非表示にすることができ、3270端末に表示された[3]。 これは、 COBOLなどの冗長な言語で非常に役立った。このエディターは、後にInteractive System Productivity Facility (ISPF) に進化した。

使用例

[編集]

コード折り畳みにはさまざまな使用パターンがあり、主にコードを整理したり、あまり役に立たない情報を隠したりして、より重要な情報に集中できるようにする。一般的なパターンは次のとおりである[4]

アウトライン

[編集]

最も基本的に、アプリケーションはコード折り畳みを使用してソースコードのアウトラインを作成し、各ブロックを1行に折りたたみます。これは、関数やクラスなどの最上位ブロック、ネストされた関数やメソッドなどのネストされたブロック、またはすべてのブロック、特に制御フローブロックのみです。これにより、コードの概要を把握し、コードを簡単にナビゲートして再配置し、他のコードに気を取られることなく、必要に応じてより詳細にドリルダウンできます。表示に関しては、これによりすべての関数のリストを(本体なしで)すばやく表示できますが、ナビゲーションに関しては、長い関数を超えた広範なページング(またはターゲットの検索)を次の関数に直接移動する代わりに使用できます。

ボイラープレートコードを非表示にする

[編集]

一部の言語やライブラリでは、多くのボイラープレートコードが必要となる。これにより、コードが非常に長くなり、要点がわかりにくくなる。

たとえば、Javaでは、getterとsetterを含む単一のプライベートフィールドは、3行に畳まれている。

private String name = null;
public String getName() { return name; }
public void setName(String name) { this.name = name; }

これは、関数における通常の改行方法を採用した形式に展開すると10行となる。

private String name = null;

public String getName() { 
  return name;
}

public void setName(String name) {
  this.name = name;
}

さらに、コードにコメントが含まれている場合は、20行に展開される。

/**
 * Property <code>name</code> readable/writable. 
 */
private String name = null;

/**
 * Getter for property <code>name</code>
 */
public String getName() {
  return name;
}

/**
 * Setter for property <code>name</code>.
 * @param name
 */
public void setName(String name) {
  this.name = name;
}

メタデータの折り畳み

[編集]

メタデータは表示が冗長になることが多く、かつ人間にとってメタデータが記述している行は重要ではない。メタデータを折り畳むことで、プログラマーは他の部分に集中できる。たとえば、C#の属性の長いリストは、次のように手動で折りたたむことができる[5]

#region Attributes 
[Browsable(false)]
[MergableProperty(false)]
[DefaultValue(null)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(MyType))]
[TemplateInstance(TemplateInstance.Single)] 
#endregion
public ITemplate ContentTemplate
{
  get { return _temp; }
  set { _temp = value; }
}

折りたたまれたコードは次のように表示される。

Attributespublic ITemplate ContentTemplate
{
    get { return _temp; }
    set { _temp = value; }
}

コメントの折り畳み

[編集]

コメントは人間が読める形式のメタデータであり、長いコメントがあるとコードが読みにくくなる。コードの短いセクションに対して多くの行を割いた長いコメント、JavadocXMLドキュメントなどのドキュメントジェネレータに対するコメントなどが該当する。コード折り畳み機能を使うと、長いコメントを必要な場合にのみ表示できる。 Python docstringsのように、長いコメントに1行の要約行がある場合は、セクションが折り畳まれると要約が表示される。

脚注

[編集]

 

外部リンク

[編集]