Okunabilir ve kolayca bakımı yapılabilir bir kod yazıp yazmadığınızı nasıl anlarsınız?


336

Birinin oluşturduğu kodun kolayca okunabilir, anlaşılabilir ve bakımı yapılabilir olup olmadığını nasıl bilebiliriz? Tabii ki, yazarın bakış açısından, kod okunabilir ve bakımı yapılabilir, çünkü yazar başlangıçta yazdı ve düzenledi. Ancak, mesleğimizin kodu ölçebildiği objektif ve ölçülebilir bir standart olmalıdır.

Bu hedefler , asıl yazarın uzman tavsiyesi olmadan kodla aşağıdakileri yapabileceği zaman gerçekleştirilir :

  • Kodu okumak ve temel düzeyde bir mantık akışını anlamak mümkündür.

  • Girdileri, çıktıları ve algoritmaları içermek üzere kodun ne yaptığını daha derin bir seviyede anlamak mümkündür.

  • Diğer geliştiriciler, orijinal kodda hata düzeltmeleri veya yeniden düzenleme gibi anlamlı değişiklikler yapabilir.

  • Orijinal koddan yararlanan bir sınıf veya modül gibi yeni bir kod yazılabilir.

Kod kalitesini nasıl okunur, okunabilir, anlaşılabilir ve bakımı yapılabilir şekilde nasıl ölçebiliriz?


154
Zorunlu link (bir kez xkcd'ye değil ): osnews.com/images/comics/wtfm.jpg
Jerry Coffin

3
Gördüğünüzde bunu bildiğinizi açıkça söyleyebilirim ama bu argüman temelde kusurlu ve orijinal biçiminde bile olsa, kaynak koduna aldırmadı.
Konrad Rudolph

6
"Tabii ki bakış açına göre kodun okunabilir" - bu çok açık değil!
UncleZeiv

24
Yazdıktan birkaç ay sonra gördüğünüzde bildiğinizi söyleyebilirim.
JeffO

2
@ asfallows: Eşime bazı kodlar gösterdim ve çok kötü bir kod olduğunu düşündü, çünkü okuyabilirdi! (İçinde çok fazla İngilizce görünümlü kelime var ve yeterli değil @ [! ^ $ & *) Karakter ...)
gnasher729

Yanıtlar:


370

Arkadaşınız kodu inceledikten sonra size bildirir.

Bunu kendiniz belirleyemezsiniz çünkü yazar olarak, kodun kendisinin söylediğinden daha fazlasını biliyorsunuzdur. Bir bilgisayar size, bir resmin sanat olup olmadığını söyleyememesinin aynı sebepleriyle söyleyemez. Bu nedenle, yazdıklarınıza bakmak ve onun fikrini vermek için başka bir insana - yazılımı koruyabilene - ihtiyacınız var. Söz konusu sürecin resmi adı meslektaş incelemesidir .


6
Hiçbir şey deneysel testi geçemez.
Dünya Mühendisi

25
+1 En önemli kitleniz, üzerinde çalıştığınız sorunun nedenini ve nasıl olduğunu ve çözümlerini bilen, sizinle birlikte yaşayan akranlarınızdır. İyi kod, meslektaş grubunuzun bu konudaki mevcut anlayışını yansıtır. Takımın yetenekli, düşünceli ve yeni fikirlere açık olduğunu varsayarsak, "akranınız size iyi / iyi anlaşılabilir olduğunu söylüyor" benim deneyimime göre, diğerlerinden daha iyi bir tanımdır.
Doug T.

69
Tecrübelerime göre, bu sadece meslektaşınız neyin iyi neyin kötü olduğunu bildiğinde işe yarar. Aksi halde şöyle bir ses çıkacaktır: "Bu kodu aynı yöntemle yazmalısınız, kodu bulmak daha kolay olur"
Rangi Lin

12
@RangiLin, meslektaşın haklı olabilir.

11
@Rangi Sahip olduğunuz meslektaşlarınızla çalışmak zorundasınız. Kodunuzu zor buluyorlarsa, kodunuzla ilgili bir sorun var. Uzun vadede, onları eğitebilir ya da daha iyi meslektaşlar edinmeye çalışabilirsiniz (harekete geçebilir ya da işe alım sürecini etkileyebilirsiniz)… Oh evet ve her zaman haklı olduklarını hatırlar.
Mark

220

Bazen, bilmenin en iyi yolu, altı ay önce yazdığınız koda geri dönüp ne yapmak için yazıldığını anlamaktır.

Çabuk anlarsanız - okunabilir.


28
Evet, bu kulağa hoş geliyor (ve doğru), ancak bugün ne yapılacağına karar vermek için çok iyi bir yaklaşım değil ...
Michael Durrant

10
Diseksiyonu uzun
sürdüğünü

3
İlk ziyaret için bir ay veya daha az bir süre için tekrar ziyaretler için zaman dilimini bırakabilirim. Proje ve alanın karmaşıklığına ve zihinsel yaklaşımınıza bağlı olduğunu düşünüyorum. Altı ay içinde, gerçek okunabilirlik yerine kodu ilk yazdığımdan beri öğrendiğim araçları veya teknikleri kullanarak yeniden düzenleme veya optimizasyon fırsatlarını gördüğümde dikkatimi dağıtıyor.
Chris Bye

1
@MichaelDurrant Eski kodu her gözden geçirdiğinizde, farklı şekilde yazılması gereken parçaları bulacaksınız ve daha sonra "bugün" yazdığınız kodu hesaba katarsınız. Evet, iyi kod yazmayı öğrenmek zaman alır.
dj18

1
@MichaelDurrant hala öyle, çünkü altı ay önce ne yaptığınız belirsiz şeyleri öğrenebiliyorsunuz ve bugün bunları yapmıyorsunuz.
djechlin

94

Bu:

  1. eğer korunabiliyorsa , bakımı yapılabilir .
  2. sizden yardım istemeden bir başkası tarafından bakımı yapılabilirse kolayca bakım yapılabilir
  3. Başkası , okuduğunda tasarımı, düzeni ve amacı doğru anlıyorsa okunabilir

1. için gerçek bir test ( Alex’in Paris’te ve quant_dev’de söylediği gibi) birkaç ay sonra başka bir şey yaptıktan sonra tekrar alabilirsin.

2. ve 3. testler, bir başkasının onu alabileceği ve tasarımınızın tahılı takip ederken kodunuzun nasıl genişletileceği veya düzeltileceğidir. Eğer tasarımı anlayamıyorlarsa, problem alanıyla nasıl ilişkili olduğunu veya kodunuzun nasıl kullanılmasını istediğini anlarlarsa, bunun yerine tahıl üzerinde bir çözüm bulurlar.

Temel kurallar, ilkeler (yani birisinin güzel bir şekilde yazdığı ve bir isim verdiği genel kurallar) ve sizi doğru yöne ya da genel tuzaklardan uzak tutabilecek her türlü öneri vardır. Ancak hiçbiri, istediğiniz özellikleri garanti etmiyor.


2
Bir hatayı düzeltmek veya var olan davranışı bir sürdürülebilirlik faktörü olarak değiştirmek için harcanacak zaman miktarını dikkate almaya ne dersiniz ? Aynı değişikliği yapmak için daha az zaman gerektiren bir kod parçasının daha fazla korunabilir olması gerekir mi?
VCD

1
Bağlı olmak; Bazen bir modifikasyonu iyi yapmak yeniden düzenleme yapılmasını gerektirir (bunun nedeni, okunaklı kodun bu şekilde kullanılmasının amaçlanmadığını açıkça gösterir çünkü), özel bir durumda korsanlıktan daha uzun süren (okunaksız kodun amacı belirsiz olduğu için teşvik eder) ).
İşe yaramaz

