Gagasan invarian sangat terkait dengan 'efek samping'. Saya percaya ini dipromosikan oleh pendekatan Bertrand Meyer 'Desain oleh Kontrak (DbC)' untuk desain perangkat lunak.
DbC memperkaya Jenis Data Abstrak (tulang punggung kelas) dengan 3 gagasan penting, prasyarat, postkondisi, invarian . Itu mudah dijelaskan ketika merujuk ke prosedur, jadi saya akan mencoba menjelaskan sehubungan dengan itu:
Sebuah prasyarat mewakili data kondisi masukan untuk prosedur harus menghormati untuk memanggil prosedur itu. Prasyarat ini harus dihormati dan ditegakkan oleh klien dari prosedur khusus itu. Namun perancang prosedur mungkin membela dari klien yang tidak menghormati prasyarat dengan menyatakan kondisi itu sebagai baris pertama dalam prosedur. Misalnya memiliki metode double divide(double dividend, double divisor)
prasyarat mungkin divisor != 0
.
Sebuah postcondition mewakili kondisi pada data keluaran setelah kembali prosedur; sepenuhnya merupakan tugas perancang prosedur untuk menghormati kondisi akhir ini asalkan prasyarat tersebut dihormati; dalam gaya pemrograman pertahanan sebelum kembali, kondisi akhir dapat ditegaskan.
Sebuah invarian dapat dianggap sebagai baik prakondisi dan postcondition, tapi dengan pemahaman yang berbeda untuk prakondisi dan postcondition dari konsep di atas. Seorang invarian pada dasarnya mengatakan bahwa jika input memiliki kondisi tertentu terpenuhi sebelum prosedur dipanggil, maka kondisi tertentu tersebut valid setelah prosedur dipanggil. Misalnya invarian yang valid untuk suatu prosedur boolean search(int term, int array[])
mungkin mengatakan bahwa keadaan array
sebelum panggilan sama dengan setelah panggilan.
Menegakkan invarian pada prosedur (dan bukan hanya prosedur) adalah hal yang hebat karena mengurangi efek samping ; ini berguna karena efek samping adalah kejahatan besar dalam pemrograman. Prosedur tertentu dapat mengubah keadaan argumen input, atau mengubah keadaan beberapa variabel global, atau bergantung pada beberapa variabel global; ini dapat menyebabkan situasi yang tidak menyenangkan di mana dua panggilan identik pada prosedur yang sama (dengan input yang sama) dapat menghasilkan output yang berbeda. Ini mengarah pada mengetahui sejarah panggilan dan sangat sulit untuk di-debug terutama dalam konteks multithreading.