it-swarm-id.com

Apa yang invarian, bagaimana mereka digunakan, dan apakah Anda pernah menggunakannya dalam program Anda?

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 deskripsi saya benar, atau apakah saya melewatkan sesuatu? Apakah Anda pernah menggunakannya dalam program Anda? Dan jika demikian, apa manfaatnya bagi mereka?

54
gablin

Dalam OOP, invarian adalah seperangkat 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 ...)

47
Xavier Nodet

Ya, hal-hal yang saya lihat di utas ini semuanya hebat, tetapi saya memiliki definisi 'invarian' yang telah sangat membantu saya di tempat kerja.

Invarian adalah aturan logis apa pun yang harus dipatuhi selama pelaksanaan program Anda yang dapat dikomunikasikan kepada manusia, tetapi tidak untuk kompiler Anda.

Definisi ini bermanfaat karena meringkas kondisi menjadi dua kelompok: mereka yang dapat dipercayai oleh pembuat kompiler, dan mereka yang harus didokumentasikan, didiskusikan, dikomentari, atau dikomunikasikan kepada kontributor agar mereka dapat berinteraksi dengan basis kode tanpa memperkenalkan bug .

Juga, definisi ini bermanfaat 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:

"Sangat penting bahwa gigi yang saat ini sedang digunakan dilepaskan sebelum gigi yang berbeda digunakan. Untuk menggunakan dua gigi pada saat yang sama akan menyebabkan tekanan mekanis yang akan merobek transmisi. Selalu melepaskan gigi yang saat ini sedang terlibat sebelum menggunakan yang lain."

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.

15
Daniel Burbank

Berdasarkan kutipan berikut dari Coders At Work ...

Tetapi begitu Anda mengetahui invarian yang dipertahankannya, Anda dapat melihat, ah, jika kami mempertahankan invarian itu, maka kami akan mendapatkan waktu pencarian log.

... Saya kira "invarian" = "kondisi yang ingin Anda pertahankan untuk memastikan efek yang diinginkan".

Tampaknya invarian memiliki dua indera yang berbeda secara halus:

  1. Sesuatu yang tetap sama.
  2. Sesuatu yang Anda coba pertahankan, untuk mencapai tujuan X (seperti "waktu pencarian log" di atas).

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 rasa ke-3 dari invarian adalah:

.3. Apa yang seharusnya dilakukan oleh program (atau modul atau fungsi); dengan kata lain, tujuannya.

Dari wawancara Coders At Work yang sama:

Tetapi apa yang membuat perangkat lunak besar dapat dikelola adalah memiliki beberapa invarian global atau pernyataan gambaran besar tentang apa yang seharusnya dilakukan dan hal-hal apa yang seharusnya benar.

3
Jonathan Aquino

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 kode cek. Tetapi baru-baru ini saya bermain dengan kode kontrak library untuk .Net yang secara langsung mendukung invarian.

3
softveda

Invarian 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.

1
Pemdas

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 invarian untuk menentukan hasil secara total. 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.

1
Omega Centauri