【マンガ】 Theolizer®(セオライザ)のススメ
プログラム開発、いつも納期に追われてたいへんですね。そんな貴方に、データ保存やデータ通信プログラムの詳細設計と開発を簡単化できるC++(C)言語用の開発ツールTheolizer®(セオライザ) を漫画でご紹介します。お楽しみ下さい。
登場人物紹介

株式会社ライジェック システム開発部 社員。
入社2年目の新米プログラマー。先輩社員でカリスマプログラマーの大石純子に憧れ入社。
熱血タイプで責任感が強いが、まっすぐすぎる性格のため少々不器用な面も。

株式会社ライジェック システム開発部 部長。
入社10年目。カリスマプログラマーとして部署内では絶大な信頼を集めている。
容姿端麗で頭脳明晰、スポーツも万能。無類の酒好き。
例えば、ソース1のPersonクラスを保存する時、中沢くんはソース2のようなコードを書いていたようです。
この程度のクラスでも そこそこ手間がかかります。一般的なプロジェクトでは もっと規模が大きく複雑なデータを保存しますので、中沢くんのような悲しい事態に陥ってしまうことも少なくありません。
#ifndef CLASS_H | |
#define CLASS_H | |
#include <string> | |
using namespace std; | |
struct Name // 名前 | |
{ | |
string first; // 名 | |
string last; // 姓 | |
}; | |
struct Address | |
{ | |
string city; // 市 | |
string state; // 州 | |
string postcode; // 郵便番号 | |
string country; // 国 | |
}; | |
struct Employer // 勤め先 | |
{ | |
string company_name; // 会社名 | |
Address address; // 会社住所 | |
string phone; // 電話番号 | |
string fax; // FAX番号 | |
}; | |
struct Emergency // 緊急連絡先 | |
{ | |
Name name; // 名前 | |
Address address; // 会社住所 | |
string phone; // 電話番号 | |
string email; // メール | |
string relationship; // 本人との関連 | |
}; | |
struct Person | |
{ | |
Name name; // 名前 | |
unsigned age; // 年齢 | |
Address address; // 住所 | |
string phone; // 電話番号 | |
string mobile_phone; // 携帯番号 | |
string fax; // FAX番号 | |
string email; // メール | |
Employer employer; // 勤め先 | |
Emergency emergency; // 緊急連絡先 | |
}; | |
#endif |
#include <fstream> | |
#include <iostream> | |
#include <vector> | |
#include "class.h" | |
void initialize(vector<Person>& oList); | |
void output_address(ofstream& ofs, unsigned indent, Address const& address) | |
{ | |
string space(indent, ' '); | |
ofs << space << "Address\n"; | |
ofs << space << " City:" << address.city << "\n"; | |
ofs << space << " State:" << address.state << "\n"; | |
ofs << space << " Postcode:" << address.postcode << "\n"; | |
ofs << space << " Country:" << address.country << "\n"; | |
} | |
int main() | |
{ | |
vector<Person> list; | |
initialize(list); | |
// 保存処理 | |
{ | |
ofstream ofs("data.txt"); | |
for (size_t i=0; i < list.size(); ++i) | |
{ | |
ofs << "Number:" << i << "\n"; | |
ofs << " First Name:" << list[i].name.first << "\n"; | |
ofs << " Last Name:" << list[i].name.last << "\n"; | |
ofs << " Age:" << list[i].age << "\n"; | |
output_address(ofs, 2, list[i].address); | |
ofs << " Phone:" << list[i].phone << "\n"; | |
ofs << " Mobile Phone:" << list[i].mobile_phone << "\n"; | |
ofs << " Fax:" << list[i].fax << "\n"; | |
ofs << " E-mail:" << list[i].email << "\n"; | |
ofs << " Employer\n"; | |
ofs << " Company name:" << list[i].employer.company_name << "\n"; | |
output_address(ofs, 4, list[i].employer.address); | |
ofs << " Phone:" << list[i].employer.phone << "\n"; | |
ofs << " FAX:" << list[i].employer.fax << "\n"; | |
ofs << " Emergency contact\n"; | |
ofs << " First Name:" << list[i].emergency.name.first << "\n"; | |
ofs << " Last Name:" << list[i].emergency.name.last << "\n"; | |
output_address(ofs, 4, list[i].emergency.address); | |
ofs << " Phone:" << list[i].emergency.phone << "\n"; | |
ofs << " E-mail:" << list[i].emergency.email << "\n"; | |
ofs << " Relationship:" << list[i].emergency.relationship << "\n"; | |
ofs << "\n"; | |
} | |
} | |
return 0; | |
} |
しかし、Theolizer®(セオライザ)を使えば、大石先輩がやったように素早くプログラムを開発できます。
この例ならばソース3のようなコードになります。保存処理はTHEOLIZER_PROCESS(js, list);です。たった1行でJsonファイルへ保存できました。
#include <fstream> | |
#include <iostream> | |
//#include <vector> | |
// Theolizer | |
#include <theolizer/vector.h> | |
#include <theolizer/serializer_json.h> | |
// my classes | |
#include "class.h" | |
// Theolizer自動生成先 | |
#include "main.cpp.theolizer.hpp" | |
void initialize(vector<Person>& oList); | |
int main() | |
{ | |
vector<Person> list; | |
initialize(list); | |
// 保存処理 | |
{ | |
std::ofstream wStream("test.json"); | |
theolizer::JsonOSerializer<> js(wStream); | |
THEOLIZER_PROCESS(js, list); | |
} | |
return 0; | |
} |
{ | |
"SerialzierName":"JsonTheolizer", | |
"GlobalVersionNo":1, | |
"TypeInfoList":[1] | |
} | |
[ | |
2, | |
{ | |
"name":{ | |
"first":"太郎", | |
"last":"山田" | |
}, | |
"age":50, | |
"address":{ | |
"city":"福岡市", | |
"state":"福岡県", | |
"postcode":"810-9999", | |
"country":"日本" | |
}, | |
"phone":"092-123-9999", | |
"mobile_phone":"090-1234-9999", | |
"fax":"", | |
"email":"t_yamada@happy.yy", | |
"employer":{ | |
"company_name":"セオライド テクノロジー", | |
"address":{ | |
"city":"飯塚市", | |
"state":"福岡県", | |
"postcode":"820-9999", | |
"country":"日本" | |
}, | |
"phone":"0948-12-9999", | |
"fax":"0948-34-9999" | |
}, | |
"emergency":{ | |
"name":{ | |
"first":"花子", | |
"last":"山田" | |
}, | |
"address":{ | |
"city":"福岡市", | |
"state":"福岡県", | |
"postcode":"810-9999", | |
"country":"日本" | |
}, | |
"phone":"092-123-9999", | |
"email":"h_yamada@happy.yy", | |
"relationship":"配偶者" | |
} | |
}, | |
{ | |
"name":{ | |
"first":"あおい", | |
"last":"山田" | |
}, | |
"age":17, | |
"address":{ | |
"city":"福岡市", | |
"state":"福岡県", | |
"postcode":"810-9999", | |
"country":"日本" | |
}, | |
"phone":"092-456-9999", | |
"mobile_phone":"090-5678-9999", | |
"fax":"", | |
"email":"aoi_yamada@doco.xx", | |
"employer":{ | |
"company_name":"ロイヤル", | |
"address":{ | |
"city":"江別", | |
"state":"北海道", | |
"postcode":"060-9999", | |
"country":"日本" | |
}, | |
"phone":"011-12-9999", | |
"fax":"011-34-9999" | |
}, | |
"emergency":{ | |
"name":{ | |
"first":"桐夫", | |
"last":"山田" | |
}, | |
"address":{ | |
"city":"福岡市", | |
"state":"福岡県", | |
"postcode":"810-9999", | |
"country":"日本" | |
}, | |
"phone":"092-456-9999", | |
"email":"kirio_yamada@doco.xx", | |
"relationship":"兄" | |
} | |
} | |
] |
さて、漫画の中で中沢くんが言ってましたが、従来のシリアライザを使っても上記のように保存/回復でき、たいへん便利です。しかし、何故かあまり使われていません。実際のプロジェクトで使おうとすると深刻な問題があることに気づきます。大規模なデータ構造には使いづらいのです。
しかし、この問題を解決するC++用の次世代シリアライザ Theolizer®(セオライザ)が完成し正式リリースしました。
ちょっと想像してみてください。クラスにメンバ変数を追加した時、保存/回復・送受信のコードを修正する必要がないのです。追加したメンバは自動的に処理されます。しかも、規模が大きなデータ構造の時も使いやすいのです。
更に嬉しいことにC言語的な構造体ならばC言語+αの知識で十分に使えます。
私は、Theolizer®を使ってみてその手軽さに驚いています。きっとあなたも私のように「えっ? これで終わり?」と感じると思います。そして、Theolizer®を使えばプロジェクトは余裕を持って締め切りに間に合うようになるでしょう。
GitHubにて公開中
どなたでもTheolizer®をお試し頂けますので、C++のデータ保存/通信プログラムの開発ツールに興味がある方は是非使ってみて下さい。
GitHubのアカウントをお持ち出ない方は、「Clone or download」を押して「Download ZIP」にてZIPファイル形式でダウンロードできます。