Diğer cevapların ima ettiği başka bir şey eklemek isterdim, ancak açıkça belirtildiğini sanmıyorum:
@puck, "İşlev adında ilk belirtilen argümanın gerçekten ilk parametre olduğuna dair hiçbir garanti yok.
@cbojar "belirsiz bağımsız değişkenler yerine türleri kullan" diyor
Mesele şu ki, programlama dilleri isimleri anlamıyor: sadece opak, atomik semboller gibi muamele görüyorlar. Bu nedenle, kod yorumlarında olduğu gibi, bir işlevin adlandırıldığı ile gerçekte nasıl çalıştığı arasında bir ilişki olması gerekmez.
assertExpectedEqualsActual(foo, bar)
Bazı alternatiflerle karşılaştırın (bu sayfadan ve başka bir yerden), örneğin:
# Putting the arguments in a labelled structure
assertEquals({expected: foo, actual: bar})
# Using a keyword arguments language feature
assertEquals(expected=foo, actual=bar)
# Giving the arguments different types, forcing us to wrap them
assertEquals(Expected(foo), Actual(bar))
# Breaking the symmetry and attaching the code to one of the arguments
bar.Should().Be(foo)
Bunların hepsi , diline bakmak için opak olmayan bir şey veren ayrıntılı addan daha fazla yapıya sahiptir. İşlevin tanımı ve kullanımı da bu yapıya bağlıdır , bu nedenle uygulamanın ne yaptığı ile senkronize edilemez (bir isim veya yorum gibi).
Böyle bir sorunla karşılaştığımda veya gördüğümde, bilgisayarımı hayal kırıklığı içinde bağırmadan önce, makineyi suçlamanın 'adil' olup olmadığını sormak için biraz zaman ayırıyorum. Başka bir deyişle, istediğim şeyi istediğimden ayırt etmek için makineye yeterli bilgi verildi mi?
Böyle bir çağrı assertEqual(expected, actual)
olduğu kadar his gibi markaların assertEqual(actual, expected)
bize onları karıştırıyorum için, bu nedenle kolay ve makine önde azimle ve yanlış bir şey yapmak. Kullandığımız Eğer assertExpectedEqualsActual
bunun yerine, yapmak olabilir bize az olası bir hata yapmak, ancak makineye hiçbir bilgi (o İngilizce anlayamıyorum ve ismin tercihi semantiğini etkilememelidir) verir.
Anahtar kelime argümanları, etiketli alanlar, farklı türler vb. Gibi "yapılandırılmış" yaklaşımları daha çok tercih edilen kılan şey, fazladan bilginin aynı zamanda makine tarafından okunabilmesidir , böylece makinenin yanlış kullanımları tespit etmesini sağlayabilir ve doğru şeyler yapmamıza yardımcı olabiliriz. assertEqual
Tek sorun yanlış mesajlar olurdu çünkü durum çok kötü değil. Çok farklı bir anlamı olan, String replace(String old, String new, String content)
karışması kolay olan daha uğursuz bir örnek olabilir String replace(String content, String old, String new)
. Basit bir çare bir çift almak [old, new]
olacaktır, bu da hataların derhal bir hatayı tetiklemesini sağlayacaktır (türler olmadan).
Türlerde bile kendimizi 'makineye ne istediğimizi söylemiyoruz' bulabileceğimizi unutmayın. Örneğin, "dizge yazmalı programlama" olarak adlandırılan anti-patern tüm verileri dizeler olarak ele alır, bu da argümanların karıştırılmasını (bu durumda olduğu gibi), bir adım atmayı unutmayı (örneğin kaçmayı), değişmeyenleri kırmayı (örneğin kaçmayı) kolaylaştırır. rakipsiz JSON) yapma, vb.
Bu aynı zamanda “boolean blindness” ile de ilgilidir, burada kodun bir bölümünde bir sürü boole (veya sayı, vb.) Hesaplıyoruz, ancak onları başka bir yerde kullanmaya çalışırken, aslında neyi temsil ettikleri, açık olup olmadığı açık değildir. Bunları karıştırdık, vb. Bunu, örneğin, açıklayıcı adları olan (örneğin LOGGING_DISABLED
yerine false
) ve bunları karıştırırsak hata mesajına neden olan farklı numaralarla karşılaştırın .