“İyi kod” yazmak ne anlama geliyor? [kapalı]


41

Gelen bu soruya sordum iyi kod yazma kötü bir yazar engelleyen kendin olduğun olsun. Yanıtların çoğu "iyi kodla neyi kastediyorsunuz?" İle başladı.

Görünüşe göre "iyi kod" ve "kötü kod" çok özneldir. Bir görüşüme sahip olduğum için, diğerlerinin görüşlerinden çok farklı olabilir.

Peki "iyi kod" yazmak ne anlama geliyor? "İyi kod" nedir?


15
İyi kod, iki yıl sonra bakarsanız ve ilk düşünceniz "Dostum, wtf" değil.
Bobby

Yanıtlar:


91

İyi bir kodlayıcı iyi bir bilardo oyuncusu gibidir.

Profesyonel bir bilardo oyuncusu gördüğünüzde, ilk başta etkilenmemiş olabilirsiniz: "Elbette, tüm topları topladılar ama sadece kolay atışları oldu!" Bunun sebebi, bir havuz oyuncusu atış yaparken, hangi topun hangi cebe gireceği hakkında düşünmemesi, ayrıca isteka topunun nerede biteceğini de düşünmesidir . Bir sonraki atış için ayarlamak muazzam beceri ve pratik gerektirir, ancak aynı zamanda kolay göründüğü anlamına gelir.

Şimdi, bu metaforu koda getirerek, iyi bir kodlayıcı yapmak kolay ve anlaşılır gibi görünen bir kod yazar . Brian Kernighan'ın kitaplarındaki örneklerinin çoğu bu kalıbı izler. "Hile" nin bir kısmı sorunun ve çözümün uygun bir şekilde kavramsallaştırılmasıyla geliyor . Bir sorunu yeterince iyi anlamadığımız zaman, çözümlerimizi aşırı karmaşık hale getirme ihtimalimiz daha yüksektir ve birleştirici fikirleri görmekte başarısız olacağız.

Sorunun doğru bir şekilde kavramsallaştırılmasıyla diğer her şeyi elde edersiniz: okunabilirlik, sürdürülebilirlik, verimlilik ve doğruluk. Çözüm çok basit göründüğü için, muhtemelen daha az yorum yapılacak, çünkü ekstra açıklama gerekli değil. İyi bir kodlayıcı ayrıca ürünün uzun vadeli vizyonunu görebilir ve kavramsallaştırmalarını buna göre oluşturabilir.


10
"İyi bir kodlayıcı, kolay ve anlaşılır gibi görünen bir kod yazar." << tam olarak! Bence bu, insanlar genellikle iyi bir kodlayıcının çok "akıllı" kesmeler yazabilen biri olduğunu düşünüyor. Kod temizse ve aşırı derecede "zekice" değilse, kolay olmalı, değil mi?
hasen

3
2 sentim: EASY otomatik refactorings ile bir diliniz olduğunda - Java ve C # en iyi bildiğim iki örnektir - yinelemeli olarak iyi koda geçmek kolaydır. Aksi halde, en başta iyi kavramsallaştırmanız gerekir, ancak burada bir tür tavuk yumurtası sorunu var.
Dan Rosenstark

3
Bazı algoritmalar kendinden karmaşıktır. İyi bir kodlayıcı gerçekten ihtiyaç duyulduğunda bunları yazmakta hiçbir sorun yaşamamalıdır - ve onları mümkün olduğunca okunaklı tutmak.
J-16 SDIZ

2
@ hasenj: evet, bunun nedeni bu lemma: aptal insanlar derleyicinin anladığı kodları yazarlar. Zeki insanlar kod yazıyor, aptal insanlar anlıyor.
v.oddou

49

Dakika başına WTF'ler

( orijinal )


EDIT: Temel fikir, “Kod Kalitesi” nin kurallara dahil edilememesi, aynı şekilde “İyi sanat” veya “İyi şiir” i kurallara koyamazsınız, böylece bir bilgisayarın “Evet, iyi sanat” demesine karar verebilirsiniz. veya "Hayır, kötü şiir". Şu anda tek yol, kodun diğer insanlara ne kadar kolay anlaşılabilir olduğunu görmektir.


1
Bu, iş yerindeki beyaz tahtaya sıkışmış :-)
Nobody

1
@Cape Cod Gunny Bob Amca'nın da kitabındaydı
mlvljr

2
Harika bir çizgi film olmasının yanı sıra, gerçekten de bir noktaya geldiğine inanıyorum - iyi kod, diğer insanların okumayı ve sürdürmeyi keyifli bulduğu kod.
FinnNk

1
Yani doğru, iyi kod kötü olmayan herhangi bir koddur. Örneğin, iyi kodu tanımlamak zor, kötü kodu tanımlamak daha kolaydır.
Ernelli

