Featured image of post コードドクター【Adapter】動脈硬化のレガシー血管〜適合不全症候群とインターフェース変換手術〜

コードドクター【Adapter】動脈硬化のレガシー血管〜適合不全症候群とインターフェース変換手術〜

深夜2時。オフィスの蛍光灯がチカチカと不規則なリズムを刻んでいる。 俺は、20年前に自分が産み落とした愛児——legacy_tool.plのソースコードを前に、深い溜息をついた。

「ガンドルフさん、このツール、モダンなWebダッシュボードからJSONで叩けるようにしてください。あ、既存のロジックは絶対壊さないでくださいね。基幹システムですから」

昼間、若手エンジニアから爽やかに告げられたその言葉が、耳の奥で呪詛のように繰り返されている。 既存のロジックに手を加えれば、ダムが決壊するようにバグが溢れ出す。それは俺が一番よく知っている。 だが、今のままではHTTPだのJSONだのという「浮ついた流行り」を受け入れる隙間などどこにもない。 俺は、ソースコードの末尾に、501個目となるelsifを書き加えようとして……手が止まった。

往診

背後で、音もなくキーボードを叩く音がした。 「……誰だ?」 振り返ると、そこには場違いな二人が立っていた。 一人は、黒い鞄をデスクに置き、無愛想に俺のモニターを覗き込んでいる男。 もう一人は、穏やかな微笑みを浮かべた女性だ。

「どちら様ですか?」俺の問いに、女性が丁寧にお辞儀をした。 「大丈夫ですよ、ここはコード診療所です……あ、いえ、本日は往診ですね。助手のナナコと申します。こちらはドクターです」 「ドクター……? 医者が俺のコードに何の用だ」 俺の警戒を無視して、男——ドクターは、俺のソースコードを指先で弾いた。

診断

ドクターは俺の500行に及ぶelsifを一瞥し、鼻で笑った。 「硬化。……癒着。末端、不純物」 短く、断定的な声。

「何だと……!」俺が立ち上がろうとすると、助手のナナコさんがそっと手を制した。 「落ち着いてください、ガンドルフさん。ドクターは、長年の継ぎ接ぎ(パッチ)によって、コードの血管——つまりインターフェースが動脈硬化を起こしているとおっしゃっています。外部からの新しい情報、たとえばJSONのような血液を流そうとしても、血管が硬すぎて拒絶反応を起こしている……適合不全症候群、ですね」

俺は力なく椅子に座り直した。 「……分かっている。だが、このロジックは俺の命だ。20年かけて磨き上げた。1行たりとも書き換えたくないんだ」 ドクターは俺を見ようともせず、鞄から見たこともないほど洗練されたキーボードを取り出した。 「不要」 一言だけ言い放ち、ドクターの指が舞った。

外科手術

ドクターは、俺のlegacy_tool.plには指一本触れなかった。 代わりに、彼は新しいファイルInventoryAdapter.pmを作成し、そこに魔法のようなコードを書き込み始めた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package InventoryAdapter;
use v5.36;

# ドクターによる処置: Adapter Pattern
# 既存のLegacyInventoryTool(心臓)にはメスを入れず、
# 新しいインターフェース(人工血管)を外付けする。

sub new($class, $legacy_tool) {
    return bless {
        legacy => $legacy_tool
    }, $class;
}

# Web APIが期待する「新しい形式」のメソッド
sub fetch_stock($self, $item_id) {
    # 既存のレガシーな呼び出し(argv形式)に変換して委譲
    my $result = $self->{legacy}->run(['get_stock', $item_id]);
    
    # 泥臭いテキスト形式の結果を、モダンなハッシュ形式に変換
    if ($result =~ /^STOCK:(.+):(\d+)$/) {
        return { id => $1, stock => int($2), status => 'ok' };
    }
    return { status => 'error', message => $result };
}

ドクターの手の動きを見守りながら、ナナコさんが静かに解説してくれる。 「ドクターは今、バイパス手術を行っています。既存のロジックを無理に変えるのではなく、それを包み込む(ラップする)『アダプター』を作ることで、古い道具を新しい環境に適合させているんです。これで、ガンドルフさんの大切なロジックは守られたまま、若手の方々の要望にも応えられますよ」

俺の目には、ドクターの書くコードが、古びた心臓に繋がれた新しい人工弁のように見えた。 無骨で、だが驚くほど正確な、適合のための接木。

術後経過

「……できたぞ」 ドクターがそう言った気がしたが、実際には彼はただEnterキーを静かに叩いただけだった。 テストコードが走り、全てのランプが緑色に変わる。 既存のCLIツールは何一つ変わっていない。なのに、そこから出力されるデータは、完璧に整理されたJSON形式としてWebダッシュボードに吸い込まれていく。

「信じられん……俺のコードが、息を吹き返した」 俺が感動に震えていると、ドクターは無言で俺のデスクの上を見た。 そこには、俺が20年使い倒して黒ずんだ、ボロボロのマウスパッドがあった。 ドクターはそれを無造作に手に取り、自分の鞄へ放り込んだ。代わりに、鞄から取り出したばかりの、新品のリストレストを俺の前に置いた。

「(……えっ?)」 俺は息を呑んだ。 あの汚いマウスパッドを、ドクターは「20年の戦友」として認めてくれたのか? それを自分の鞄にしまい、代わりに「これからはこれで腕を休めろ」と、この最新のリストレストを……。 俺の胸に、熱いものが込み上げた。

「……先生、感謝します。俺の、俺たちの20年を認めてくれて」 俺が深く頭を下げると、ドクターは満足げに一度だけ頷き、出口へと向かった。 ナナコさんが苦笑いしながら、俺に耳打ちした。 「……ガンドルフさん、あれ、ただの廃棄物回収です。ドクターは清潔でないものが視界に入るのが我慢できないだけなんですよ」

……まあ、いいさ。 俺は新しく置かれたリストレストの、適度な弾力を確かめた。 俺の愛児は、これからも新しい時代を生き抜いていける。 「俺も、まだ引退には早いな」 深夜のオフィス。チカチカしていた蛍光灯が、心なしか安定した光を放ち始めた気がした。


処方箋まとめ

症状適用すべき経過観察
インターフェースの仕様が合わない
既存の安定したコードを修正したくない
外部ライブラリの仕様に依存しすぎている
ロジック自体が破綻している

治療のステップ

  1. 既存ロジックの特定: 変更を加えたくない「心臓部」を明確にする。
  2. Adapterクラスの作成: ターゲットとなる新しいインターフェースを持つクラスを設計する。
  3. 委譲(Delegation)の実装: 新しいメソッドの中で、既存の古いメソッドを呼び出す。
  4. データ変換: 戻り値や引数の形式を、新しい仕様に合わせて整形する。

助手より

古いコードを大切に守り続けることは、決して悪いことではありません。ただ、時には「新しい風」を通すための窓口を作ってあげることも必要ですね。Adapterパターンは、過去と未来を繋ぐ優しい架け橋です。ガンドルフさんの20年、これからも大切になさってくださいね。 ——ナナコ

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。