30

Kodunuz SOLID ve DRY prensiplerine uygunsa ve çevresinde iyi bir ünite testine sahipse, büyük olasılıkla korunabilir.

Okunabilir mi Oku onu. Yöntem ve değişken isimleri anlamlı mı? Program mantığını problemsiz takip edebilir misiniz? Cevap evetse kod okunabilir.


8
... ve okuduktan sonra okumayı denemek için başkasına ver.
jcmeloni

19
Bu özellikle iyi bir test değil. Bu kuralların birçok uygulaması özneldir ve neredeyse her zaman kendi kodunuzu yazıldıktan hemen sonra okuyabilirsiniz.
DeadMG

1
"Cevabınız evet ise, kod okunabilir" ... sizin tarafınızdan . Başkalarına okunabilir olup olmadığını görmek için başkalarının okumayı denemesi gerekir.

2
IMO, SOLID abartılıyor. Özellikle de 'S.' Bu ya da herkes yanlış yazıyor.
Erik,

DRY ve SOLID olan ve henüz korkunç olan koda sayısız kez rastladım. Aşağıdaki ilkeler, yazdıklarınızın saçma olmadığı konusunda yanlış izlenim verebilir.
Jakub Arnold

24

Sürdürülebilir Olmayan Kod Nasıl Yazılır Okuma - Roedy Green, gülerek ve öğrenerek yaşam için bir iş sağlayın .

... bakımı o kadar zor olan bir kod yazmalı ki, sizden sonra gelen insanlar en basit değişiklikleri bile yapmaları yıllar alacaktır. Dahası, eğer tüm bu kuralları dini olarak takip ederseniz, kendinize ömür boyu sürecek bir iş vermeyi garanti edersiniz, çünkü hiç kimse ama kodu korumayı çok umursamazsınız ...

Deneme, birçok komik örnek kullanarak kötü kod yazmanın sayısız örneğini verir. Global Names'in Özel Olarak Yeniden Kullanılması tekniğinin son derece takdir edilen tekniğinin Creative Miss-spelling , Adların Yeniden Kullanılmasının nasıl kullanıldığını açıklamaya devam ediyor .

Esprili bir şekilde, kompozisyon size okunamayan ve sürdürülemez kodların tüm örneklerinden nasıl kaçınılacağını öğretir.

