SecurityMojo

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