Yalan söyleyen kodu aramalı mıyız?


9

Bu, bir cevaptaki bir tartışmaya ve bu sorunun yorumlarına atıfta bulunuyor : Sektördeki dokümantasyondan kaçınma nedir? . Cevap, "kod yalan söyleyemez" ve dolayısıyla dokümantasyon yerine gidilecek yer olması gerektiğini iddia etti. Birkaç yorum "kod yalan olabilir" işaret etti. Her iki tarafta da, en azından kısmen, belgelerin ne kadar kötü ve uygunsuz bir şekilde ele alındığından dolayı gerçek vardır.

Mevcut herhangi bir belgeyle karşılaştırarak yalancı kod arayışında mıyız? Yoksa genellikle yapması gereken şey için en iyi kaynak mı? Çevik kod ise, yalan söyleme olasılığı daha düşük mü yoksa bu kod hiç yalan söylemiyor mu?


1
"Yalan" ile ne demek istediğinizi açıklığa kavuşturabilir misiniz? Bağlamınızı elde etmek için başka bir sorudaki yorumlara atıfta bulunmamalıyız.
user16764

@ user16764 Diğer konuya bakmadan, akla ilk gelen şey Underhanded C Yarışması
Izkata

Belgeler kodun foo yapması ve kodun bar yapması gerektiğini söylüyorsa, bu kodun ne yapması gerektiği anlamına mı geliyor? Yoksa kodun her zaman doğru olması nedeniyle belgeleri hiç okumadığımız için çubuğun doğru eylem olduğunu mu varsayıyoruz?
thursdaysgeek

Kod çubuk olarak kabul edilmişse, belgeler yanlış ve güncel değildir. Ancak foo ve bar yakından ilişkiliyse ve kullanıcılar sorunlarını bekledikleri gibi çözmediğini fark etmediyse, belki de foo ile ilgili belgeler yanlış değildir? Başka bir deyişle, kod gerçekten kodun ne olması gerektiği ve hepsinin sonu mu?
thursdaysgeek

Yanıtlar:


9

Layman'ın sözleriyle:

Evet , yalancı kodu aramalı ve gerçeği söylemesini sağlamalısınız. Ancak bunu dokümanlarla karşılaştırarak değil.Yalan belgelerin tespiti için bir yöntem olurdu.

Kodun yalan söyleyebileceği birkaç yol var, bunlardan sadece birkaçını anlatacağım:

  • Asla çalışmayan kod blokları, çünkü asla karşılanmayan koşullar. Kod size ne kadar yaptığı hakkında yalan söylüyor.
  • Gereksiz karmaşıklık katan kod, sorunun gerçekten ne kadar karmaşık olduğu konusunda yatar.
  • Hiçbir adlandırma kuralı olmayan kod, çünkü gerçekten yaptığı şeyden farklı bir şey yaptığını düşünmenize yol açar.

Ne kadar kısa olursa, o kadar az yatar. Bu apaçık ortada.

Kod ne kadar karmaşıksa, o kadar şeffaf olur. Yani daha az yatıyor.

Gizli sözdizimi hileleri çok yalan söylüyor. Net, adım adım algoritmaları tercih edin. Daha az yalan söylerler.

İyi bir statik kod analiz aracı yalan söyleyen kodu bulmanıza yardımcı olabilir.

Ayrıca iyi bir otomatik test bataryası, kodu gerçeği söylemeye zorlar.


4
The shorter and terser the code is, the less it lies. It's self evident. Bunu söylemek zor. Deneyimlerime göre, kod ne kadar kısa ve ters ise, süpürme fırsatı o kadar fazla olur, genellikle aldatıcı işlev çağrılarında gizlenerek halının altında kalır.
Mason Wheeler

@MasonWheeler Haklısın. "Kısa" kısmı düzenledim.
Tulains Córdova

"Hiçbir adlandırma kuralları yalan kodu" ile ikna değilim. Kesinlikle kötü, ama sana bir şey söylemiyorsa nasıl yalan söyleyebilir? "Sana söylemeyeceğim!" inatçı olarak engelleyici ve bilgilendirici değildir, ancak aldatıcı değildir. Şüphesiz "yalan", bir adlandırma kuralı olduğunda, ancak kodun gerçekte ne yaptığına uymayan bir şekilde kullanılır - örneğin Macarca (yuck!) Kullanıyorsanız, ancak zaman zaman pbir değişkenin önekine sahipseniz bir işaretçi değil.
Steve314

2
Aslında, önerdiğiniz şey "yalan" olarak değil, "incelik" olarak tanımlanabilir. Sofistik, ayrıntılı ve karmaşık olma eğilimindedir, bu yüzden mantıksal kusurları görmek zordur ve yüzeysel olarak zeki ve kendine güvenir, böylece insanlar aptal görünmeleri durumunda sorgulamaktan korkarlar.
Steve314

Başka bir örnek: Temel dili veya çalışma zamanı özelliklerini değiştiren kod, örneğin ilkel davranışı yeniden tanımlama veya maskeleme.
JustinC

6

Kod yalan söyleyemez.

Kodda ne var, programınız şu anda ne yapıyor - hangi belgeler, KG veya müşteri ne olursa olsun. Özellikle kodunuz bir süre serbest bırakıldıysa ve sahada bulunuyorsa, beklenen davranışlar göz ardı edilmemelidir.

Kod kesinlikle yanlış olabilir . İsimlendirilmesinde veya organizasyonunda kesinlikle yanıltıcı olabilir. Kesinlikle okunamaz olabilir.

Ancak, kodunuzun ne yaptığının gerçeğinin kaynağını istiyorsanız, yapması gerekeni değil, yapmak için tasarlandığı şeyi değil, ne yaptığını düşündüğünüzü değil ... aslında ne yaptığını bilmeniz gerekiyorsa, koda gidin.


