例から始めましょう。
たとえば、export
DBスキーマに大きく依存するというメソッドがあります。また、「大きく依存する」ということは、特定のテーブルに新しい列を追加すると、頻繁に(非常に頻繁に)対応するexport
メソッドが変更されることを知っています(通常、エクスポートデータにも新しいフィールドを追加する必要があります)。
プログラマーは、export
メソッドを変更することを忘れることがよくあります。これを確認する必要があるかどうかは明確ではないからです。私の目標は、プログラマーがメソッドを見るのを忘れたのか、エクスポートデータにフィールドを追加したくないだけなのかを明確に決定するようプログラマーに強制することexport
です。そして、私はこの問題の設計ソリューションを探しています。
私には2つのアイデアがありますが、どちらにも欠点があります。
スマートな「すべてを読む」ラッパー
すべてのデータが明示的に読み取られるようにするスマートラッパーを作成できます。
このようなもの:
def export():
checker = AllReadChecker.new(table_row)
name = checker.get('name')
surname = checker.get('surname')
checker.ignore('age') # explicitly ignore the "age" field
result = [name, surname] # or whatever
checker.check_now() # check all is read
return result
そのため、読み取られなかった別のフィールドが含まれてchecker
いるかどうかをアサートしtable_row
ます。しかし、このことはすべて重そうに見え、(おそらく)パフォーマンスに影響します。
「その方法を確認する」unittest
最後のテーブルスキーマを記憶し、テーブルが変更されるたびに失敗するunittestを作成するだけです。その場合、プログラマーは「export
メソッドをチェックアウトするのを忘れないでください」のようなものを見るでしょう。警告プログラマーを非表示にするには、問題をチェックアウトしexport
、手動で(別の問題です)新しいフィールドを追加してテストを修正します。
私には他にもいくつかのアイデアがありますが、それらは実装するのが面倒で、理解するのが難しすぎます(そして、プロジェクトをパズルにしたくないのです)。
上記の問題は、私が時々遭遇するより広範なクラスの問題の例です。いくつかのコードやインフラストラクチャをバインドしたいので、それらのいずれかを変更すると、すぐにプログラマに別のコードをチェックするよう警告します。通常、一般的なロジックの抽出や信頼性の高い単体テストの作成などの簡単なツールがありますが、より複雑なケースのツールを探しています。
export
現実的に必要なものがすべて揃っているかどうかをチェックするテストを自動生成できますか?
export
スキーマに基づいて生成できますか?