Aslında, metindeki örneklerle benzerlik gösteren birinin kod yazacağına inanmakta zorlandım. O zaman okuldan yeni çıkmıştım. Ancak birkaç yıl çalıştıktan sonra her gün metinden kod görüyorum…


Ayrıca bakınız waterfall2006.com/gorman.html Refuctoring, kaynak kodlu tasarımı yapılmış bir kod parçasının alınması ve bir dizi küçük, geri dönüşlü değişiklikle, kendiniz dışındaki herkes tarafından tamamen anlaşılmaz hale getirilmesi işlemidir.
Sjoerd

22

Görünüşüne rağmen, düşünebileceğiniz bazı objektif önlemler var. C ++ Kodlama Standartları , Yeniden Düzenleme ve Temiz Kod gibi kitaplar , anlamlı adlar, işlev boyutları, eşleştirme ve uyum ilkeleri, nesne tasarımı, birim testi, ardışık arıtma vb.

Liste, bir kontrol listesine elverişli olmak için çok büyük, ancak kitabı okuyup çalışmak için birkaç önemli şey seçiyorsunuz, ardından birkaç ay sonra daha da geliştirmek için tekrar okuyorsunuz.


4
Artımlı öğrenme için 1 değil mükemmel gecede olmaya çalışıyor
dj18

19

Kanıt, puding içerisindedir. Makul bir uzmanlığa verdikten sonra neler olduğunu izleyin. Kodun zorluğuyla ilgili birçok soru sormaları gerekmiyorsa, iyi bir iş çıkardınız.

Bu kariyerimde erken bir dersti. Bir akıl hocası, "Her şeyi belgeleyin, böylece daha sonra programdan kaçabilirsiniz. Cevaplar zihninizdeyken soruları beklemezseniz, olmadıklarında bunları çözmeniz gerekir."


10
İnsanların cehaletlerini açığa vurma korkusundan dolayı soru sormaktan kaçınabileceklerini unutmayın. Bu insanları, ifşa etmekten kaçınma eğilimleri nedeniyle ilk etapta “makul derecede yetkin” olarak algılıyor olabilirsiniz. Dolayısıyla, ikinizin de içten olduğunuzu bilmediğiniz sürece soru eksikliği iyi bir şey olmayabilir.
Hermann Ingjaldsson,

1
@HermannIngjaldsson - Yeterince adil. Tabii ki yetkin değillerse ve bir şeyler kırılırsa, yakında duyarsınız. "Yardım!!!!"
MathAttack

Bu sadece en iyi cevapta
gnat

17

Tüm cevapları okudum ve kod karmaşıklığından hiç kimsenin bahsetmediğini fark ettim.

Kod karmaşıklığı ile okunabilirlik / bakım kolaylığı arasında sıkı bir ilişki var. Çok sayıda kod karmaşıklığı puanlama algoritması var, ancak ben sadece McCabe karmaşıklığı puanlamasının nasıl çalıştığı hakkında konuşacağım.

Temel olarak, McCabe puanlama kodunuzu okur ve içinde olan benzersiz "yol" sayısını hesaplar. Eğer payınız olarak McCabe kullanıyorsanız ve paydaşınız olarak kod satırları kullanıyorsanız, "okunabilirlik" hakkında oldukça iyi bir yaklaşım elde edersiniz.

10 satır kodunuz varsa ve bu kod boyunca 300 yol varsa, bu oldukça sürdürülemez bir koddur (güvenli ve kolay bir şekilde değiştirilmesi zordur) ve muhtemelen çok okunaklı değildir. Tersine, eğer 300 satırlık kodunuz varsa, ancak içinden sadece 1 yol var (şart yok), hem okunabilir hem de kolayca bakım yapılabilir.

Ancak McCabe'nin yere düştüğü yer bu örnekte. Koşulsuz 300 satır kodum varsa, "kopyala / yapıştır yeniden kullan" işlemi yapma şansım çok iyi ve tabii ki bu da iyi bir şey değil. Bu nedenle, McCabe'ye ek olarak uyguladığınız, yinelenen veya yinelenen kod algılaması gibi, sistem genelinde ölçütler vardır.


2
Cevap bu olmalı. Ölçmek, ölçü,,, tedbir, önlem. Diğer cevaplar gerçeğinden daha fazladır, eğer anlayabilirsem iyi olmalı mı? İlk önce karmaşıklık analizini kullanarak ölçüm yapın, sonra tekrarlamayı aramak için insan refaktörü vb.
Jon Raynor

1
McCabe puanının LOC'ye bölünmesinin sakıncalarından bahseden son paragrafınız tüm fikri geçersiz kılma eğilimindedir. Kodunuzda 300 yola ihtiyacınız varsa , neden dünya üzerinde kodun daha fazla satır kullanmaya daha uygun hale getirileceğini düşünüyorsunuz? Bir kitap karmaşık fikirlere sahipse, açık bir şekilde iletişim kurmaya çalışmaktan çok büyük bir kitap olması gerektiğini söylemek gibi bir şey. -1.
Wildcard,

8

