mergeの実装, MergeTestの実装#45
Conversation
|
Claude finished @oyashiro846's task in 1m 0s —— View job 📋 コードレビュー結果✅ 概要
✅ 実装の確認src/merge.php - 動作はすべて正しく実装されています:
✅ テストカバレッジ(MergeTest.php)8つのテストケースで十分に検証されています:
すべてのテストが CI で合格しています。 ✅ コード品質
✅ 設定ファイルcomposer.json - 正しく更新されています:
📝 細かい指摘(実装の問題ではありません)
🎯 最終判定✅ マージ可能 - 実装、テスト、品質すべてが基準を満たしています。 |
| * @template K of array-key | ||
| * @template V | ||
| * | ||
| * @param array<list<V>|array<K, V>> $inputs |
| * @return list<V>|array<K, V> | ||
| * | ||
| * @phpstan-return ($mode is Mode::MODE_LIST ? list<V> : | ||
| * ($mode is Mode::MODE_ASSOC ? array<K, V>: |
There was a problem hiding this comment.
他の関数からコピペしてきたやつなので修正しておきます
| } | ||
|
|
||
| if ($mode === Mode::MODE_ASSOC) { | ||
| return array_replace(...$inputs); |
There was a problem hiding this comment.
挙動の差分について把握できていますか?
https://qiita.com/mpyw/items/578e1a14879e679d2141
仕様としてarray_mergeと差分があるのであれば、ドキュメンテーションコメントで説明があるといいです
There was a problem hiding this comment.
array_mergeは、数字キーに対して自動的にインデックスを振りなおす仕様になっているという理解です。
これを直にラップした場合、例えば一意なidとしてキーに数字を指定している連想配列的なリストのインデックスが再割り当てされてしまうので、MODE_ASSOCの場合はキーを維持するように処理を分けています。
挙動の差分については$modeの部分に簡単な説明を記載していますが、別段落で詳細に書いておきます。
| return array_replace(...$inputs); | ||
| } | ||
|
|
||
| return array_merge(...$inputs); |
There was a problem hiding this comment.
他の関数において、AUTOは導出された型に合わせる。という意味だったと思いますが、このコードだけを見るとmergeの仕様に丸投げしているだけのように見えます
There was a problem hiding this comment.
そうですね。
今の実装ではMODE_AUTOは、数字キーと文字列キーが共存したコレクションを返すフラグとしてしか機能していません。
check_modeで$modeを判定しない実装にした理由は、
- $inputsの各リストをすべて判定する or $inputsを結合してから判定する -> 計算コストがかかる
- 数字キーと文字列キーが共存したコレクションを作りたい場合がある
ため、第3のフラグとして動作させた方が柔軟だと判断したからです。
ただ、他の関数とmodeの扱いの毛色が違うのは確かなので、MODE_AUTOの際は従来通りの判定を行い、数字キーと文字列キーのミックスは別のフラグ変数で処理を分けるなどの手が考えられると思います。
#11
array_mergeのラッパーとしてmergeを実装しました。
array_mergeでは可変長引数として配列を受け取れるように設計されていますが、mergeでは
$modeとの共存のため、配列の配列として渡す方式にしました。$mode === Mode::MODE_AUTOのとき配列、連想配列の区別なく結合し、数字のキーはすべて番号が振りなおされ、文字列のキーは維持された状態でマージ結果を返します。
$mode === Mode::MODE_LISTのとき配列、連想配列は、すべてのキーが数字として振りなおされ、配列としてマージ結果を返します。
$mode === Mode::MODE_ASSOCのとき配列、連想配列は、キーを維持し重複したキーがある場合は上書きされ、連想配列としてマージ結果を返します。