Bilgisayar Biliminde değişmezler neden önemlidir


16

`` Değişmez'i '' tam anlamıyla anlıyorum. Kod yazdığımda da onları tanıyorum. Fakat bu terimin bilgisayar bilimi bağlamındaki önemini anladığımı sanmıyorum.

Ne zaman ünlü programcıların bilgisayar bilimcilerinin dil tasarımıyla ilgili konuşmalarını, beyaz kağıtlarını okuduğumda, 'değişmez' terimi bir jargon olarak ortaya çıkıyor; ve bu benim anlamadığım kısım. Bu konuda bu kadar özel olan ne?


İddiaları çok kullanıyorum ... hata olasılığını azaltmak için doğruluğu garanti etmek için çok fazla değil.
İş

Yanıtlar:


7

Algoritma tekrarlanabilir bir işlemdir. Tekrarlanabilirse, tekrarlamayla değişmeyen niteliklere sahip olmalıdır. Bunlar sizin değişmezleriniz. Değişmezler, algoritmanıza beslenecek olan (potansiyel olarak) değişen verilerle birleştirilir ve / veya bunlarla çalışır.

Bu nedenle, programlamanın tüm amacı neyin değişmediğini tanımlamaktır - bu aslında sizin programınızdır.

Nesneye yönelik programda, her nesnenin tek bir şeyi iyi yapması gerektiği düşüncesi vardır. Bu esasen (sınıf tabanlı OOP için) bir sınıfın, nesnelerinin ihtiyaç duyabileceği değişken veriler için yer tutucular (değişkenler) ile birlikte tek bir algoritma için değişmezleri tanımladığı anlamına gelir. İdeal olarak OO'da, her bir nesnenin çoğunlukla değişmez olması için neyin olabildiğince değiştiğini izole edersiniz.


27

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:

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

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

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


2

Değişmez, bazı işlemler tarafından korunan mantıksal bir özelliktir.

  • Döngüler hakkında akıl yürütmek için değişmezlere ihtiyacınız var. Kaç tane yineleme olacağını (veya bir döngüye ihtiyacınız olmayacağını) önceden bilmediğiniz için, her yineleme değişmezi korumalıdır, böylece sonunda döngü hakkında bazı yararlı özellikler kanıtlayabilirsiniz.

  • Kapsüllenmiş verilerin özellikleri hakkında akıl yürütmek için değişmezlere ihtiyacınız var. Genellikle bir modül veya nesnenin içindeki çeşitli verilerin doğru çalışma için belirli özellikleri karşılaması gerekir (örneğin, bir grubu temsil eden bir liste her zaman sıralanmalıdır). Veriler üzerinde çalışan her işlev veya yöntemin bu özellikleri korumasını istiyorsunuz, bu nedenle bunlar değişmezler.


0

Değişmezliğin önemini bildiklerimden, bir algoritmanın belirli bir işlevi hesapladığını kanıtlamak için yapı taşı olduğu gerçeğinden geliyor. Örneğin, yeni bir sıralama algoritması geliştirdiniz, ancak her giriş veya her doğru çıkışla gerçekten sıralanacağından nasıl emin olabilirsiniz. Bir sonraki adım, algoritmanın akışına karşılık gelen değişmezler oluşturmak ve değişmezleri kullanarak sıralandığını kanıtlamaktır.


0

Bir programlama dilinin tip sistemi bağlamında, değişmez bir tip dönüştürülemez bir tiptir. Örneğin, java'da, bir yöntemi aşırı yüklerken, tüm parametreler değişmezken, dönüş tipi kovaryanttır (aynı veya bir alt tip olabilir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.