Paylaşacağım bir nokta, kodun "modüller" içerisine yerleştirilmiş olması ve bir modülde bir şeyi değiştirebileceğiniz ve kolayca bütünüyle çalışabileceği anlamına geldiğim demek. İlgisiz şeyler arasındaki etkileri ortadan kaldırır. Ayrıca:

  • Kodun tekrar kullanımı kolaydır
  • Kodunuz esnektir (bu modüllerdeki binalarla bağlantılıdır)
  • KURU - Kendini Tekrarlama

Pragmatik Programcı'yı okumanı şiddetle tavsiye ederim.


8

Bazı Testler / Göstergeler:

  • IDE'yi kapatın. Hala kendi kodunu okuyabilir misin? Bir hata olduğunda, elle takip etmek ve sorunun nerede olduğunu bulmak için hangi sınıfa ihtiyaç duyacağınızı bulmak oldukça kolaydır. Yoksa IDE'yi kullandığınızda hiç zahmet etmiyor ve en başından adım atar mısınız?

  • Hata ayıklama genellikle tek bir hata düzeltme 2 + daha fazla yarattığı bir köstebek oyun haline gelir.

  • Tetikleyici çekmeden, gerçekten yararlı olan bir şeye, kaç yöntem çağrısı alır? Tam olarak aynı veya aynı parametrelerin çoğunu başka bir yöntem çağrısına geçiren kaç yöntem var?

  • Bir sınıfa basit bir yeni yöntem eklemek için kaç tane dosyayı açmanız gerekir?

  • Kabul ettiğiniz kalıpları ve uygulamaları düşünün. Mükemmel bir anlam ifade ettikleri için veya birileri sizi "yapmanın tek yolu" olduğuna ikna ettiği için mi yaptınız? ya da özgeçmişinde istediğin için ya da bazı rockstar dev dediği için.


3
IDE'siz kod okumak, özellikle okunabilirliğin bir ölçüsü olarak, belirsiz görünüyor. Bu metrik türü, Macarca notasyon stili olan ve sonuçta okunabilirliği gerçekten zayıflatan “çözümler” ile sonuçlanır.
rubenvb

8

Oluşturduğu kodun kolayca idare edilebilir ve okunabilir olup olmadığını nasıl bilebiliriz?

Bu özellikleri arayarak bakımı kolay ve okunabilir kodu görebilirsiniz:

  1. Nesneler, yöntemler ve / veya fonksiyonlar her zaman bir şey yapar.
  2. Yöntemler ve / veya fonksiyonlar özlüdür ("kısa fakat kapsamlı" olduğu gibi).
  3. Nesneler, yöntemler ve / veya işlevler esasen adlarına dayanarak yapmaları gerektiğini düşündüğünüz şeyi yapar.
  4. Yeniden kullanım için yazılan kod aslında yeniden kullanılabilir.
  5. Son fakat en az değil, hemen kodu birimsel olarak test edebiliyorsanız, muhtemelen en azından tek sorumluluk, modüler kod yazmış olmalısınız.

Oldukça dağınık ve anlaşılmaz bir kod yazıp yazamadığımızı nasıl bilebiliriz? Dağınık bir yazılım geliştirip geliştirmediğimizi bilmemiz gereken herhangi bir yapı veya kılavuz var mı?

  1. Bir yöntemden okuyorsanız ve amacın ne olduğu belli değilse, bu en iyi ihtimalle inelegant ve en kötü ihtimalle mümkün olmayan bir durumdur.
  2. Basit görünmüyorsa, muhtemelen basit değildir ve bu, yakında sürdürülemez hale gelecek olan sürdürülemez bir kod veya kodun işaretidir.
  3. Kod tabanı boyunca simetri eksikliği (tutarlılık) varsa, büyük olasılıkla sürdürülemez kodlara bakıyorsunuzdur.

Yeniden düzenleme örneğinizin daha net olduğunu kabul etmiyorum. Orjinal kodun çalışması gerektiğine katılıyorum, ancak tamamen açıklık ve iletişim amacıyla niyet olarak orjinalinin çok daha iyi olduğunu düşünüyorum. Regex'i tanıtırken netliği artırdığını iddia eden herhangi bir yeniden düzenlemeden çok şüpheliyim.
Roy

1
@Roy, evet, yeterince adil. Muhtemelen bu kod örneğini asla eklememeliydim. Kabul edildi, neredeyse 3 yıl önceydi, ama o zaman bile, muhtemelen PHP kullanmamalıydım (şimdi bakıyorum) ve bazı insanların sahip olduğu şeylerden biri olduğu için regex kullanmamalıydım. bakabilir ve hemen alabilir ama diğerleri için, ne kadar özlü olursa olsun, regex'ler derhal kapanır. Cevabı düzenleyeceğim ve kod örneğini bırakacağım. Yorumunuz için teşekkürler.
Wil Moore III,

Bir nesne bir şeyi nasıl yapabilir?
Koray Tugay

@KorayTugay Bu şekilde düşünün. Bir nesne tek bir yapışkanlık kavramından daha fazlasını tanımlıyorsa, bir kokunuz olur.
Wil Moore III

6

Tek bir kelimeyle, Tecrübe .

