Kod incelemelerinde, gözden geçirici her zaman sorunlar için bir çözüm sunmalı mı? [kapalı]


93

Kodları incelerken, normal olarak sorunların nasıl çözüleceği konusunda özel önerilerde bulunmaya çalışırım. Ancak gözden geçirmek için harcayabileceğiniz sınırlı süre nedeniyle, bu her zaman iyi sonuç vermez. Bu durumlarda geliştirici bir çözüm bulursa daha verimli buluyorum.

Bugün bazı kodları inceledim ve bir sınıfın açıkça iyi tasarlanmadığını gördüm. Yalnızca belirli nesnelere atanan ve diğerleri için boş bırakılan bir dizi isteğe bağlı özelliği vardı. Bunu çözmenin standart yolu sınıfı ikiye bölmek ve miras almaktır. Ancak bu özel durumda, bu çözüm işleri aşırı karmaşık hale getirdi. Bu yazılımın geliştirilmesine kendim dahil değildim ve tüm modüllere aşina değilim. Bu yüzden belirli bir karar verebilecek kadar bilgili hissetmedim.

Birçok kez yaşadığım bir başka tipik durum da açıkça anlamsız ve hatta yanıltıcı bir işlev, sınıf veya değişken isim bulmam ama kendimle iyi bir isim bulmam.

Genel olarak, bir eleştirmen olarak, "bu kod hatalı çünkü ..., farklı mı?" Demek için bir sorun mu var yoksa özel bir çözüm bulman gerekiyor mu?



24
@gnat: Hayır, kod çok karmaşık değil. Ve bu sadece bir örnek. Genel olarak, gözden geçirenin bir çözüm sunmaktan sorumlu olup olmadığını soruyorum.
Frank Puffer

5
hayır, bir gözden geçiren olarak onu nasıl geliştireceğinizi söylemek zorunda olmadığınızı söyleyebilirim. Orada neyin yanlış hissettirdiğini açıklayabilirseniz, yapın; değilse - sadece genel bir yorum yapın. (Aldığımı hatırladığım en faydalı yorumlardan biri, kelimenin tam anlamıyla "bu sınıf toplam çöp" gibidir)
gnat

5
"Bunu çözmenin standart yolu, sınıfı bölmek ve kalıtımı kullanmaktır." Umarım kodumu gözden geçirmiyorsundur!
gardenhead

7
Potansiyel sorunların tespit edilmesi yeterli olabilir. Gözden geçiren kişi koda bir kullanıcı, bakıcı veya tasarımcı olarak bakar. Farklı bir açılı görünüş sağlamak veya sorunları tespit etmek, kodlayıcının henüz farketmemiş olabileceğini, kod çözücünün çalışmasını geliştirmesine yardımcı olabilir. Hoşunuza giden bir şeyi fark ederseniz, bunu bildirmenin de zararı olmaz. Düzeltici bir alıştırma değil, aydınlatıcı bir tatbikat olmalıdır. Bu nedenle “akran değerlendirmesi” olarak adlandırılır.
Martin Maat

Yanıtlar:


139

Gözden geçiren kişi olarak, işiniz inceleme öncesinde kararlaştırılmış olan belirli hedeflere uyup uymadığını kontrol etmektir.

Bu hedeflerden bazıları, amacın yerine getirilip getirilmediğine dair genellikle bir karar çağrısını içerecektir. Örneğin, kodun korunabilir olması gerektiği hedefi tipik olarak bir karar çağrısı gerektirir.

Gözden geçiren kişi olarak, hedeflere ulaşılmadığını belirtmek sizin işinizdir ve çalışmalarının gerçekte hedeflerine uygun olduğundan emin olmak yazarın işidir. Bu şekilde, düzeltmelerin nasıl yapılması gerektiğini söylemek sizin işiniz değildir.

Öte yandan, sadece yazara “bu kusurlu. Düzelt” diyerek takımda olumlu bir atmosfere yol açmaz. Olumlu bir atmosfer için, en azından gözlerinizde neden bir şeylerin kusurlu olduğunu belirtmek ve eğer varsa bir tane daha iyi bir alternatif sunmak iyidir.
Bunun yanı sıra, "yanlış" görünen bir şeyi gözden geçiriyorsanız, ancak gerçekten daha iyi bir alternatifiniz yoksa, "Bu kod / tasarım benimle iyi uyuşmuyor," açık bir alternatifi yok. Bunu tartışabilir miyiz? " ve sonra birlikte daha iyi bir şeyler elde etmeye çalışın.


