it-swarm.dev

Değişmezler nelerdir, nasıl kullanılabilirler ve bunu programınızda hiç kullandınız mı?

Ben okuyorum İşyerinde Kodlayıcılar ve içinde değişmezler hakkında çok fazla konuşma var. Anladığım kadarıyla, değişmez, bir ifadeden önce ve sonra geçerli olan bir durumdur. Diğer şeylerin yanı sıra, Mantık kursumu doğru bir şekilde hatırlarsam, bu döngünün doğru olduğunu kanıtlamakta faydalıdırlar.

Açıklamam doğru mu yoksa bir şey mi kaçırdım? Bunları hiç programınızda kullandınız mı? Ve eğer öyleyse, nasıl faydalandılar?

54
gablin

OOP'de değişmez, programın geçerli olması için bir nesnenin ömrü boyunca her zaman doğru olması gereken bir dizi iddiadır. Nesne şu anda durumunu değiştiren bir yöntem yürütmediğinde yapıcı sonundan yıkıcı başlangıcına kadar doğru olmalıdır.

Değişmez bir örnek, iki üye değişkenten tam olarak birinin boş olması olabilir. Veya birinin belirli bir değeri varsa, o zaman diğeri için izin verilen değerler kümesi şu veya budur ...

Bazen değişmez tutar tutmak için nesnenin bir üye işlevini kullanın. Eğer durum böyle değilse, bir iddia ortaya çıkar. Ve yöntem, nesneyi değiştiren her yöntemin başlangıcında ve çıkışında çağrılır (C++ 'da, bu sadece bir satırdır ...)

47
Xavier Nodet

Peki, bu iş parçacığında gördüğüm şeyler harika, ama işte benim için çok yararlı olan bir 'değişmez' tanımı var.

Değişmez, programınızın yürütülmesi boyunca bir insana iletilebilecek, ancak derleyicinize değil, uyulması gereken herhangi bir mantıksal kuraldır.

Bu tanım yararlıdır, çünkü koşulları iki gruba ayırır: derleyiciye zorlama ile güvenilebilecek olanlar ve hata bildirmeden kod tabanıyla etkileşime girebilmeleri için katılımcılara belgelenmesi, tartışılması, yorumlanması veya başka şekilde iletilmesi gerekenler .

Ayrıca, bu tanım yararlıdır, çünkü "Genel değişkenler kötüdür" genellemesini kullanmanıza izin verir.

Örnek olarak, bir manuel şanzıman aracındaki vites değiştirici, bir değişmezi önlemek için tasarlanmıştır. İstersem, her vites için bir kolla bir şanzıman yapabilirdim. Bu kol ileri ("takılı") veya geri ("devre dışı") olabilir. Böyle bir sistemde, bu şekilde belgelenebilecek bir "değişmez" oluşturduk:

"Farklı bir vites takılmadan önce mevcut vitesin ayrılması çok önemlidir. İki vitesin aynı anda takılması, şanzımanı parçalayacak mekanik gerilime neden olacaktır. Başka bir vites geçmeden önce daima mevcut vitesin bağlantısını kesin."

Ve böylece, özensiz sürüşte kırılmış şanzımanları suçlayabiliriz. Ancak modern otomobiller, vitesler arasında dönen tek bir çubuk kullanır. Öyle bir şekilde tasarlanmıştır ki, modern bir vites değiştirme aracında, iki vitesin aynı anda takılması mümkün değildir.

Bu şekilde, şanzımanın 'değişmezi çıkarmak' için tasarlandığını söyleyebiliriz, çünkü mantıksal kuralı ihlal edecek şekilde mekanik olarak yapılandırılmasına izin vermez.

Kodunuzdan kaldırdığınız bu tür her değişmez bir gelişmedir, çünkü kodla çalışmanın bilişsel yükünü azaltır.

15
Daniel Burbank

İşyerinde Coders aşağıdaki alıntı dayanarak ...

Ama koruduğu değişmezliği öğrendikten sonra, görebilirsiniz, ah, eğer değişmezi korursak, günlük arama zamanı alırız.

... sanırım "değişmez" = "istenilen etkiyi sağlamak için korumak istediğiniz durum".

Görünüşe göre değişmez, ince bir şekilde farklılık gösteren iki duyuya sahiptir:

  1. Aynı kalan bir şey.
  2. Hedef X'e ulaşmak için aynı tutmaya çalıştığınız bir şey (yukarıdaki "günlük arama süresi" gibi).

Yani 1 bir iddia gibidir; 2 doğruluk, performans veya diğer özellikleri kanıtlamak için bir araç gibidir - sanırım. 2 örneği için Wikipedia makalesi konusuna bakın (çözümün MU bulmacasına doğruluğunu kanıtlayın).

Aslında 3. değişmezlik duygusu:

0,3. Programın (veya modülün veya fonksiyonun) ne yapması gerekiyor; diğer bir deyişle amacı.

Aynı İşyerinde Kodlayıcılar röportajından:

Ancak büyük yazılımları yönetilebilir kılan şey, küresel değişmezlere veya ne yapması gerektiği ve neyin doğru olması gerektiği hakkında büyük resmi ifadelere sahip olmaktır.

3
Jonathan Aquino

Değişmez (genel anlamda), program yürütülürken belirli bir zamanda veya hatta her zaman doğru olması gereken bazı koşullar anlamına gelir. Örneğin. PreConditions ve PostConditions, bir işlev çağrıldığında ve geri döndüğünde doğru olması gereken bazı koşulları iddia etmek için kullanılabilir. Nesne değişmezleri, bir nesnenin var olduğu süre boyunca geçerli bir duruma sahip olması gerektiğini iddia etmek için kullanılabilir. Bu sözleşme ilkesine göre tasarım.
Kodda çekleri kullanarak gayri resmi olarak değişmezler kullandım. Ama son zamanlarda --- değişmezleri doğrudan destekleyen .Net için sözleşme kütüphanesi kodu ile oynuyorum.

3
softveda

Bir değişmez, programınızın mantığını dikte etmek için kullanılabilecek bir kural veya varsayım gibidir.

Örneğin, kullanıcı hesaplarını takip eden bir yazılım uygulamanız olduğunu varsayalım. Ayrıca, kullanıcının birden fazla hesabı olabileceğini, ancak her ne nedenle olursa olsun, kullanıcının ana hesabı ile "takma ad" hesapları arasında ayrım yapmanız gerektiğini varsayalım.

Bu bir DB kaydı veya başka bir şey olabilir, ancak şimdilik her kullanıcı hesabının bir sınıf nesnesi tarafından temsil edildiğini varsayalım.

class userAccount {private char * pUserName; private char * pParentAccountUserName;

...}

Değişmez, pParentAccountUserName öğesi NULL veya boşsa, bu nesnenin üst hesap olduğu varsayımı olabilir. Bu değişmezi farklı hesap türlerini ayırt etmek için kullanabilirsiniz. Muhtemelen farklı kullanıcı hesabı türlerini ayırt etmek için daha iyi yöntemler vardır, bu yüzden bunun bir değişmezin nasıl kullanılabileceğini gösteren bir örnek olduğunu unutmayın.

1
Pemdas

Bir fizik geçmişinden gelirsek, fizikte, esasen tüm hesaplama/simülasyon boyunca değişmeyen miktarlar olan değişmezlerimiz vardır. Örneğin, fizikte kapalı bir sistem için toplam enerji korunur. Veya yine fizikte, iki parçacık çarpışırsa, ortaya çıkan fragmanlar tam olarak başladıkları enerjiyi ve tam olarak aynı momentumu (bir vektör miktarı) içermelidir. Genellikle sonucu tamamen belirtmek için yeterli değişmez yoktur. Örneğin 2 parçalı çarpışmada dört değişmez, üç momentum bileşeni ve bir enerji bileşeni var, ancak sistemin altı serbestlik derecesi var (durumunu tanımlamak için altı sayı). Değişmezler yuvarlama hatası içinde korunmalıdır, ancak korunmaları çözümün doğru olduğunu kanıtlamaz.

Bu nedenle, tipik olarak, bu şeyler akıl sağlığı kontrolleri olarak önemlidir, ancak kendi başlarına doğruluğunu kanıtlayamazlar.

1
Omega Centauri