Başlamak için temel çalışmayı koymanız gerekir, bu nedenle programcıların, iyileştirecek programcı cephaneliğinde daha önemli araçlardan bazılarını sağlayacak olan Refactoring gibi kitapları okumak için zaman ayırmaları gerektiğini tavsiye edemiyorum. Alanımızdaki en tanınabilir özelliklerden bazıları tarafından yazılmış ve kodunuzun temiz ve okunabilir olmasını sağlamak için anlamanız gereken hemen hemen her şeyi açıklayan kod tutma beceriniz ve Temiz Kod .

Ancak hiçbir okuma miktarı, zor kazanılmış tecrübenin yerine geçmez. Kod kalitesine dikkatin verebileceği farkı tam olarak anlayabilmek için bir süre kodla çalışmanız gerekir. Temiz, iyi işlenmiş bir kodla çalışmanın zevkini ve aynı zamanda kodlu spagetti ile çalışmanın acısını yaşayarak, bu kitapların yazarlarının size gerçekten ne öğretmeye çalıştığını daha iyi anlamayı öğrenirsiniz, ancak bunu daha geniş bir bağlamda yaparsınız. Yaptığınız şeyin kalitesinin gerçekten önemli olduğu ve günlük olarak kodunuzla kolayca çalışabilme yeteneğinizi etkileyen gerçek canlı üretim kodu.

Ayrıca, kod yazma çabasını yüksek bir standarda koyduğunuzu doğrulamak için iyi bir akıl hocası veya deneyime sahip bir akran sahibi olmanıza yardımcı olur. Bu, kod incelemelerinin bu kadar kullanışlı olmasının bir nedenidir. Kod denetimi ve biçimlendirme araçlarını kullanmak, işlerinizi temiz tutmanızı sağlamak için çok yararlı bir yardımcı olabilir. Ancak hiçbir şey, yıllarca yazılan yazılımlarla kazanılan deneyimle karşılaştırılamaz; öyle ki, kendiniz otomatik olarak temiz, okunaklı ve basit bir şekilde bakım kolaylığı için yapılandırılmış bir kod yazıyorsunuzdur, çünkü bunun için en iyi uygulamaları uygulama alışkanlığı yaptınız. uzun.


3

Pürik olmadan: işlevsel stili tercih edin. Günümüzde çoğu dil (.NET, Ruby, Python, Javascript, vb.) Onu destekliyor ve tanıtıyor (örneğin, LINQ, alt çizgi).

Okuması son derece kolaydır.

var recentTopCustomers = OrderList
    .Where(o => o.Date >= DateTime.Now.AddDays(-5))
    .Where(o => o.Amount > 1000)
    .OrderBy(o => -o.Amount)
    .Take(10)
    .Select(o => o.Customer);

Her düğümü, amacın netliğine tek odaklanmış bir niyet borç vermeye sahip olmaya zorlar. Ve her ayrık görevin dışarı fırlatılması, düğümlerin takılması ve düğümlerin farklı işlemlere yeniden düzenlenmesi nedeniyle izole edilmesi önemsizdir. Bu bakım kolaylığı sağlar.


2

Okunabilir ve bakımı kolay kod: İlk bakışta bir programcının kolayca görebilecek kadar iyi anlayabildiği kod :

  • arayüzü üzerinden tekrar kullanmak, veya
  • hata ayıkla veya
  • davranışını değiştir. (bir özellik ekle / kaldır) veya
  • optimize et
  • Dene

Bu 'berraklığa' kadar kaynıyor. Örneğin, programcı beklenmedik yan etkilere neden olmadan mevcut işi başarmak için 'neyin iyi yaptığını anladıklarından' emin olduklarından önce, belirli bir kod parçasını sormak zorunda kalmadan kaç soru sormak zorundadır.

'Kod Tamamlandı, Steve McConnell' adlı kitap bu konuya ayrıntılı bir şekilde giriyor.

Kodun iyi olup olmadığını belirlemek için kullanabileceğiniz çeşitli ölçümlerden geçer.

Burada bir örneğe bakın: http://books.google.co.uk/books?id=3JfE7TGUwvgC&lpg=PT376&pg=PT389#v=onepage&q&f=false


bu, önceki cevaplarda yapılmış ve açıklanmış noktalar üzerinde önemli bir şey ekliyor gibi görünmüyor
gnat

Sanırım, eklediği en önemli şeylerden biri, daha önce yanıt vermemiş olan Code Complete'e referans olduğunu düşünüyorum. Bu kitap okunabilir ve korunabilir kod yazmaya odaklanan en önemli ve etkili kitaplardan biridir. Bu kitabı okuyan hiç kimsenin "Okunabilir ve kolayca bakımı yapılabilir bir kod yazıp yazmadığını nasıl bilebilirsin?" Diye sorması gerekmez.
JW01

... bu yüzden, bence, eğer gerçekten bakılabilir kod yazmakla ilgileniyorlarsa, herkesin alabileceği en iyi şeyin bu kitabı okumak olduğuna inanıyorum. Bu nedenle, birkaç dakikalık dikkatli düşünce ile (ki bu SO moderatörlerine göre çoğu zaman birkaç dakika daha fazla düşüncedir), bence bu sadece OP'nin sorusuna yeterli bir cevap değil , en iyisidir .
JW01

