この記事は2018年08月04日に投稿しました。
目次
- 作者: オフィス加減
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2012/07/26
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 2回
- この商品を含むブログ (1件) を見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIの話です。
設定値が"キー,値"の形式で定義され、その設定値の定義が複数行ある設定ファイルが、3種類ありました。
そしてその設定値を保持する構造体も3つ用意されており、それぞれの設定ファイルのキーに対する構造体のメンバに値を設定していました。
プログラムでは、それぞれ処理メソッドが用意され、以下の処理を行っていました。 処理項目を見るとわかるのですが、"3の処理"以外の処理は同じ処理を行っていました。
- ファイルをオープンする。
- ファイルデータを1行読み込み込む。
- 読み込んだ1行データをパースし、キー項目に対する構造体メンバーに値を設定する。
- ファイルをクローズする。
そのため"3の処理"を外だしできれば、処理を共通化できるのではないかと考えました。
検討した結果、delegateを使って処理を共通化しました。
2. 処理の共通化
まず個別のパース処理になる部分のdelegateを定義します。
実際の処理部分のコードは省略します。
delegate bool ParseLineDelegate(String^ line);
つぎにそれぞれのパース処理を実装します。
// 設定ファイルAの項目を構造体Aに設定します。 bool ParseLineA(String^ line) { // 引数lineが正常なデータならばtrueを返却し、不正なデータの場合falseを返却します。 // 引数lineが正常なデータの場合、キーに対する構造体メンバーに値を設定します。 } // 設定ファイルBの項目を構造体Bに設定します。 bool ParseLineB(String^ line) { // 引数lineが正常なデータならばtrueを返却し、不正なデータの場合falseを返却します。 // 引数lineが正常なデータの場合、キーに対する構造体メンバーに値を設定します。 } // 設定ファイルCの項目を構造体Cに設定します。 bool ParseLineC(String^ line) { // 引数lineが正常なデータならばtrueを返却し、不正なデータの場合falseを返却します。 // 引数lineが正常なデータの場合、キーに対する構造体メンバーに値を設定します。 }
設定ファイルを読み込む処理を実装します。 引数で渡されたデリゲートでパース処理を行います。
/// ファイルを読み込み、1行データをそれぞれのパース処理で処理します。 bool ReadFile(String^ fileName, ParseLineDelegate^ ParseLine) { StreamReader^ sr = nullptr; try { // ストリームリーダーを生成します。 sr = gcnew StreamReader(fileName); // 1行データがなくなるまで繰り返します。 String^ line = nullptr; while ((line = sr->ReadLine()) != nullptr) { // パース処理を呼び出します。 if (!ParseLine(line)) { // エラーの場合、エラー終了します。 return false; } } // すべてパースできた場合、正常終了します。 return true; } catch (Exception^) { // 例外が発生した場合、エラー終了します。 return false; } finally { // ファイルを閉じます。 if (sr != nullptr) { sr->Close(); }a } }
設定ファイル読み込み処理を呼び出す側の処理です。
サンプルでは、ReadFileメソッドの戻り値は無視しています。
必要に応じてエラー処理を行ってください。
// 設定ファイルを読み込む処理 void ReadSettingFile() { ReadFile("fileNameA", gcnew ParseLineDelegate(this, &ParseLineA); ReadFile("fileNameB", gcnew ParseLineDelegate(this, &ParseLineB); ReadFile("fileNameC", gcnew ParseLineDelegate(this, &ParseLineC); }
3. おわりに
最初は関数ポインタを使ってパース処理を呼び出そうとしましたが、関数ポインタはマネージドコードでは使えないようでした。
そのため別の方法を探したところ、delegateでできることがわかりました。
処理が共通化できて、コードがすっきりしました。
お仕事決まれば全額キャッシュバック!転職特化型Ruby実践研修【ポテパンキャンプ】
- 作者: 中博俊
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/06/30
- メディア: 単行本
- 購入: 2人 クリック: 80回
- この商品を含むブログ (26件) を見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688