ソフトウェア設計をしていたら仕様の違和感に気が付いた話
違和感のある仕様 違和感のある仕様通りに実装した場合 現時点の動作が同じなら、前者でも後者でもいいのではないか? 解決策 まとめ ソフトウェア設計をしていたら、仕様の違和感に気が付いて、仕様を変更した話を書きたいと思います。 違和感のある仕様 ある画面 C は、画面 A と画面 B という二つの画面から遷移可能な画面でした。 画面 C には、戻るボタンがありました。 戻るボタンをタップすると、 「画面 A から遷移した場合は A に戻り、画面 B から遷移した場合は B に戻る」 という仕様でした。 この、何の変哲もない普通の仕様に、実は違和感が潜んでいました。 【補足】 今回の話は、非常に些細な点をとりあげます。 そのため、この話で出てくる例自体は、実際にはほぼ無害です。 しかし、簡単な例だからこそ、 どのようにソフトウェアが壊れていくのかを 誰が読んでもわかる例になっています。 それを知るきっかけとなるように、この記事を残します。 違和感のある仕様通りに実装した場合 Android で画面遷移を実装する場合は、 Navigation Component というライブラリを使用することが一般的です。 Navigation には、 一つ前の画面に戻る 場合には、 NavController.navigateUp() という関数が使えます。 一方で、 指定した画面まで戻る 場合には、 NavController.popBackStack(route = /* 戻りたい画面 */, inclusive = false) という関数が使えます。 仕様では、「画面 A から遷移した場合は A に戻り…」とあるので、後者の関数を使って実装します。 前者の関数を使用して実装しても、現時点では同じ動作になりますが、将来的には同じとは限りません。 例えば、 A -> D -> C という画面遷移になった場合には、 ...