2

Yan etkileri en aza indirin (ideal olarak hiçbiri yoktur)

Kendi kapsamı dışındaki durumlarda 3 değişikliğe neden olan bir işlev, yalnızca bir şeyi girip çıkaran ve başka bir şey çıkaran birinden daha fazla mantıklı olmak ve sürdürmek için daha zordur. İşlevin ne yaptığını bilemezsiniz, ne yaptığını ve bunun diğer tüm ilgili işlevleri nasıl etkilediğini hatırlamanız gerekir.

OOP için yan etkileri en aza indirmek aynı zamanda daha az üyeli ve özellikle de sınıfın durumunu değiştirebilen daha az üye olan sınıflar anlamına gelir, çünkü üye işlevler kendi başlarının ötesindeki durumları değiştirebilir ve yan etkilere sahip olabilir (örneğin sınıfın içini değiştirebilirler). Ayrıca, kendileri için daha az veri üyesi olan sınıflar anlamına gelir, böylece bu yöntemlerin tahrif edilmesi için daha az durum ve neden olabilecekleri daha az yan etki söz konusudur.

Basit bir örnek olarak, sortedikili ya da doğrusal arama yapıp yapmamayı belirlemek için kullandığı bir durumu koruyabilecek süslü bir veri yapısı tasarlamaya çalıştığınızı hayal edin . Böyle bir durumda, tasarımı iki sınıfa ayırmak faydalı olabilir. sortedSıralanmamış sınıfa çağrı yapmak , içeriğini daima düzenli tutan başka bir sınıfın veri yapısını döndürür. Artık daha az yan etkiye sahipsiniz (bu nedenle daha az hata eğilimli ve kodları anlamak daha kolay) ve daha yaygın olarak uygulanabilir kod (eski tasarım, hem sıralanmasına gerek olmayan küçük diziler için hem işleme hem de insan entelektüel verimliliğine zarar verecekti).

Gereksiz Dış Bağımlılıklardan Kaçının

Nispeten basit bir görevi gerçekleştirmek için 13 farklı kütüphaneyi kullanarak, maksimum kod kullanımıyla hayal edilebilecek en kısa kodları uygulayabilirsiniz. Bununla birlikte, bu, entelektüel ek yükü okurlarınıza daha sonra 13 farklı kütüphanenin en azından bir kısmını anlamalarını sağlayarak aktarır. Bu doğal karmaşıklık, bir düzine başka kütüphanenin çalışmasını ve oluşturulmasını gerektiren bir üçüncü taraf kütüphanesini inşa etmeye ve anlamaya çalışan herkes tarafından hemen takdir edilmelidir.

Bu muhtemelen çok tartışmalı bir bakış açısıdır, ancak nihai sonucun iyi bir şekilde test edilmesi şartıyla, karşı uçta mütevazı bir kod çoğaltmayı tercih ederim (defalarca çoğaltılmış test edilmemiş hatalı koddan daha kötü bir şey yoktur). Seçim, bir vektör çapraz ürününü hesaplamak veya sadece 3 satır kodunu kaldırmak için epik bir matematik kütüphanesini çekmek için 3 satırlı kopyalanmış kod arasındaysa, tüm ekibiniz bu matematik kütüphanesinde bulunmadığı sürece, ilkini öneririm. Bu noktada, ayrıştırma avantajları karşılığında yeterince önemsizse, 1 yerine sadece 3 satır kod yazmayı düşünebilirsiniz.

Kod tekrar kullanımı dengeleyici bir eylemdir. Çok fazla yeniden kullanın ve entelektüel karmaşıklığı, bir veya çok daha fazla şekilde aktarın, çünkü yukarıda kaydettiğiniz bu 3 basit kod satırında, okuyucuların ve bakıcıların 3 kod satırından çok daha fazla bilgi anlamalarını isteme pahasına gelir. . Ayrıca, kodunuzu daha az kararlı hale getirir, çünkü matematik kitaplığı değişirse, kodunuz da değişebilir. Yeniden kullanımın çok az olması ve entelektüel ek yükü çarpmanızın yanı sıra, kodunuzun merkezi iyileştirmelerden yararlanmak için sona ermesidir, bu nedenle dengeleyici bir eylemdir, ancak dengeleyici bir eylem olduğu fikri her küçük mütevazı kopyalamanın önünü kesmeye çalıştığından bahsetmeye değerdir. sonuçta, diğer uçtan daha fazla olmasa da bakımı zor olan bir sonuç elde edilir.

Zırvalamayı Test Et

Bu verilen bir kuraldır, ancak kodunuz tüm giriş durumlarını ele almıyorsa ve bazı son durumları özlüyorsa, başkalarının, gözlerine ve ellerine aktarılmadan hemen önce bile alamadığınızı yazdığı kodu korumasını nasıl beklersiniz? Her şeyden önce hiç doğru olmayan kodlar yerine, mükemmel çalışan kodda değişiklik yapmak yeterince zor.

