https://chromium.googlesource.com/chromium/src/+/master/docs/security/mojo.md
Mojo "スタイル" ガイド
MojoはChromiumの新しいIPCシステムで多くの役に立つ抽象化を提供する。この抽象化によりプロセス間通信のコードが簡単にかけるし、複雑な仕組みも書くことができる。以下はMojoとIPCレビューアの推奨プラクティスである。
質問や、気になったことや提案があれば mojo@chromium.org まで
過去のIPCについては、security tips for IPCを参照
コンテンツ
単純性
簡単なインタフェースを書いてみよう。同期して維持されるプロセス状態を最小化する必要がある。
いい例
interface TeleporterFactory { Create(Location start, Location end) => (Teleporter); }; interface Teleporter { TeleportGoat(Goat) = (); };
悪い例
interface Teleporter { // 悪い点:TeleportGoat()を呼ぶ前に2つのLocation関数をコールする必要があり、 // コメントが必要になる。 // // 加えて、信頼性のないプロセス同士が通信した場合、実装はLocationオブジェクトが // 拘束されていないときの対応を考えないとならない。 SetStart(Location); SetEnd(Location); TeleportGoat(Goat) = (); };
同様に、メソッドにフォーカスしてみよう。オプションの型を利用しすぎないように。
いい例
struct TeleporterStats { AnimalStats animal_stats; FungiStats fungi_stats; GoatStats goat_stats; PlantStats plant_stats; }; interface Teleporter { TeleportAnimal(Animal) => (); TeleportFungi(Fungi) => (); TeleportGoat(Goat) = (); TeleportPlant(Plant) => (); // TeleportStats is only non-null if success is true. GetStats() => (bool success, TeleporterStats?); };
悪い例
interface Teleporter { // 4つのオプション引数の意図が不明:この関数はいくつもの違う方のオブジェクトをテレポートするのか // 1つのnullでない引数をオブジェクトをテレポートするのか不明 Teleport(Animal?, Fungi?, Goat?, Plant?) => (); // successがtrueのとき、すべてのstatsを返すのか?またはteleporterがすでに持っているものだけ // を返すのか?意図が不明。異種の値を1つの構造にラップしたほうが明確になる。 GetStats() => (bool success, AnimalStats?, FungiStats?, PlantStats?, FungiStats?); };
<途中>
Page last modified on July 06, 2018, at 09:39 PM
Powered by
PmWiki