23
Tartışma için birlikte bir çözüm bulmak için + 1
kodumu

19
+1. Geri bildirim verirken, mümkün olduğunda yapıcı eleştiriler vermek en iyisidir .
SinirliFormsDesigner ile

7
Özellikle son parçaya katılıyorum. "Bu çözüm yanlış hissettiriyor çünkü ..." veya "Bu bölümün sorunlu olabileceğinden endişeleniyorum çünkü ..." demek kesinlikle doğru değil.
Daniel T.

1
@dotancohen: "Bunu tartışabilir miyiz" bir soru olarak düşünülmüştü. Şahsen, kendim bir şeyler öğrenmek olsa bile, tartışmayı yine de yapardım.
Bart van Ingen Schenau

1
İnce tehlike, yeterince tartışma ve uygulama iletişimiyle birlikte, bu bir inceleme olmayı bırakıp ikili programlama haline gelir. İkili programlama iyi fakat bir kez yapıldığında bağımsızlık kaybolduğu için gözden geçirmeniz için 3. bir kişiye ihtiyacınız var.
candied_orange

35

Burada bazı iyi cevaplar, ancak bence önemli bir nokta eksik. Kodunu incelediğiniz, o kişinin ne kadar deneyimli olduğu ve bu önerileri nasıl ele aldığı büyük bir fark yaratıyor. Takım arkadaşınızı iyi tanıyorsanız ve "bu kod hatalı olduğu için ..., farklı şekilde yapın" gibi bir not beklerseniz, daha iyi bir çözüm bulması yeterli olacaktır, o zaman böyle bir yorum iyi olabilir. Ancak, kesinlikle böyle bir yorumun yeterli olmadığı ve kodlarının nasıl iyileştirileceğinin tam olarak söylenmesi gereken kişiler var. Yani IMHO bu, sadece bireysel dava için yapabileceğiniz bir yargı çağrısıdır.


29

Genel olarak, bir eleştirmen olarak, "bu kod hatalı, farklı mı?" Demek için sorun yok mu, yoksa belirli bir çözüm bulmanız gerekiyor mu?

İkisinden hiçbiri ideal IMO değil. Yapılacak en iyi şey, yazarla konuşmak ve sorunu işbirliği içinde düzeltmektir.

Kod incelemelerinin zaman uyumsuz olması gerekmez. Bunları bürokratik bir süreç olarak görmeyi bırakıp canlı iletişim için biraz zaman ayırırsanız, birçok sorun ortaya çıkar.


"Bürokratik süreç" onu koymak için çok iyi bir yoldur!
17:17

17

Kod incelemelerinde, gözden geçirici her zaman sorunlar için bir çözüm sunmalı mı?

Hayır. Eğer bir inceleme yapmıyorsanız, bir sonraki kodlayıcı sizsiniz.

Kod incelemelerinde, gözden geçiren konular için asla bir çözüm sunmamalı mı?

Hayır. İşiniz konuyu elinizde iletmektir. Bir çözüm sunmak sorunu açıklığa kavuşturursa, o zaman yapın. Sadece çözümünüzü takip etmemi beklemeyin. Burada yapabileceğin tek şey bir şey ifade etmek. Uygulamayı dikte edemezsiniz.

Bir gözden geçiren konular için ne zaman bir çözüm sunmalıdır?

Bu iletişim kurmanın en etkili yolu. Biz İngilizler değil, kod maymunlarız. Bazen kodun berbat olduğunu göstermenin en iyi yolu ... optimalden daha azdır ... onlara daha az berbat kod göstermektir ... daha çok tercih edilir ... ah ne demek istediğimi biliyorsun.


8
Vakumda kodlama yapmayın, çünkü berbat.

Hm. Bir soruna bir çözüm önerdiğimde, genellikle farkında olduğum ancak hepsinin ayrıntılı bir listesini vermek için çok uzun sürecek olan faydaları vardır. (Bunlar genellikle istikrarla ilgilidir ve etrafındaki diğer şeyleri değiştirirken işin çalışmaya devam edeceğinden emin olmakla ilgilidir.) Yani, birçok sorunu çözmeyen başka bir şey yaparsanız, tam olarak mutlu olmazdım (en azından) Bana önerdiklerimin işe yaramadığına dair iyi bir neden söylemediğiniz sürece hayır Bununla nasıl başa çıkardın?
jpmc26

