小さなモジュールにunsafeを封じ込める
説明
unsafeなコードがある場合は、必要な不変条件を維持できる最小限のモジュールを作成し、unsafeの上に最小限の安全なインターフェースを構築します。これをより大きなモジュールに埋め込み、そのモジュールは安全なコードのみを含み、使いやすいインターフェースを提供します。なお、外側のモジュールはunsafeなコードを直接呼び出すunsafe関数やメソッドを含むことができます。ユーザーはこれを使用して速度上の利点を得ることができます。
利点
- 監査が必要なunsafeなコードを制限できる
- 内側のモジュールの保証に依存できるため、外側のモジュールの記述がはるかに簡単になる
欠点
- 適切なインターフェースを見つけるのが難しい場合がある
- 抽象化により非効率性が生じる可能性がある
例
toolshedcrateは、unsafeな操作をサブモジュールに含め、ユーザーに安全なインターフェースを提供しているstdのStringクラスは、内容が有効なUTF-8でなければならないという不変条件を追加したVec<u8>のラッパーである。Stringの操作はこの動作を保証する。ただし、ユーザーはunsafeメソッドを使用してStringを作成するオプションがあり、その場合は内容の妥当性を保証する責任がユーザーにある