動的 Element 生成を実装するときの状況例を明文化する

手間の観察が必要だ

何べんも行ってきた作業だが、 動的 Element 生成を実装するプログラムは、書いていてとても手間がかかる。
とてもしんどい。
その手間をテンプレートエンジンなどを、導入することで減らしたい。

仮にそのようなテンプレートエンジンを実装することにしたとする。
テンプレートエンジンを実装するにあたり、 動的 Element 生成のプログラミングでは、 実際にはどのような実装をしているか、よく観察する必要がある。
どのような実装をしていて、どのように手間なのかを理解するためだ。
どのように実装しているか、業務で行った作業をふりかえり観察してみよう。

作業をふりかえる

動的 Element を生成するために、 クローン元にする Tag を あらかじめ HTML で非表示の Element の下にレンダリングした。
その Tag はHTML ページが初期表示されたときにすでに存在している。
変更不可能なグローバル変数的に、その Tag はいつでも参照できる状態にあることになる。

状態が変わって、動的に Element を生成することになったとする。
例えば、ドロップダウンリストを選択し、その選択内容にあわせて、何かを表示するような場合を想定している。
状態が変わることを、検知するためにイベントをハンドルする関数を登録する。
そのハンドルする関数内で次のようなことを行う。

まず動的生成を行った Element を全て削除する処理を実装した。
以降の処理で生成した Element を追加するにあたり、 先にイベントが起きていて、Element が生成してあったら、それは一旦なかった状態にしなければならないからだ。

次にどのような状態になったかを確認する。
ある状態では、Element生成する必要があるが、ある状態では必要がないという、ビジネス的要件があった。
そのための確認だ。

確認した結果、Elementを生成しなければならない場合だったとする。
非表示 の Element の下にある、クローン元の Element を、querySelector() か jQuery などで検索し取得する。
取得できた Element をクローンする。
クローンした Element へ、その Element 固有に与えなければならない情報や、id、class、属性などを指定する。
この Element を情報設定済 Element と呼ぶことにする。

今回の作業では、そのクローンした要素を、ページ中の1から数か所以上へ配置するようにしなければならなかった。
そのため、情報設定済 Element を配置先の数だけ、クローンする。

次に配置先の Element を特定する。 これも querySelector() か jQuery などで検索し取得する。
取得した配置先 Element の child node へ、情報設定済 Element をさらにクローンして追加する。
これを1から数か所に対して行う。

最後に配置先へ、追加したことによって、さらに状態が変わるので、その状態を確認し、画面表示に反映させる。
例えば、Element の数を画面に何件と表示しているような場合だ。
もともと2件と表示していたものを、追加したことで、5件と書き直すようなことをする。

ここまでで動的 Element 生成で行った実装の一巡となる。
この一巡の実装を、個別の状態に対して、全部面倒をみるように実装しなければならないわけだ。

ふりかえりの整理

整理のために、ふりかえりの中で表れた作業を箇条書きに抜き出してみよう。

  • クローン元 Tag を非表示で準備
  • イベントハンドリング設定
  • 生成済み Element を全削除
  • クローン元 非表示 Tag 取得
  • 取得 Tag をクローン
  • クローン済み Tag へ情報設定。それを情報設定済 Element とする
  • 配置先 Element を取得
  • 情報設定済 Element をクローン
  • クローンした情報設定済 Element を配置先 Element へ追加
  • 追加完了後の状態を画面へ反映

整理を省察する

さて私の状況で手間を減らすために、テンプレートエンジンを実装するとしたときに、 箇条書きにあげた事項を、端的記述で表現して指定できることが、 テンプレートエンジンに求められるわけだ。
そのような記述を設計し、処理できる仕組みを考えることは大変な仕事だ。