1
Not: "Kod maymunu" genellikle kötü bir fikir olsa ve iyi tasarım duyarlılığına sahip olmasa bile söyleneni yapan, vasıfsız, düşüncesiz bir programcı tanımlamak için kullanılır. Urban sözlüğüne bakınız . Wikipedia bile bazen aşağılayıcı olduğunu söylüyor.
jpmc26

@ jpmc26 Benimle iletişim kurmak için kod kullanacaksanız, o zaman sorunun nasıl daha iyi çözülebileceğini gösteren bir kod kullanırsınız umarım. Ayrıca, Kod Maymun sevgi ile kullanılabilir. İngiliz ana dallarından kesinlikle daha fazla sevgi
candied_orange

"Kod maymunu kalk ayağa kalktı. Kod maymunu işe gitti. Kod maymunu sıkıcı bir araya geldi, sıkıcı menajeri Rob. Rob, kod maymunu çok çalışkandı, ancak çıktısı kokuyor ..."
Baldrickk

13

Asıl mesele, eğer insanlar kodu nasıl daha iyi yazacaklarını bilselerdi, genellikle bunu ilk başlarda yaparlardı. Bir eleştirinin yeterince belirgin olup olmadığı yazarın deneyimine çok bağlıdır. Çok deneyimli programcılar "bu sınıf çok karmaşık" gibi bir eleştiri alabilir ve çizim tahtasına geri dönüp daha iyi bir şeyler bulabilirler, çünkü baş ağrıları nedeniyle kapalı bir gün geçirdiler veya özensiz oldukları için telaş içerisinde.

Genellikle, yine de, en azından komplikasyonun kaynağını tanımlamanız gerekir. Diyerek şöyle devam etti: "Bu sınıf çok karmaşık çünkü her yerinden Demeter Yasasını çiğniyor." "Bu sınıf sunum katmanını ve kalıcılık katman sorumluluklarını birleştiriyor." Bu nedenleri belirlemeyi ve bunları kısaca açık bir şekilde açıklamayı öğrenmek, daha iyi bir gözden geçiren olmanın bir parçasıdır. Çözümler hakkında çok fazla ayrıntıya girmek zorunda kalmazsınız.


4
+100 Kod İncelemelerdeki en yaygın hayal kırıklığım, daha iyi bir yol bilseydim, muhtemelen bu şekilde yazmış olacağım.
RubberDuck

