私は現在、会計に関連する DSL に取り組んでいます。私ができるようにしたいのは:
accountant do
credit @account_1, -@amount
debit @account_2, @amount
end
現在、これは次のメソッドを実行します。
class Accountant
def accountant &block
AccountantHelper.class_eval(&block)
end
end
...次に AccountantHelper クラスのブロックを実行し、それぞれ「credit」メソッドと「debit」メソッドを呼び出します。
class AccountantHelper
def self.credit account, amount
account.credit amount
end
def self.debit account, amount
account.debit amount
end
end
(class_eval() の使用についてはご遠慮ください -- 結局、これはプロトタイプにすぎません!)
目標は、ブロックがトランザクションとして機能することであり、ブロック全体が正常に実行されない場合は、いずれも正常に実行されないようにすることです。ただし、これに加えて、ブロックに渡されたデータの整合性も検証する必要があります。この場合、ブロック内に「貸方」と「借方」の両方の方法があることを確認する必要があります (複式簿記では、すべての貸方に対して少なくとも 1 つの借方が必要であり、その逆も同様です)。現在、私は呼び出すことができます:
accountant do
credit @account_1, @amount
end
...そして、コードはエラーなしで実行されます。アカウントの残高を維持するための対応する「借方」がないため、これは悪いことです。
ブロックに渡されるものを確認することは可能ですか? それとも、ここで間違った道を進んでいますか?