5
Genellikle "WTF?" Yi iyi kod toplantısında buluyorum, kısa bir süre sonra "Oooooh Tamam ... ne yaptığını gördüm."
AndrewKS,

7

Kodu ne kadar hızlı anlayabileceğinden başka gerçekten iyi bir kriter yok. Kodunuzun özlü olma ve okunabilirlik arasındaki mükemmel uyumu bularak iyi görünmesini sağlarsınız.

"Dakikadaki WTF'ler" (yukarıda) doğrudur, ancak bu sadece daha genel kuralın bir sonucudur. WTF'ler sayısı arttıkça anlayış da yavaşlar.


1
@ rmx: "İşi iyi yapmak" ı tanımlamak
mojuba 7:10

2
Eh, RemoveCustomeryöntem aslında cutomer batırmadan kaldırır. Güzel görünmesi için saatlerinizi harcayabilirsiniz, ancak bu gerçekten işe yaradığı anlamına gelmez. 'Kodu ne kadar hızlı anlayabiliyorsunuz?' Dediğim şey 'iyi kod' için tek kriter değil.
Kimse

2
@ rmx: ama hatasız olmak ima edilir, öyle değil mi? Kodunuz işi düzgün yapmıyorsa, kod değildir (henüz).
mojuba

4
@rmx: aslında, hayır. Eğer kodunuzun anlaşılması kolaysa, sonuçta kötü iş yapıp yapmadığını anlamak kolaydır. OTOH, anlaşılması zorsa, iş yapıp yapmadığını anlamak zor.
pillmuncher

2
@rmx: PS basitçe söylemek gerekirse, sizin decrement () klasik bir WTF'dir ve bu nedenle, bu fonksiyonun kullanıldığı kod parçalarının anlaşılmasını yavaşlatır
mojuba

5

İyi bir kod yazdığın zaman ...

  1. Müşteri mutlu
  2. İş arkadaşlarınız kodunuzu başlangıç ​​noktası olarak ödünç alır.
  3. Yepyeni bir adam / gal'e 6 ay önce kurduğunuz bir sistemde değişiklik yapması söylendi ve bir kez daha size bir soru sormadı
  4. Patronun, ekibin kullanması için yeni aletler geliştirmeni istiyor.
  5. Bugün yazdığınız koda bakıp kendinize "İki yıl önce böyle bir kod yazabilseydim" diyorsunuz.

Kodun iyi olup olmadığını nasıl ölçersiniz ...

  • Tepki süresi nedir?
  • Sunucuya kaç tane tur atıyor?
  • Uygulamayı şahsen kullanır mıydınız, yoksa bunun gereksiz olduğunu mu düşünüyorsunuz?
  • Bir dahaki sefere aynı şekilde yapar mısın?

Olması gerektiğinde iyi kod çalışır. İyi kod gerektiğinde kolayca değiştirilebilir. Kâr sağlamak için iyi kod tekrar kullanılabilir.


2
"Müşteri mutludur" buna diktir.

1
@TRA - Eğer müşteri mutluysa bu, talep edenleri anladığınız ve beklediğiniz bir çözümü sağladığınız anlamına gelir.
Michael Riley - AKA Gunny

6
Elbette ama kötü kod aynı şeyi yapabilir.

4

Olan bir kod

  1. hatasız

  2. yeniden kullanılabilir

  3. bağımsız

  4. Daha az kompleks

  5. iyi belgelenmiş

  6. kovalamak kolay

iyi kod denir.

İyi bir program kusursuz çalışıyor ve hiçbir hata yok. Ama hangi iç nitelikler böyle bir mükemmellik üretir? Bu gizem değil, sadece ara sıra hatırlatmaya ihtiyacımız var. İster C / C ++, C #, Java, Basic, Perl, COBOL veya ASM olarak kodlarsanız, tüm iyi programlamalamalar aynı zamanda onurlandırılmış nitelikleri gösterir: sadelik, okunabilirlik, modülerlik, katmanlama, tasarım, verimlilik, zerafet ve netlik katsayısı, zerafet ve netlik

Kaynak: MSDN


Sadelik, okunabilirlik, zerafet ve netlik hepsi aynı şeydir. Modülerlik ve katmanlama sadece kodunuzu net ve şık hale getirme yöntemleridir. O zaman listede kalan tek şey, bir tür ima edilen verimliliktir ve bunun yanında genellikle verimlilik ve netlik arasında bir uzlaşma meselesidir.
mojuba


2
Kod hatasız olabilir?
Casey Patton

Hayır yapamaz. (Pratik)
Chankey Pathak

Verimli listenize eklenmeli. Hız, mutlaka iyi bir kodun birincil göstergesi değildir, ancak iyi kodun gereksiz yere yavaş veya israf olmaması gerekir.
Caleb,

