本日 レガシーソフトウェア改善ガイド の第4章で紹介されていた「期限切れのコード」を読み、心当たりしかなかったので早速実践として動くコードを書いてみる
期限切れのコードとは
広告キャンペーンで決まった期間だけバナーを表示するとか、A/Bテストを実施してみるとか。
そういう、役目が終わりもう使われないコードがリポジトリ内に残ったままだとコードリーディング時の認知負荷を上げてしまうため、使い終わったら即削除すべき。
なのですが弊社は削除のためのタスクが発行されることもなくそのまま残してしまう傾向しかないため、消し忘れている場合はビルドが失敗するようにして、削除を促すようにする。
やり方とサンプルコード
一時的にしか使われないコードには、決まったテンプレートを使って有効期限を付与する。サンプルコードでは [Expire] YYYY-mm-dd をテンプレートとする。
PHP
2024年01月22日以降は使わないコード
// [Expire] 2024-01-21
// バナー表示有効期限内であればバナー表示
if (CarbonImmutable::now()->lte(new CarbonImmutable('2024-01-21 23:59:59')) {
// バナー表示
}
Github Actions
.github/workflows/main.yml
name: PR Workflow
on:
pull_request:
# プルリクオープン・プルリクリオープン・プルリク編集
types: [opened, reopened, synchronize]
jobs:
expire_comment:
uses: ./.github/workflows/expire_comment.yml
.github/workflows/expire_comment.yml
name: Check Expire Dates
on:
workflow_call:
jobs:
check-dates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check for expired date
run: bash .github/scripts/check_expire_date.sh
.gihub/scripts/check_expire_date.sh
#!/bin/bash
# 本日の日付を Y-m-d 形式で取得
current_date=$(date +%Y-%m-%d)
# pull request で新規追加・変更されたファイルのリスト
changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)
for file in $changed_files; do
# ファイルが削除による変更であればスキップ
if [ ! -f "$file" ]; then
continue
fi
# ファイル内の [Expire] タグを検索
grep -Fn "[Expire]" "$file" | while read -r line ; do
line_number=$(echo "$line" | cut -d: -f1)
line_content=$(echo "$line" | cut -d: -f2-)
# 日付を抽出([Expire] Y-m-d の形式を想定)
# \K はそこ以前の [Expire] を省略し、Y-m-d の部分のみを取得する
expire_date=$(echo $line_content | grep -oP '\[Expire\] \K\d{4}-\d{2}-\d{2}')
# 日付が抽出できなかった場合、または日付が過去の場合にエラー
if [[ -z $expire_date ]] || [[ $expire_date < $current_date ]]; then
# ファイル名と行番号を取得する
echo "Invalid or expired date found: $expire_date in $file:$line_number"
exit 1
fi
done
done
# 正常終了
exit 0
※リポジトリの全コードを参照する方が望ましいような気もしますが、大きなリポジトリだと参照に時間が掛かりビルド時間も伸びてコストも増えるため現状は新規追加・修正ファイルのみを対象としています。
まとめ
問題なく有効期限の設定と有効期限切れ時にビルドで失敗できるようになりましたが、そもそもみんなが有効期限があるコードに有効期限テンプレートを書いてくれるかという大きな問題は残ったままですね…。