私がcythonで書いているゲームエンジン の一部として、私が直面している課題の1つは、私のCレベルとpythonレベルで機能するエラー処理のための一貫したインターフェイスを作成することですコード。エンジンへの2つのインターフェースを維持することに興味があります。 pythonインタープリターを使用せずに構造体でCレベルで動作するものと、これらの構造体を間接的にラップするpython "cdefクラス"で動作するもの。
pythonエラーオブジェクトを発生させるとGILが呼び出されるため、Cレベルの関数内でエラーコードを使用することに興味があります。これらのエラーコードは、対応するエラーメッセージ文字列にマップされ、GILを自由に使用できるpythonラッパー関数に表示されます。
現時点では、エラーコードをエラー文字列にマッピングする対応するdictと一緒に、単一の大規模な列挙型にエラーコードを格納することを計画しています。これは私に次の質問を投げかけます:
エラーコードは構造体ごとに名前を付ける必要がありますか?たとえば、vector
やslot map
などの一般的なデータ構造を表す複数の構造体があります。これらは動的にサイズ変更されるコンテナーであるため、これらの構造を拡張すると割り当てが失敗する可能性があります。そのような失敗を表すには、ERROR_OUT_OF_MEMORY
などの一般的なエラーコードを使用するか、ERROR_ITEM_VECTOR_OUT_OF_MEMORY
、ERROR_ITEM_SLOT_MAP_OUT_OF_MEMORY
などの構造体固有のコードを使用する方が良いでしょうか?別の例は、個々のグラフィカルシェーダーとシェーダープログラムのコンパイルです。この場合、単一のERROR_COMPILE
コードまたはERROR_SHADER_COMPILE
およびERROR_PROGRAM_COMPILE
コードを使用できます。
エラーコード<->エラーメッセージマッピングはどのように保存する必要がありますか?一方では、一意のコードを一元化された場所にある一意の対応するエラーメッセージにマップするグローバルファイル辞書をヘッダーファイルに含めることができます。または、pythonコードに文字列を直接書き込むこともできます。これにより、柔軟性が向上する場合があります(たとえば、フォーマット文字列を使用して、コンテキスト固有のエラーメッセージを提供します)。
任意の助けいただければ幸いです。
エラーコードに構造体ごとの名前を付ける必要があります
エラーコードの粒度は、システムの既存の要件に適合する必要があります。意味のあるエラーメッセージを表示したり、デバッグに必要な特定の種類の障害を検出したりするために必要なだけ細かくします。
どれだけ細かくそれらが必要かわからない場合はまだを実装するために、最も簡単な方法から始めてください。あなたの例では、これはERROR_OUT_OF_MEMORYで、構造体の間に区切りがないと思います。後でそれが不十分であることが判明し、「メモリ不足」エラーをより細かく分類する必要があるという要件が発生した場合は、すぐにリファクタリングしてください。 「構造体」ではなく、完全に異なる分類が必要であることがわかっても、私は驚かないでしょう。そのため、実際の要件について誤った推測で前もって分類すると、逆効果になります。
一般原則として、実際の要件があり、その結果を予測できる時点まで設計決定を延期するようにしてください。
エラーコード<->エラーメッセージマッピングはどのように保存する必要がありますか?
ここでも同じ原則が当てはまります。私は、グローバルディクショナリが最も単純な実装方法であり、今のところ十分ですか?それから始めます。後で判明した場合は、より柔軟なリファクタリングが必要です。この場合でも、すべてのケースの90%でディクショナリを使用できます。残りのケースでは、特別なパラメーター形式でハードコードされた文字列を使用できます。これらのアプローチは相互に排他的ではありません。
ゲームエンジンが「薄い空気」にのみ存在し、実際のアプリケーションがそれを使用していない段階で現在作業しているという問題があるかもしれません。したがって、不足している要件の問題に直面します。この問題に対処する唯一の賢明な方法は、ゲームエンジンを使用して「テストケース」を1つ以上のゲームの形で設計することです。これは、エンジンのユーザーの視点を提供し、本当に必要なものを見つけるのに役立ちます。