3

Bu tanıdık geliyor mu?

Philips bana yeni bir ürünün tasarımını izleme fırsatı verdi. Geliştikçe giderek daha fazla tedirgin olmaya başladım ve endişelerimi amirime iletmeye başladım. Ona defalarca tasarımların “temiz” olmadığını ve Dijkstra'nın tasarımlarının güzel olduğu şekilde “güzel” olması gerektiğini söyledim. Bunu yararlı bir yorum olarak bulamadı. Bana sanatçı değil, mühendis olduğumuzu hatırlattı. Kafamda sadece zevkimi ifade ediyordum ve kararımı verirken hangi kriterleri kullandığımı bilmek istiyordu. Ona söyleyemedim! Hangi ilkelerin ihlal edildiğini açıklayamadığım için yorumlarım basitçe göz ardı edildi ve çalışmalar devam etti. “Tatm” için motivasyon açıklamanın ve sağlamanın bir yolu olması gerektiğini hissetmek, İyi tasarımları kötü olanlardan ayıracak bir ilke bulmaya başladım. Mühendisler çok pragmatik; güzelliğe hayran olabilirler, ancak fayda ararlar. “Güzelliğin” neden faydalı olduğuna dair bir açıklama bulmaya çalıştım.

Lütfen gerisini burada görün .


1
@ Mlvljr 'in yayınındaki bağlantı koptuğu için, Google Kitaplar sayfasına bir bağlantı verilmiştir: books.google.co.in/…
balajeerc 28:15

