Featured image of post Undo/Redo付きのエディタを、PerlとMooで一から作る。まずはinsertとdeleteだけのEditorクラス【Editorクラス】

Undo/Redo付きのエディタを、PerlとMooで一から作る。まずはinsertとdeleteだけのEditorクラス【Editorクラス】

Undo・Redo・マクロまで備えた簡易テキストエディタを、Perl と Moo で全10回かけて作ります。第1回は text 属性に文字列を持ち、指定位置に挿入する insert と、指定位置から指定の文字数を消す delete だけの Editor クラスを作り、元に戻す機能がまだ無いところから始めます。

Featured image of post モジュールごとにnewした設定が食い違う。Perlの設定ファイルマネージャーでSingletonパターンにたどり着く全5回【目次】

モジュールごとにnewした設定が食い違う。Perlの設定ファイルマネージャーでSingletonパターンにたどり着く全5回【目次】

Perl と Moo で設定ファイルマネージャーを作りながら、モジュールごとに new した設定が食い違う問題に出会い、インスタンスを1つにまとめ、最後に Singleton パターンだと名前を付ける全5回の連載の目次です。どこから読むか、困りごとからも選べます。

Featured image of post インスタンスを1つに保つinstance()には、Singletonという名前がある。テストの間で状態が残るといった注意点も押さえる【Singletonパターン】

インスタンスを1つに保つinstance()には、Singletonという名前がある。テストの間で状態が残るといった注意点も押さえる【Singletonパターン】

第4回で作った state $instance と instance() は、GoF の Singleton パターンの核心にあたる。定義と構造に Config の実装を当てはめ(外からの new を防ぐ部分は未実装)、どこからでも同じインスタンスに届く利点と、テストの間で設定が残る・依存が見えにくくなるといった注意点、向いている場面を整理します。

Featured image of post 設定オブジェクトを引数で渡し続けるのも、グローバル変数も避けたい。state変数とinstance()でConfigを1つにする【instance()メソッド】

設定オブジェクトを引数で渡し続けるのも、グローバル変数も避けたい。state変数とinstance()でConfigを1つにする【instance()メソッド】

引数で渡し続けず、グローバル変数も使わずに、メインと Logger で同じ Config を使いたい。state 変数で唯一のインスタンスを抱える instance() を Config に足し、両方の呼び出しを Config->instance() に替えて、メインで OFF にしたデバッグログが出なくなるのを確かめます。

Featured image of post メインでOFFにしたデバッグモードが、Loggerには届かない。newのたびに別のConfigができる問題を確かめる【インスタンス】

メインでOFFにしたデバッグモードが、Loggerには届かない。newのたびに別のConfigができる問題を確かめる【インスタンス】

Logger モジュールの中で Config->new すると、メインスクリプトで debug を 0 にしても、Logger は設定ファイルを読み直して ON のままログを出す。new するたびに別のインスタンスができることを実行結果と図で確かめ、引数で渡す・グローバル変数にする、の2案では何が困るかを見ます。

Featured image of post 設定を変えるたびにスクリプトを書き換えている。INIファイルから読み込むload_configを足す【ファイル読み込み】

設定を変えるたびにスクリプトを書き換えている。INIファイルから読み込むload_configを足す【ファイル読み込み】

設定値をコードに書いている限り、デバッグモードを切り替えるだけでもスクリプトを開いて直すことになる。key = value 形式の config.ini を1行ずつ読み、空行とコメントを飛ばして正規表現で解析する load_config と、ハッシュに値を出し入れする set・get を Config に足します。

Featured image of post スクリプトに散らばった設定値を、1か所に集める。PerlとMooでConfigクラスを作る【設定クラス】

スクリプトに散らばった設定値を、1か所に集める。PerlとMooでConfigクラスを作る【設定クラス】

アプリ名・バージョン・デバッグモードを変数でスクリプトに直書きしていると、どこに何の設定があるのか見渡せない。Perl と Moo の has で3つの設定を Config クラスに集め、読み取り専用(ro)にして、default の値を new の引数で上書きできるようにします。

Featured image of post 本棚の配列をforで直接回すと、中身の作りを変えたとき呼び出し側をすべて直すことになる。番号で取り出しても残る依存を確かめる【カプセル化】

本棚の配列をforで直接回すと、中身の作りを変えたとき呼び出し側をすべて直すことになる。番号で取り出しても残る依存を確かめる【カプセル化】

本棚の本を一覧表示しようと $shelf->books->@* と書くと、中身が配列であることに使う側が依存する。get_length と get_book_at に変えても「番号で取り出せる」という前提は残る。内部の作りを変えたときに何が壊れるかを2つのループで比べます。