1

現在、次のクラス メソッドがあります。

def check_capacity(self, at_index)
def update_capacity(self, at_index)

前者はブール値を返し、後者はインスタンス変数を変更します。問題は、両方の方法が非常に似ていることです。DRYに違反しているように感じますか?

私は1つの方法が欲しいです:

def update_capacity(self, at_index)

私は次のように使用できます:

if update_capacity(at_index):

副作用が望ましい場合は意図した副作用を作成し、そうでない場合は False を返します。

私の試みは、インスタンス変数をコピーし、コピーが望ましく変更されたかどうかを確認し、正しい場合はインスタンス変数をコピーに設定してTrueを返すか、そうでない場合は設定せずにFalseを返すことでした。ただし、これは変更可能なデータ構造 (リストなど) では機能しません!

「ディープコピー」でこれを行う必要がありますか?または、これを行うためのより良い方法はありますか? できるだけPythonicになりたいです。

編集

check_capacityインスタンス変数を反復処理し、変更を加えると条件に違反するかどうかをチェックします。

update_capacityインスタンス変数を反復処理し、条件に違反しないことを認識して変更を行います。

どちらも非常によく似たコードを持っています。

4

2 に答える 2

3

これらの 2 つの関数が一緒になって、頭に正確にぶつかることなく問題をまたぐことができるという予感があります。私がこの権利を持っている場合は、update_capacity何かを変更するか、変更が望ましくない場合は返品してFalseください.

check_capacityからのチェックメカニズムを追加しupdate_capacity、の本体を実行する前に条件チェックを実行することで、この機能を実現できるように思えますupdate_capacity

def update_capacity(self, at_index):
    if <condition from check_capacity>:
        <body of update_capacity>
    else:
        return False

もちろん、このコードはNone条件が true の場合に返されるため、関数のシグネチャを整頓したい場合Trueは、コードの残りの部分に何が適合するかに応じて、または何かを返すことができます。

于 2012-05-03T18:38:15.813 に答える
0

check_capacity複数の場所に適用される場合は、制約/チェックが満たされない場合に例外をスローすることを確認するデコレーターにします。

お気に入り

@check_capacity
def update_capacity(...)
    # Does the job and does not return anything

が他の場所で使用されていない場合check_capacityは、ロジックを の中に入れて update_capacityください。

編集:これも

update_capacity (at_index) の場合:

せいぜいあいまいです。関数は更新できるかどうかを確認しますか? 実際に何かを更新/変更する予定はありますか?

これらの 2 つの機能を分離する必要があることは明らかです。

于 2012-05-03T22:24:00.777 に答える