Properties on C++
std::unordered_mapとboost::lexical_castを使用して,JavaのPropertiesのようなクラスを作ってみました.
実装コードはgistに置きました.
機能
JavaのPropertiesはいわゆるmapであり,キーと値の型は文字列(String)です.
整数値や浮動小数点数値をキーで引いたり保存したりする機能があると便利そうだと思ったことと,その値をどのような型で扱うかはクライアントコードが知っているはずなので,型を明示的に指定するgetterを追加しました.
JavaのPropertiesはデフォルト値を設定できるようですが,その機能は実装していません.
実装
型変換機能はboost::lexical_castを使って実装しました.
setterはlexical_castを使い,引数に渡された値を文字列表現に変換して保存します.
getterは,文字列型を返せばよい場合はキーで引いた値をそのまま返し,型が指定されている場合はlexical_castを使って変換を試みます.
返り値の型はboost::optionalであり,変換に成功した場合はその値,失敗した場合はnoneを返します.
本当にやりたかったこと
とあるプロジェクトで,整数値や浮動小数点数値のグローバル変数があちこちにあり,それぞれの変数の依存関係が把握し辛い,という状況が生じました.
そこで,どのようなグローバル変数があり,どこで書き換えられて,どこで参照されているのかを把握したかったので,今回紹介するようなクラスを作りました.
実装コードには実装していないけど,setterとgetterでログを吐かせるつもりでした.
しかし,これは実行時チェックなので,ログを追ったり,問題が生じた時には再現させるという作業が発生し,一般にこれは容易ではないので,問題解決にはなっていない気がします.
…ここで紹介するクラスを使用するより,グローバル変数を減らすためのリファクタリングを素直に試みた方が良いかもしれません.
しかし,そのリファクタリングのノウハウについては詳しくない…どうすればよいだろう?
C++修行は続く…