Değişmez kavramı 'yan etkilerle güçlü bir şekilde bağlantılıdır. Bertrand Meyer'ın yazılım tasarımı için 'Sözleşme ile Tasarım (DbC)' yaklaşımı ile desteklendiğine inanıyorum.
DbC Soyut Veri Tiplerini (sınıfların omurgası) 3 önemli kavram, önkoşul, sonşart, değişmez ile zenginleştirir . Prosedürlere atıfta bulunurken kolayca açıklanabilir, bu yüzden ona referansla açıklamaya çalışacağım:
Bir önkoşul , bir prosedürü çağırmak için bir prosedürün uyması gereken koşul giriş verilerini temsil eder. Bu ön koşula, ilgili prosedürün müşterisi tarafından saygı duyulmalı ve uygulanmalıdır. Ancak yordam tasarımcısı, bu koşulu yordamın ilk satırları olarak belirterek ön koşula uymayan istemcilerden savunma yapabilir. Örneğin bir yönteme sahip double divide(double dividend, double divisor)
olmak bir önkoşul olabilir divisor != 0
.
Bir son koşul, yordam döndükten sonra çıktı verilerindeki bir koşulu temsil eder; ön koşula uyulması şartıyla, bu son koşula uymak tamamen prosedür tasarımcının görevidir; dönmeden önce savunma programlama tarzında, son koşul iddia edilebilir.
Bir değişmez , hem ön koşul hem de son koşul olarak kabul edilebilir, ancak yukarıdaki kavramlardan ön koşul ve son koşul için farklı anlayışa sahip olabilir. Bir değişmez temelde girişin yordam çağrılmadan önce belirli bir koşula sahip olması durumunda, yordam çağrıldıktan sonra söz konusu koşulun geçerli olduğunu belirtir. Örneğin, bir prosedür için geçerli bir değişmez çağrıdan önceki durumun çağrıdan boolean search(int term, int array[])
sonraki durumla aynı olduğunu söyleyebilir array
.
Değişmezleri prosedürler üzerinde uygulamak (ve sadece prosedürler değil), yan etkileri azalttığı için harika bir şeydir ; yan etkiler programlamada büyük bir kötülük olduğu için bu yararlıdır. Belirli bir yordam, girdi bağımsız değişkenlerinin durumunu değiştirebilir veya bazı genel değişkenlerin durumunu değiştirebilir veya bazı genel değişkenlere bağlı olabilir; bu, aynı prosedürde (aynı girişle) iki özdeş aramanın farklı çıkışlar verebileceği kötü durumlara yol açabilir. Bu, çağrıların geçmişini bilmeye neden olur ve özellikle çok iş parçacıklı bir bağlamda hata ayıklamak çok zordur.