Kasten aldatıcı ama bilgiçlikçiyseniz, o zaman yalan söylemediğiniz bir düşünce okulu vardır. Tek düşünce okulu değil. Örneğin, Aldert Vrij'in Yalanları ve Aldatmacayı Saptama'nın eski bir baskısı var . Bunun yaptığı ilk şeylerden biri, yalancı ve aldatmanın çeşitli tanımlarını düşünmek, kısmen bilgiçlikle doğru ama kasıtlı olarak yanıltıcı ifadeleri kısmen seçmektir, çünkü bu zaten ortak bir anlayıştır.
Steve314

Üzgünüm, ama "ama bilgiçlikle doğruydu" demek yalancı olarak adlandırılamayacağınız anlamına gelmez - insanlar geri dönmezlerse bile, bunu hala biliyorlar.
Steve314

@ steve314 - pssh. Orijinal soru yorumlarla ilgiliydi. Yorumlama lehine tartışmak için kodun yanıltıcı bir şekilde adlandırıldığı bu nadir senaryolar için bir saman adam oluşturmak (ve yorumların güncelliğini kaybetmenin en yaygın senaryosunu görmezden gelmek) saçmadır.
Telastyn

1
Buna katılıyorum - bahsettiğiniz noktayı değil, bunu yaparken kullandığınız "yalan" ın belirgin tanımını tartışıyorum. Kod olabilir değil derleyiciye, ama kesinlikle insan okuyucularına - Yalan. Bazı durumlarda kasıtlı bir hedef bile - gizlenmiş C yarışması gibi şeyler nispeten iyi huylu bir örnek olacaktır. Ben sofistike, kullanıcı yorumumda önerdiğim gibi61852. Bir derleyicinin yalandan geçmesi onun yalan olmadığı anlamına gelmez.
Steve314

@Telastyn Sanırım hiç bir filtrenin bir yönlendirme yapmamıştınız. Tanrım! @ # $ Java devs Java ile yapmak nefret ediyorum.
Erik Reppen

0

Birkaç soru soruyorsun.

Yalan söyleyen kod arayışında mıyız?

Elbette!

[Kod] ile mevcut dokümantasyon karşılaştırılmalı mıdır?

Diğer yanıtlarda belirtildiği gibi, bu asla zarar veremez, daha sık olarak bu , kodda değil , belgelerde sorun bulmanıza neden olur .

Yoksa [kod] genellikle yapması gereken şey için en iyi kaynak mıdır?

Her zaman ne için en iyi kaynaktır edilir yapıyor. Kodun ne yapması için en iyi kaynak, farklı şeyler olabilir (bunların bir kombinasyonu), ana olanlar:

  • Kodun kendisi;
  • Telefon kodu;
  • Bu koddaki yorumlar;
  • Belgeler;
  • Birim testleri;
  • Entegrasyon ve regresyon testleri;
  • Programcı;
  • Son kullanıcı;

"En iyi" kaynak (veya bunların kombinasyonu) hangisi sizin durumunuza bağlıdır.

Çevik kod ise, yalan söyleme olasılığı daha düşük mü yoksa bu kod hiç yalan söylemiyor mu?

"Agile code" ile ne demek istediğinizden emin değilim, AFAIK "agile" genellikle kodlama sürecini ifade eder. Eğer "çevik bir programlama sürecinde oluşturulan kod" demek varsayalım o zaman hala yalan söyleyebiliriz düşünüyorum . Şelale tarzı projelerde oluşturulan kodla karşılaştırıldığında yalan söyleme olasılığı öznel bir konudur (kişisel olarak büyük bir bağlantı olduğunu düşünmüyorum).


Dipnot
Yukarıdaki tüm kodu varsayımı altında olduğunu olabilir bu temel (biraz yapmacık olsa da) örnek olduğunu yalan ve:

public int DivideByTwo(int input) 
{
    return input / 3;
}

Bu "kod yalanları" diyebilirim sadece bir örnek, @ user61852 birkaç diğerleri (ulaşılamaz kod, sorun karmaşıklığı eşleşmeyen kod karmaşıklığı, kötü adlandırma) ve ben çok daha fazlası olduğunu düşünüyorum. Vikipedi yalanların biraz iyi bir özetine sahiptir , birçoğu kod bulunabilir.

Birisiyle tartışıyorsanız, diğer kişinin "kod yalan söyleyemediğini" ifade etmediğinden emin olun , "kod ne yaparsa yapsın". Özünde buradaki diğer kişi, "yalan" için bir tanım kullanarak, "kod yalan söyleyemez" ifadesini bir aksiyom / temel gerçek olarak ilan edebilecek şekilde tanımlamaktadır. Bu durumda muhtemelen aksiyomu ile anlaşmak en iyisidir.


0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

"Yalan" kelimesinin teknik olarak uygun olup olmadığını tartışabilirsiniz, ancak bu kod açıkça x'in bazen 5'ten büyük ve bazen olmayacağına işaret etmektedir. Tam programa bakarsanız ve bu işlevin yalnızca tek bir yerde çağrıldığını ve x'in her zaman sabit 6'ya ayarlandığını keşfederseniz, bu bir yalandır.

Dahası, derleyici bunu fark etmiş olabilir ve bu kod bloğunu basitçe

doSomething()

DoADifferentThing, programınızda başka bir yerde çağrılmazsa, programdan tamamen kaldırılabilir.

Eğer diliniz assertüretim yapılarında kapalı olan bir tür dili destekliyorsa , her assertifade potansiyel olarak bir yalandır. Daktilo, yalan olabilecek başka bir iddiadır.

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.