İlk cümlenizi seviyorum. Kendime sormayı düşünmemi sağladı: "Bu kod yeterince iyi mi?" daha sonra, onu iyileştirip iyileştirmeyeceğine karar vermek için yazı tura atmak! (Normalde, sadece

IMO "Bu kod karmaşık çünkü Demeter Yasasını ihlal ediyor" kötü bir yorum. "Bu kod karmaşık, çünkü X, Y ve Z'ye çok bağlı" daha iyi.
immibis

"Eğer insanlar kodu nasıl daha iyi yazacaklarını bilselerdi, genellikle ilk başta yaparlardı". İstisnalar var. Bu kodu bu tür çalışmalar yaptım ancak ileride bir zamanlar bizi kıçımızdan sokacağız. Teknik olmayan yönetici "Bu kodu sevmiyorum ve geliştirmek için üç gün istiyorum" anlamıyor. Teknik olmayan yönetici "Joe bu kodu gözden geçirdi ve reddetti ve geliştirmek için üç güne ihtiyacım var" diye anlıyor.
gnasher729

4

İki tür kötü programcı vardır: standart uygulamaları takip etmeyenler ve "sadece" standart uygulamaları takip edenler.

Sınırlı iş bağlantım olduğunda / birine geri bildirimde bulunduğumda, "Bu kötü bir tasarım" demezdim. ama "Bu sınıfı bana açıklayabilir misiniz?" Bunun iyi bir çözüm olduğunu keşfedebilirsiniz, dev, elinden gelenin en iyisini yaptığını, hatta bunun kötü bir çözüm olduğunu kabul etmesini sağladı, ama yeterince iyi.

Cevabınıza bağlı olarak, her duruma ve kişiye nasıl yaklaşılacağı konusunda daha iyi bir fikriniz olacak. Sorunu hızla tanıyabilir ve düzeltmeyi kendi başlarına keşfedebilirler. Yardım isteyebilirler veya sadece kendi başlarına gidip çözmeye çalışacaklar.

İşimizde önerilen uygulamalar var, ancak neredeyse hepsinin istisnaları var. Projeyi ve ekibin ona nasıl yaklaştığını anlarsanız, kod incelemesinin amacını ve endişeleri nasıl gidereceğinizi belirleme bağlamı bu olabilir.

Bunun, probleme açık bir çözümden çok bir yaklaşım olduğunun farkındayım. Tüm durumları kapsayacak kadar fazla değişkenlik olacak.


1
Ancak, tanınabilir bir şekilde iyi bir tasarımın açıklanması gerekiyorsa, satır içi yorumlar eksiktir.
Wildcard

1
Bazen kuralların istisnaları yoktur, ancak genellikle değildir.

@Wildcard - bu, ona bakarak insanların yetenek ve tercihlerine / görüşlerine bağlıdır.
JeffO

1
@Wildcard Geri bildirimin bir soru olarak ifade edilmesi gerektiği yaklaşımını kabul ediyorum, ancak cevap (sonunda) bir yorum veya belki de bir kod değişikliği (örneğin daha iyi adlandırma) şeklinde olacak. Bu, geliştiricinin düşüncelerini açıklamasını ve bir talep gibi hissetmek yerine ya da yanlışlıkla kendileri için işlerini yerine getirmek yerine seçenekleri tartışmak için kapıyı açık bırakır.
IMSoP

3

Kodları incelerken yalnızca çok az bir çaba ile başarabilirsem, belirlediğim sorunlar için bir çözüm sunarım. Sorunun ne olduğunu düşündüğüm konusunda spesifik olmaya çalışıyorum, mümkün olan hallerde mevcut belgelere geri dönüyorum. Bir gözden geçiriciden, belirlenen her soruna bir çözüm sunmasını beklemek, ters bir teşvik yaratır - gözden geçirene sorunları işaret etmesini engeller.


3

Kanımca, birçok nedenden dolayı, çoğu durumda kod sağlama yönünde daha güçlü bir yol izleniyor:

  • Eğer açıklama tek başına yeterli değilse, düşündüğünüzden her zaman bir örnek isteyebilirler.
  • Uzun zamandır dokunmadığınız bazı kodları tanımaya çalışarak zamanınızı boşa harcamazsınız, sadece biraz değiştirmek için, birileri zamanını böyle yaparak harcadı.
  • Zaten bir kod parçasına aşinalarsa ve siz bilmiyorsanız, yalnızca geri bildirimde bulunmak, yazdığınızdan daha iyi kodla sonuçlanabilir. Birine hazır bir çözüm vermek, daha fazla geliştirmeyi düşünmeden, sadece kullanmalarına neden olur.
  • Her zaman bir çözüm sağlamak küçümseme konusunda sınırlayıcıdır. Birisiyle çalışıyorsun, umarım işe alınacak kadar iyilerdir. Bir şeyin neden kötü bir fikir olduğunu öğrenmeyi başardıysanız, neden geri bildirimleri dinleyerek ve kendileri yaparak öğrenmediler?
  • Her zaman bir çözüm sunmak sadece garip. Kendi masasında çift programlama yaptığınızı hayal edin: harika olmadığını düşündüğünüz birkaç satırı tamamladılar. Onlara ne gördüğünü ve nedenini söylüyorsun ya da klavyesini alıp versiyonunu hemen gösterdin mi? Çözümünüzü her zaman başkalarına karşı hissedebileceğiniz şey budur.
  • Bunun yerine ne yazacağınızı her zaman söyleyebilirsiniz, aslında yazmak için zaman harcamadan. Bunu, sorudaki ilk sorunu tarif ederken yaptınız.
  • Yiyecekleri dağıtmayın, balık tutmayı öğretin;)

Elbette, belirli bir alternatif düşünmeyi düşündüğünüz bazı durumlar var ve buna değmeye değer. Ama bu benim deneyimimde gerçekten nadir. (çok sayıda inceleme, büyük projeler) Özgün yazar, gerektiğinde sizden bir örnek isteyebilir.

O zaman bile, 3. nedenden dolayı, bir örnek verirken, örneğin x.foo()tam bir çözümden ziyade "kullanımı daha basit hale getirir " demeye değer olabilir - ve yazarın yazmasına izin verin. Bu aynı zamanda zaman kazandırır.


5. noktan beni gülümsetti, ilk önce kimin iyi bir çözüm bulabileceğini görmek için "düello klavyeleri" hayal ediyordum. Çift Programlamanın bu iki yarış arabası arcade oyunu ya da tam temaslı bir spor olabileceğini kim bilebilirdi? " Steve vahşice Ron'a

2

İncelemeleri kodlamanın anahtarının, incelemeden önceki kurallar üzerinde anlaşmak olduğunu düşünüyorum.

