Permütasyon ile programlama - Programming by permutation

Permütasyon ile programlamaBazen "kazara programlama" veya "deneyerek programlama" veya "shotgunning" olarak adlandırılan, bir programlama probleminin yinelemeli olarak küçük değişiklikler yaparak çözüldüğü bir yazılım geliştirme yaklaşımıdır (permütasyonlar ) ve istenen şekilde davranıp davranmadığını görmek için her değişikliği test edin. Bu yaklaşım bazen programcı kodu tam olarak anlamadığında ve bir veya daha fazla küçük değişikliğin doğru kodla sonuçlanabileceğine inandığında çekici görünebilir.

Bu taktik şu durumlarda verimli değildir:

  • Kod tabanının önemli ölçüde kapsanması ile kolayca yürütülen otomatik regresyon testlerinin eksikliği vardır:
  1. Bir dizi küçük değişiklik, koda kolayca yeni tespit edilmemiş hatalar ekleyerek başlangıç ​​noktasından daha da az doğru olan bir "çözüme" yol açabilir
  • Olmadan Test Odaklı Geliştirme Çözümün ilgili vakaların tümü veya önemli bir kısmı için işe yarayıp yaramayacağını ampirik testlerle ölçmek nadiren mümkündür.
  • Hayır Sürüm Kontrol Sistemi kullanılır (örneğin GIT, Mercurial veya SVN ) veya bir değişikliğin görünür bir etkisi olmadığında durumu sıfırlamak için yinelemeler sırasında kullanılmaz
  1. birçok yanlış başlangıç ​​ve düzeltme genellikle tatmin edici bir son noktaya ulaşılmadan önce gerçekleşir
  2. en kötü durumda, kodun orijinal durumu geri alınamaz bir şekilde kaybolabilir

Permütasyon yoluyla programlama, üretilen kodun kalitesi hakkında çok az güvence verir veya hiç garanti etmez - bu, Resmi doğrulama.

Programcılar genellikle permütasyonla programlamaya zorlanırlar. API yetersiz şekilde belgelenmiştir. Bu netlik eksikliği, başkalarını kopyala ve yapıştır doğru olduğu varsayılan, ancak kendisi permütasyonla programlama sonucunda yazılmış olan referans kodundan.

Programcının küçük bir varyasyon setinden tam olarak birinin çalışması gerektiğini mantıksal olarak açıklayabildiği bazı durumlarda, permütasyon yoluyla programlama doğru koda yol açar (bu daha sonra doğrulanabilir) ve diğer (yanlış) varyasyonlar hakkında düşünmeyi gereksiz kılar.

Misal

Örneğin, aşağıdaki kod örneği C (daha büyük bir dizeden bir dizi rakamı bulup kopyalamayı amaçlayan) birkaç sorun vardır:

#Dahil etmek <stdio.h>#Dahil etmek <string.h>#Dahil etmek <ctype.h>int ana(geçersiz){    sabit kömür* tampon = "123abc";    kömür hedef[10];    int ben = 0;    int j = 0;    int l = gergin(tampon);    süre (ben < l) {        Eğer (isdigit(tampon[ben])) {            hedef[j++] = tampon[ben++];        }        ++ben;    }    hedef[j] = ' ';    printf("% s", hedef);}

Her şeyden önce doğru cevabı vermiyor. Verilen başlangıç ​​dizesiyle, doğru yanıt "123" olduğunda "13" çıkışını üretir. Yapısal sorunları tanımayan bir programcı, "ah, fazladan bir artış var" diyerek tek bir cümle üzerinde anlaşabilir. "++ i" satırı kaldırılır; ancak kodu test etmek sonsuz bir döngü ile sonuçlanır. "Oops, yanlış artış." Önceki ifade geri eklenir ve üstündeki satır, i değişkeninin artım sonrası artışını kaldırmak için değiştirilir:

    Eğer (isdigit(tampon[ben])) {        hedef[j++] = tampon[ben];    }

Kodu test etmek artık doğru yanıtı, "123" ü üretir. Programcı memnuniyetle içini çeker: "İşte bu yaptı. Şimdi her şey bitti." Diğer çeşitli giriş dizileriyle yapılan ek testler bu sonucu çıkarır.

Elbette başka sorunlar da devam ediyor. Programcı kodu tam olarak anlama zahmetine girmediği için tanınmazlar:

  • Giriş, "123ab456" gibi rakam olmayan karakterlerle ayrılmış birkaç numara içeriyorsa, hedef, birbirine bitişik olarak tüm rakamları alır
  • Girdi dizesi hedef diziden daha büyükse, bir arabellek taşması meydana gelir
  • Girdi dizesi INT_MAX'tan uzunsa, strlen () işaretsiz bir tamsayı olan ve int'den daha geniş olabilen size_t türünde bir değer döndürdüğü için davranış tanımsızdır.
  • Char işaretli bir türse ve girdi dizesi, tamsayı yükseltmeden sonra 0..UCHAR_MAX aralığında olmayan karakterler içeriyorsa, isdigit () çağrısının tanımsız davranışı vardır.

Çözüm, sınırlı sayıda giriş dizesi için doğru olsa da, tam olarak doğru değildir ve programcı kodu anlama zahmetine girmediğinden, hatalar daha sonraki bir test aşamasına kadar keşfedilmeyecektir.

"Deneme ve Hata", "Oluştur ve Test Et", "Dürtme ve Umut" olarak da bilinir,[1] "Birdshot Yöntemi" ve "Milyon Maymun Programlama Stili".

Referanslar

  1. ^ Matematik ve Bilgisayar Eğitimi. Michigan üniversitesi. 21: 78. 1987. Eksik veya boş | title = (Yardım)