Bunun ötesinde, kapsamlı testlerden geçen kod genellikle daha az değişiklik yapmak için nedenler bulacaktır. Bu, bakımdan daha fazla elde etmek için daha fazla kutsal bir kâseye sahip olan stabilite ile ilgilidir, çünkü hiçbir zaman değiştirilmesi gerekmeyen kararlı kod hiçbir bakım maliyeti gerektirmez.

Arayüz Dokümantasyonu

Her ikisini de belgelemek için eşit zaman ayıramazsanız, "ne işlerinin" üzerinde "işlerin nasıl yapıldığını" önceliklendirin. Tüm olası girdi vakalarında ne yapacağına (ya da en azından ne yapması gerektiğine) yönelik niyetlerinde açık olan net bir arayüz, sadece nasıl yapıldığını anlamada rehberlik edecek olan kendi uygulamasına bir bağlam açıklığı getirecektir. Kodu kullanmak için değil, aynı zamanda nasıl çalıştığını.

Bu arada, insanların ne yapması gerektiğini bile bilmediği bu niteliklerden yoksun olan kod, uygulama detaylarının ne kadar iyi belgelendirildiğine bakılmaksızın SOL. Kaynak kodun nasıl uygulandığına dair 20 sayfalık bir el kitabı, ilk etapta nasıl kullanılması gerektiğini ve tüm olası senaryolarda ne yapması gerektiğini bile bulamayan insanlar için değersizdir.

Uygulama tarafı için, diğerlerinden farklı yaptıklarınızı belgelemeye öncelik verin. Örnek olarak, Intel, ışın çekirdeği çekirdekleri için sınırlayıcı bir hacim hiyerarşisine sahiptir. Bu alanda çalıştığım için, kodlarının bir bakışta, belgelere göz atmadan ne yaptıklarının bir kısmını tanıyabilirim. Ancak, BVH'yi geçme ve ışın paketlerini kullanarak paralel olarak kesişme yapma fikri olan benzersiz bir şey yaparlar . Bu onların belgelerine öncelik vermelerini istediğim yer çünkü kodun bu kısımları çoğu tarihi BVH uygulamasında egzotik ve sıradışı.

Okunabilirlik

Bu kısım çok öznel. İnsan düşünce süreçlerine yakın bir türün okunabilirliğini pek umursamıyorum. Yazarın bir sorunu çözmek için tuhaf ve kıvrımlı düşünce süreçleri kullanması durumunda, en üst düzeydeki şeyleri açıklayan en iyi belgelenmiş kodun izlenmesi benim için hala zor. Bu arada, 2 veya 3 karakter ismi kullanan kısa ve öz kodlar mantığın çok basit olup olmadığını anlamak için daha kolay olabilir. Sanırım, başkalarının neyi tercih ettiğini gözden geçirip, görebileceksiniz.

Çoğunlukla sürdürülebilirlik ve daha da önemlisi istikrarla ilgileniyorum. Değişim için sebep bulamayan kod, bakım masrafları sıfır olan koddur.


1

Bilmenin bir yolunun, yeni ekip üyelerinin kodu alıp almadıklarını, anlayabileceklerini ve hataları düzeltmek / yeni gereksinimleri göreceli kolaylıkla karşılamak için değiştirip değiştiremeyeceklerini söyleyebilirim.


1

İşte kullanmaktan hoşlandığım bir teknik:

Kodu, akran programlayıcılarınızdan birine gösterin ve ne yaptığını size açıklamasını sağlayın. Bunlara dikkat et.

1) Eğer bir kod bloğu refaktörünün amacını kolayca açıklayamazlarsa.
2) Geçerli bölümü anlamak için başka bir kod bölümüne atlamak zorunda kalırlarsa, yeniden uygulayın.
4) İşlem sırasında konuşmak istediğinizi hissettiğinizde, kodun bu bölümünün yeniden yapılandırılması gerekir. (Kod kendisi için konuşmuyor).


Akran programcısının, en azından eşit derecede deneyimli olduğunu ve programlama dili ve deyimlerinde okunduğunu varsayar. Bunların hepsi çoğu zaman bunun gibi teknikler, insanların en küçük ekip üyelerine bile int anlaşılır hale getirmek için yanlış bir girişimle dilin açıklığının bir alt kümesinde kod yazmasına neden olabilir. Sonuç, dilin aptalca bir alt kümesinde daha büyük bir kod kütlesidir. Dil alt kümesini ne kadar aşağıya salıverirseniz sürün, 500KLOC küçük dil altkümesi kodu, her zaman daha etkileyici bir altkümeyi kullanan 200KLOC kodundan daha iyi çalışır.
user1703394

Bu sadece en iyi cevapta
gnat

-1

En korunabilir kod, orada olmayan koddur. Bu yüzden, LOC sayımına eklemek yerine, LOC sayımını 'azaltan' yeni kod (izolasyona bakıldığında biraz daha az bakım yapılsa bile), toplam kod tabanını, sadece boyutunu küçülterek daha sürdürülebilir hale getirebilir. Bu nedenle, korunabilir kod için birincil kural:

  • DRY'yi maksimize et.