Açıkça bir kurallar diziniz varsa, bir çözüm sunmanıza gerek kalmaz. Siz sadece kurallara uyulduğunu kontrol ediyorsunuz.

Bir alternatifin sorusunun ortaya çıkacağı tek zaman, orijinal cihazın kurallara uyan bir özelliği uygulamak için bir yol düşünememesiydi. Performans gereksiniminiz olduğunu söyleyin, ancak birkaç optimizasyon denemesinden sonra bu özellik eşiğinizden daha uzun sürer.

Ancak! Kuralların öznel ise, "İsimler benim tarafımdan onaylanmalı!" öyleyse, evet, kendinize yeni bir şef seçtiniz ve kabul edilebilir isimlerin listeleri için istekler beklemelisiniz.

Kalıtım (isteğe bağlı parametreler) örneğiniz belki daha iyidir, int uzun yöntemleri ve 'çok fazla' işlev parametresini yasaklayan kod inceleme kurallarını gördüm. Ancak normalde bunlar bölünerek önemsizce çözülebilir. Nesnenizin izinsiz olduğu ve belki de gerekçelendirme veya alternatif bir çözüm gerektirdiği "bu çözüm aşırı karmaşık görünüyordu" bölümüdür.


2
"İncelemeleri kodlamanın anahtarının, incelemeden önceki kurallar üzerinde anlaşmak olduğunu düşünüyorum." Bu ideal durum olurdu. Uygulamada her geliştiricinin tüm kuralları bildiğini varsayamayız. Kod incelemeleri bu bilgiyi yaymak ve kuralları pratik örneklerle açıklamak için faydalıdır. Belki de kod incelemeleri yapmanın en büyük avantajlarından biri ..
Frank Puffer

kuralları kodlama standartları belgesinde yazınız ve yeni aygıtlara veriniz
Ewan

1
Kodlama standartlarını yazdık ve bunlar yeni geliştiricilere verildi. Bu çoğu zaman işe yarar, ancak bazen yanlış yorumlar da vardır. Yazılan kodlama standartlarına ek olarak, DRY veya SOLID gibi kod incelemelerinde de ele alınan genel ilkeler vardır. Bunlar hakkında geliştiricilerimizden temel bir bilgi bekliyoruz ve bunu geliştirmek için bazı iç eğitimler de yapıyoruz. Bu devam eden bir süreçtir ve kod incelemeleri bunun bir parçasıdır.
Frank Puffer

0

Potansiyel bir çözümün hızlı ve kolay bir şekilde yazılması durumunda, akran incelememe yorumuma eklemeye çalışıyorum. Değilse, en azından endişelerimi ve neden bu maddeyi sorunlu bulduğumu listeliyorum. Daha iyi bir şey düşünemediğiniz değişken / fonksiyon isimleri söz konusu olduğunda, genellikle daha iyi bir fikrim olmadığını kabul ediyorum ve yorumu birisinin açık uçlu bir soru şeklinde sonlandırdığını kabul ediyorum. . Bu şekilde kimse daha iyi bir seçenek bulamazsa, inceleme gerçekten yapılmaz.

Mesela, sorunuza verdiğiniz örnek, kötü tasarlanmış bir sınıf. Overkill gibi gözükse de, kalıtımın, kodun çözmeye çalıştığı sorunu çözmenin en iyi yolu olacağı ve bu konuda bırakacağım bazı yorumlar bırakacağım. Bunun bir gösteri durdurucu olmadığını ve düzeltmek isteyip istemediğine bağlı olarak geliştiricinin takdirine bağlı olduğunu ifade etmeye çalışacağım. Ayrıca, kodun bu kısmına özellikle aşina olmadığınıza dair bir onay vereceğim ve bu şekilde yapılmasının bir nedeni olup olmadığını açıklamak için daha bilgili geliştiriciler ve / veya yorumcular davet ediyorum.


0

Git ve kodunu incelediğin kişiyle konuş. Onlara dostane bir şekilde anlamanızı biraz zor bulduğunuzu söyleyin ve onlarla nasıl daha net hale getirilebileceğini tartışın.

Yazılı iletişim, büyük miktarda boşa harcanan zamanın yanı sıra, kızgınlık ve yanlış anlamalara yol açar.

Yüz yüze, bant genişliği çok daha yüksek ve düşmanlıktan kaçınmak için duygusal yan kanal var.

Aslında adamla konuşursanız, çok daha hızlı olur ve yeni bir arkadaş edinir ve her ikinizin de işinizden daha çok zevk aldığını görebilirsiniz.


Bu, önceki 11
cevapta
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.