@balajeerc Teşekkürler (Ben de bağlantıyı düzelttim, bu yüzden aynı
pdf'nin

1

doğal kod kalite kriterleri (minimum kopyala / yapıştır, spagetti vb. hariç) haricinde, iyi bir endüstriyel kod her zaman biraz saf, biraz fazla ayrıntılı görünmelidir.

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

aksine

Record r = cache.get(i++, false);

Ama yok do_not_create = falsedemek “pas falseolarak do_not_createveya” geçmesi o oluşturulur böylece argüman “ falseolarak do_createoluşturulduğu olmayacak şekilde argüman”? Argüman isimlerini kullanabileceğiniz bir dilde tercih ederim cache.get (key:i, create: false); i += 1;.
PJTraill

1

Muhtemelen bunun tersini gösteren bir cevap yardımcı olabilir (artı XKCD'yi buraya almak için bir bahane ).

alt metin

İyi kod

  • anlaşılması kolay,
  • bakımı kolay,
  • tüm sorunları sadece elden çözmeyi denemez
  • geliştiricilere alternatifler aramadan uzun süre yaşar

Örnekler içerir

  • Apache Commons
  • Bahar çerçeve
  • Hazırda bekletme çerçevesi

1

Ben sadece "bakılabilir" ile gideceğim

Tüm kodlar korunmalıdır: bu görevin gerekenden daha zor yapılması gerekmez

Herhangi bir okuyucu bu basit gereksinimi anlamıyorsa veya dile getirilen bir ihtiyaç duymuyorsa, o durumda kod yazmamalı ...


1

İyi kod her kişi için farklı olacaktır ve birlikte çalıştıkları dilin de iyi kod olarak kabul edilebilecekleri üzerinde etkisi vardır. Genellikle bir projeye yaklaştığımda aşağıdakileri ararım:

  • Proje nasıl düzenlenir? Kaynak dosyalar temiz bir şekilde düzenlenmiş mi ve çok fazla çaba harcamadan kod bulabilir miyim?
  • Kod nasıl düzenlenir? Bir dosya başlığının kullanımıyla veya kendi dosyasında bulunan her bir sınıfın kullanımı gibi dosyadaki kodun ne yaptığı açıkça belgeleniyor mu? Uygulamada artık kullanılmayan dosyada işlev var mı?
  • İşlevler nasıl düzenlenir? Değişkenlerin bildirildiği açık bir örnek var mı, yoksa oldukça rasgele bir örnek mi? Kodun kendisine mantıklı bir akışı var mı ve gereksiz kontrol yapılarını önlüyor mu? Her şey, kodun nerede ve ne şekilde yapıldığını açıkça ifade ederek kodun neden ve / veya ne yaptığını açıkça ifade ediyor mu?

Tüm bunların ötesinde, uygulamanın tasarımı bir bütün olarak anlam ifade ediyor mu? Uygulamada yer alan kod, dünyanın en iyisi olabilir, ancak uygulamanın genel tasarımı mantıklı gelmiyorsa, çalışması yine de acı verici olabilir.


1

Lütfen okunabilirlik konusunda aynı fikirde olmamama izin verin. Hayır, tamamen değil: İyi kod okunabilir olmalı ve bu, yeterince yorumla kolayca elde edilebilir.

Ancak iki tür WTF'yi düşünüyorum: programcının 101'i programlamadan daha ileri bir şey alıp almadığını merak ettiğiniz yerler ve kodun doğruluğunu kesinlikle anlamadığınız kişiler. Bazı kodlar ilk başta çok garip görünebilir, ancak aslında zor bir soruna çok yaratıcı bir çözümdür. İkincisi WTF-metrede sayılmamalıdır ve yorumlardan kaçınılabilir.

Çok okunabilir kod çok yavaş olabilir. Daha az okunabilir bir çözüm, hızda çok yönlü bir gelişme sağlayabilir. R, bunun genellikle doğru olduğu dilin harika bir örneğidir. Birisi orada mümkün olduğunca döngülerden kaçınmayı sever. Genel olarak, daha hızlı okunabilse bile en hızlı kodu daha iyi bir kod olarak görürüm. Yani, iyileştirme elbette kapalıysa ve kodun ne yaptığını açıklamak için yeterli yorum eklenmişse.

Dahası, hafıza yönetimi birçok bilimsel uygulamada çok önemli olabilir. Çok kolay okunabilen kod, bellek kullanımında biraz özensiz olma eğilimindedir: Sadece yaratılan daha fazla nesne vardır. Bazı durumlarda hafızanın akıllıca kullanılması, kodu tekrar daha az okunabilir hale getirir. Ancak, örneğin DNA dizilerinin gigabaytlarının çevresinde hokkabazlık yaparsanız, hafıza çok önemli bir faktördür. Yine, bellekten daha az yoğun olan kodu, okunabilirliğinden bağımsız olarak daha iyi bir kod olarak değerlendiriyorum.

Yani evet, okunabilirlik iyi kod için önemlidir. Uwe Liggis'in adaçasını biliyorum: Düşünmek acı veriyor ve bilgisayarlar ucuz. Ancak benim alanımda (istatistiksel genomik), bir haftanın hesaplama zamanları ve 40 Gb'ın üzerindeki hafıza kullanımı anormal sayılmaz. Dolayısıyla, hızın iki katı ve hafızanın yarısı kadar bir gelişme, bu ilave okunabilirlikten çok daha değerli.


İstisnasız hiçbir kural / kuralların
user2664856

1
Anlaşmazlığınıza katılmıyorum: sahadaki hızınızın çok önemli olduğunu ve okunabilirlikten daha önemli olduğunu söylüyorsunuz. Kabul etmiyorum, doğru dengeyi kullanmaya çalışmalısınız. Hız gerekmiyorsa, örneğin yüksek seviyeli bir arayüz için, bakımı kolay bir şeyi tercih edebilirsiniz, eğer hız gerekirse, size katılıyorum. Zor kurallardan ziyade sağduyu kullanmak daha iyidir ve yine de erken optimizasyondan kaçınmalısınız.
BlueTrin

@BlueTrin Neden her ikisi de bu yüksek mükemmellikli kaynak kodunu beyin derlemiyor ve ayrıca neler olup bittiğini de cehenneme belgeliyor (yorumlarda var)?
mlvljr

1

Benim için de geçerliyse ... Başka bir projede çalışan bir iş arkadaşınız geldiğinde ve her bir kod bloğunun üzerinden geçmeden ne yaptığımı anlayabildiğimde iyi kod yazdığımı biliyorum. ve ne yaptığını gösterme.
Onun yerine "Bekle bir dakika, ne ?!" "Ah, tamam, orada ne yaptığını anlıyorum" diyor.

İyi kod aynı zamanda çok sinsi geçici çözümlere veya 'korsanlara' sahip değildir. Satır yazarken, aynı zamanda kendinize de söylüyorsunuz, "Bunu yapmanın iyi bir yol olmadığını biliyorum, ama şimdilik bu şekilde yapmak zorunda kalacağım. daha sonra geliştirmek için kendim ... "


1

'İyi' kodun pek çok özelliği var, ancak en önemlisi IMHO okunabilirlik ve bakım kolaylığı.

Kodunuz edecek , hataları içerecektir muhtemelen genişletilmiş ve yeniden kullanılabilir ve gerektiği yeniden çarpanlarına bir noktada olması - bu olsa bile bunu yeniden ziyaret, büyük ihtimalle ne halt bir ipucu olmayacağını vardır ilk başta kendinize bir iyilik yapmak ve hiçbir şekilde engel koymamak için yaptınız.

Elbette, bu kadar karmaşık ve verimli olmayan bir algoritma kullanın, ancak bunu belgelemek için fazladan zaman harcadığınızdan emin olun, ancak aksi halde kodunuzu net ve tutarlı yapın.

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.