İkincisi, korunabilirlik için gizli bağımlılıklardan daha kötü bir şey yoktur. Yani kural 2 için:

  • Tüm bağımlılıklarınızı açık yapın.

Üçüncüsü, programcıların tümü, daha gelişmiş teknik dil özellikleri veya deyimler kullanarak bakım veya yazma konusunda eşit derecede yetenekli değildir. Tüm kod tabanını azaltmak, büyüklüğü nedeniyle bakımı zor olan büyük bir kod tabanına sahip olacaktır. Kod boyunca gelişmiş teknik özelliklere ve deyimlere izin vermek, tüm kodun yalnızca üst düzey geliştiriciler tarafından ne kadar kötü olduğunu da koruyacaktır. Sürdürülebilirliğin anahtarı beceri düzeyine dayalı katmanlamadır Örneğin:

Projeler arası kütüphaneler: kıdemli geliştiriciler, püf noktaları / deyim / tekniklerle dolu projeye özel kütüphaneler ve sistem arka uçları: medior geliştiricileri, en gelişmiş ve açıklanması zor olanlardan kaçınır. Büyükler, DRY geliştirme fırsatlarını arayan bu koddan geçecektir.

Front-end: junior devs, katı bir stil rehberi ve kaçınmak için dil yapıları ve deyimler teknikleri setini kullanın. Medior devs, DRY fırsatlarını ve gizli iş mantığını arayan bu kodda ilerleyecektir.

Yani kural 3 için:

  • Kodunuzu geliştirici beceri düzeyine göre sıralayın ve uygun şekilde kod yazabilirsiniz.

ben


1
Bu, önceki 25
cevapta

@gnat, diğer cevaplarda birçok (potansiyel olarak zararlı) aşırı basitleştirmeye 'nüans' eklemeyi umuyordum. Özellikle 3.
puanla

1
@ user1703394 bu soru ve cevapları topluluk wiki'dir. Var olan bir cevabın iyileştirilebileceğini düşünüyorsanız, "diğer kullanıcıların gönderilerini düzenle" ayrıcalığı olmadan bile düzenleyebilirsiniz.

-2

Kolay okunabilir ve kolayca bakımı yapılabilir bir kod yazmaya çalışmak hiç kolay değildir, ancak kolay ve bakımı kolay bir kod yazmak zor değildir.

OOAD dört harfli bir kelimedir ancak tek seferde anlamak zordur - nesne yönelimli Analiz ve Tasarımı izleyin

  1. Her zaman iyi bir gereksinim toplanması ve tam bir Sorun ifadesiyle başlayın

    • birkaç kullanım durumuyla başlar; Sistem kullanıcısı diyalog etkileşimi
  2. Nesnelerinizi gevşek bir şekilde birleştirilmiş halde tutmanız ve kodunuzun tekrarlamayacağından emin olmanız gerekir - DRY'yi izleyin [Kendinizi tekrarlama]

    • Bir kopya gördüğünüzde, kapsüllenecek bir yer arayın.
  3. kodunuz uzatma için açık ve değişiklik için kapalı - OCP [Açık-kapalı prensibi]
  4. Kodunuzu değiştirdiğinizde daima hatırlayın - Sorunları çözmek için sorun yaratmayın, BT sadece mevcut işlevselliğinizi değiştirmediğini belirtir
  5. Birim kodunuzu test edin
    • her şey ters gittiğinde kodunuzu daima test edin
  6. İşlevsellik üzerinde çalışırken, uygulamanızın baştan beri iyi tasarlanmış olduğundan emin olmak için her zaman temel OOP (nesne yönelimli prensipler) ve teknikleri takip etmeyi unutmayın.
    • Nesneler adının gösterdiğini yapmalı
    • Her nesne tek bir kavramı temsil etmelidir
  7. Her zaman sistemin sorun bildirimini ve hangi bağlamda / etki alanı yazılımının çalıştığını unutmayın.
  8. Biraz da kağıt işi yap - evet bu benim için işe yarıyor
    • UI ile ilgili bazı çıktılar ve UML şemaları her zaman çalışır
    • beyin fırtınası seansının ekran görüntülerini Beyaz tahtadan da alabilirsiniz
  9. Mimari düzenler
  10. Mümkünse tasarım ilkelerini uygulayın
  11. belgeleme
    • daima kodunuzu belgeleyin
    • IDE'de girinti ayarlayın ve bunu da belgeleyin

1
Bu, cevap vermeyen bir teoridir; kod kalitesini nasıl ölçebiliriz veya ölçebiliriz ki böylece okunabilir, anlaşılabilir ve bakımı yapılabilir mi? soru
Jan Doggen

Kabul !! Ancak yukarıda belirtilen ilkeleri izlersek, kod kalitesini ölçmek kolaydır, okunabilir, anlaşılabilir ve açık bir şekilde bakımı yapılabilir. Yanlışsam düzelt.
Narender Parmar

Cevabımın neden indirildiğini bilmiyorum, ben bile zaten en önemli hususları ele aldım
Narender Parmar
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.