Saya membaca Coders at Work , dan di dalamnya ada banyak pembicaraan tentang invarian. Sejauh yang saya mengerti, invarian adalah suatu kondisi yang berlaku sebelum dan sesudah ekspresi. Mereka, antara lain, berguna dalam membuktikan bahwa loop itu benar, jika saya ingat kursus Logika saya dengan benar.
Apakah uraian saya benar, atau apakah saya melewatkan sesuatu? Apakah Anda pernah menggunakannya dalam program Anda? Dan jika demikian, apa manfaatnya bagi mereka?
invariants
Gablin
sumber
sumber
Jawaban:
Dalam OOP, invarian adalah sekumpulan pernyataan yang harus selalu berlaku selama masa objek agar program valid. Itu harus benar dari ujung konstruktor ke awal destruktor setiap kali objek saat ini tidak menjalankan metode yang mengubah keadaannya.
Contoh invarian adalah bahwa salah satu dari dua variabel anggota harus nol. Atau bahwa jika seseorang memiliki nilai yang diberikan, maka himpunan nilai yang diizinkan untuk yang lain adalah ini atau itu ...
Saya kadang-kadang menggunakan fungsi anggota objek untuk memeriksa bahwa invarian memegang. Jika bukan ini masalahnya, sebuah penegasan diajukan. Dan metode ini disebut pada awal dan keluar dari setiap metode yang mengubah objek (dalam C ++, ini hanya satu baris ...)
sumber
Ya, hal-hal yang saya lihat di utas ini semuanya hebat, tetapi saya memiliki definisi tentang 'invarian' yang telah sangat membantu saya di tempat kerja.
Definisi ini bermanfaat karena memecah kondisi menjadi dua kelompok: mereka yang dapat dipercayai oleh pembuat kompiler, dan mereka yang harus didokumentasikan, dibahas, dikomentari, atau dikomunikasikan kepada kontributor agar mereka dapat berinteraksi dengan basis kode tanpa memperkenalkan bug .
Juga, definisi ini sangat membantu karena memungkinkan Anda untuk menggunakan generalisasi, "Invarian buruk".
Sebagai contoh, shifter dalam mobil transmisi manual direkayasa untuk menghindari invarian. Jika saya mau, saya bisa membuat transmisi dengan satu tuas untuk setiap gigi. Tuas ini bisa maju ("bertunangan") atau kembali ("terlepas"). Dalam sistem seperti itu, saya telah membuat "invarian", yang mungkin didokumentasikan seperti itu:
Jadi, orang mungkin menyalahkan transmisi yang rusak pada mengemudi yang ceroboh. Mobil modern, bagaimanapun, menggunakan tongkat tunggal yang berputar di sekitar gigi. Ini dirancang sedemikian rupa sehingga, pada mobil stick-shift modern, tidak mungkin untuk menggunakan dua roda gigi secara bersamaan.
Dengan cara ini, kita dapat mengatakan bahwa transmisi telah direkayasa untuk 'menghapus invarian', karena tidak mengizinkan dirinya untuk dikonfigurasikan secara mekanis dengan cara yang melanggar aturan logis.
Setiap invarian semacam ini yang Anda hapus dari kode Anda merupakan peningkatan, karena ini menurunkan beban kognitif untuk bekerja dengannya.
sumber
Invarian (dalam akal sehat) berarti beberapa kondisi yang harus benar pada titik waktu tertentu atau bahkan selalu ketika program Anda dieksekusi. misalnya PreConditions dan PostConditions dapat digunakan untuk menyatakan beberapa kondisi yang harus benar ketika suatu fungsi dipanggil dan ketika ia kembali. Invarian objek dapat digunakan untuk menyatakan bahwa suatu objek harus memiliki status valid sepanjang waktu objek itu ada. Ini adalah desain berdasarkan prinsip kontrak.
Saya telah menggunakan invarian secara informal menggunakan cek dalam kode. Tetapi baru-baru ini saya bermain dengan perpustakaan kontrak kode untuk. Net yang secara langsung mendukung invarian.
sumber
Berdasarkan kutipan berikut dari Coders At Work ...
... Saya kira "invarian" = "kondisi yang ingin Anda pertahankan untuk memastikan efek yang diinginkan".
Tampaknya invarian memiliki dua pengertian yang berbeda secara halus:
Jadi aku seperti sebuah pernyataan; 2 seperti alat untuk membuktikan kebenaran, kinerja, atau properti lainnya - saya pikir. Lihat artikel Wikipedia untuk contoh 2 (membuktikan kebenaran solusi untuk teka-teki MU).
Sebenarnya indra ke-3 yang invarian adalah:
.3. Apa yang seharusnya dilakukan oleh program (atau modul atau fungsi); dengan kata lain, tujuannya.
Dari wawancara Coders At Work yang sama:
sumber
Invarian adalah seperti aturan atau asumsi yang dapat digunakan untuk mendikte logika program Anda.
Misalnya, Anda memiliki beberapa aplikasi perangkat lunak yang melacak akun pengguna. Anggap juga bahwa pengguna dapat memiliki beberapa akun, tetapi untuk alasan apa pun Anda perlu membedakan antara akun utama pengguna dan akun "alias".
Ini bisa menjadi catatan DB atau sesuatu yang lain, tetapi untuk sekarang mari kita asumsikan setiap akun pengguna diwakili oleh objek kelas.
class userAccount {private char * pUserName; karakter pribadi * pParentAccountUserName;
...}
Invarian mungkin adalah asumsi bahwa jika pParentAccountUserName adalah NULL atau kosong maka objek ini adalah akun induk. Anda dapat menggunakan invarian ini untuk membedakan berbagai jenis akun. Mungkin ada metode yang lebih baik untuk membedakan berbagai jenis akun pengguna, jadi perlu diingat ini hanyalah contoh untuk menunjukkan bagaimana invarian dapat digunakan.
sumber
Berasal dari latar belakang fisika, dalam fisika kita memiliki invarian, yang pada dasarnya jumlah yang tidak bervariasi di seluruh perhitungan / simulasi. Misalnya, dalam fisika, untuk sistem tertutup, total energi dilestarikan. Atau lagi dalam fisika, jika dua partikel bertabrakan, fragmen yang dihasilkan harus mengandung persis energi yang mereka mulai, dan momentum yang persis sama (kuantitas vektor). Biasanya tidak ada cukup banyak invarian untuk secara spesifik menentukan hasilnya. Misalnya dalam tabrakan 2 partikel, kami memiliki empat invarian, tiga komponen momentum, dan komponen energi, tetapi sistem memiliki enam derajat kebebasan (enam angka untuk menggambarkan keadaannya). Para invarian harus dilestarikan dalam kesalahan pembulatan, tetapi konservasi mereka tidak membuktikan solusinya benar.
Jadi biasanya, hal-hal ini penting sebagai pemeriksaan kewarasan, tetapi dengan sendirinya mereka tidak dapat membuktikan kebenaran.
sumber