コントラクトによる設計では、クラス不変条件は、オブジェクトの作成後とルーチンの呼び出し後の2つの場合に満たされる必要があります。ルーチンを呼び出す前に評価を行わなければならない例や条件はありますか?
質問する
156 次
1 に答える
5
機能呼び出しの前に、クラスの不変条件に違反する可能性があります。条件は異なる場合があります。最も明白なもののみを示しています。
エイリアシング。オブジェクトは、クラス不変条件に関与する他のオブジェクトを参照し、その他のオブジェクトはサード パーティによって変更されます。
class SWITCH -- Creation procedure is ommitted for brevity. feature toggle1, toggle2: TOGGLE -- Mutually exclusive toggles. ... invariant toggle1.is_on = not toggle2.is_on end
次のコードは class の不変式に違反しています
SWITCH
:switch.toggle1.turn_on -- Make `switch.toggle1.is_on = True` switch.toggle2.turn_on -- Make `switch.toggle2.is_on = True` switch.operate -- Class invariant is violated before this call
外部状態。オブジェクトは、クラス不変条件で参照され、予期せず変更される可能性がある外部データと結合されています。
class TABLE_CELL feature item: DATA do Result := cache -- Attempt to use cached value. if not attached Result then -- Load data from the database (slow). Result := database.load_item (...) cache := Result end end feature {NONE} -- Storage cache: detachable DATA invariant consistent_cache: -- Cache contains up-to-date value. attached cache as value implies value ~ database.load_item (...) end
データベースがアプリケーションの外部で変更された場合、キャッシュの一貫性が失われる可能性があり、次の機能呼び出しの前にクラス不変違反がトリガーされます。
data := table_cell.item -- Class invariant is violated before this call.
折り返し電話。無効な状態のオブジェクトを別のオブジェクトに渡すことができます。
class HANDLER feature process (s: STRUCTURE) do ... -- Some code that sets `is_valid` to False. s.iterate_over_elements (Current) end process_element (e: ELEMENT) do ... end is_valid: BOOLEAN do ... end invariant is_valid end
クラス
HADNLER
の機能によって実行されるへのコールバックは、 が良好な状態にないため、不変違反を引き起こします。iterate_over_elements
STRUCTURE
handler
handler.process_element (...) -- Class invariant is violated before the call.
すべてのケースがソフトウェアのバグや欠陥によるものであると主張することができますが、これはまさに、機能呼び出しの前に違反が発生した場合を含むケースを検出するクラス不変条件の目的です。
于 2011-06-15T09:19:47.677 に答える