Başkalarının kaynak kodunu yorumlama [kapalı]


9

Not: Bu sorunun farkındayım . Bununla birlikte, bu soru biraz daha spesifik ve derinlemedir, ancak gerçek kodu ayıklamak veya yazara sormak yerine gerçek kodu okumaya odaklanır.

Giriş seviyesi bir bilgisayar bilimi dersinde öğrenci olarak arkadaşlarım ara sıra kendilerine ödevlerinde yardım etmemi ister. Programlama gurur duyduğum bir şey, bu yüzden her zaman mecbur kaldım. Ancak, genellikle kaynak kodlarını yorumlamakta zorlanıyorum.

Bazen bu garip veya tutarsız bir stile, bazen de ödevde belirtilen garip tasarım gereksinimlerine ve bazen de aptallığımdan kaynaklanıyor. Her halükarda, birkaç dakika boyunca ekrana bakan bir aptal gibi görünüyorum "Ah ..."

Genellikle sık karşılaşılan hataları kontrol ederim - çıkarıcı operatörler yerine virgül kullanarak noktalı virgül veya parantez eksik.

Sorun bu başarısız olduğunda gelir. Sıklıkla hata ayıklayıcıdan geçemiyorum çünkü bu bir sözdizimi hatası ve yazara sık sık soramıyorum çünkü kendisi tasarım kararlarını anlamıyor.

Genellikle başkalarının kaynak kodunu nasıl okursunuz? Kodu yukarıdan aşağıya doğru okuyor musunuz, yoksa her işlevi çağrıldığında mı takip ediyorsunuz? Ne zaman "Refactor zamanı" demenizi nereden biliyorsunuz?


1
Şunu söyleyebilirim: üniversite programındayken bile kötü programcılar üzerinde zaman kaybetmeyin ... sizden ücret almadıkça. Başarının püf noktası şudur: Onları aptal gibi gösterirken $larını al.
İş

2
@ İş: Başlarken hepimiz kötü kod yazdık. Zaman ayırmaya değer olup olmadıkları, kendi başlarına çalışmaya ve gelişmeye önem vermelerine bağlıdır.

@ İş lisedeyim ve arkadaşlarıma düzgün davranmak istiyorum. Rekabet muamelesinin ardındaki mantığı görebilsem de, daha hoş bir insan olmaya çalışıyorum.
Makspm

5
Ve böylece onlara karşı iyi olurken rekabeti ortadan kaldırırsınız. Onlar için her şeyi çözerseniz, çok şey öğreneceksiniz ve çaresiz olacaklar. (Flipside, bilgi eksikliği ile birleştiğinde muhtemelen derhal yönetime gidecekleri anlamına gelen bir derece alacaklar. :))
biziclop

Yanıtlar:


22

İlk ipucu: sözdizimi hatalarını, yanlış yerleştirilmiş parantezleri ve diğer önemsiz hataları tespit etmek için bir IDE (veya çok iyi bir düzenleyici :)) kullanın.

İkinci adım: Tüm kodu rahat hissettiğiniz bir formatta otomatik olarak biçimlendirin. Bunun çok önemli değil ama şaşırtıcı olduğunu düşünürdünüz.

Yerel olarak adlandırılmamışlarsa yerel değişkenleri yeniden adlandırmaktan korkmayın. (Tam sisteme erişiminiz varsa, her şeyi yeniden adlandırabilirsiniz ve yapmanız gerekir.)

Belirli bir işlevin / yöntemin ne yaptığını keşfettiğinizde kendinize yorum ekleyin.

Sabırlı ol. Uzaylı kodunu anlamak kolay değildir, ancak yapbozun çoğu parçasının aniden yerine oturduğu her zaman bir atılım anı vardır. Bu noktaya kadar her şey çok sıkı çalışma ve angaryadan korkuyorum. İyi haber şu ki, uygulama ile bu eureka anı daha erken gelecek.


Orijinal yazara saygı duyarken nasıl yeniden biçimlendirebilir / yeniden adlandırabilirim? Gibi şeyler söyleyerek yorum bırakmalı mıyım // Renamed to ABC for XYZ?
Makspm

3
@Maxpm Basit yanıt, orijinal yazara saygı duymanız gerekmemesidir. Kod bir sanat eseri değildir ve işe yaramıyorsa kesinlikle değildir. Ancak böyle yorumlar ekleyebilirsiniz, bu yüzden orijinal yazara neyi değiştirdiğinizi ve nedenini açıklamak daha kolaydır. Neden çok önemlidir, mümkün olan her yerde neden işleri yaptığınızı belgeleyin. En yararlı yorum türüdür.
biziclop

6
@ Makspm - kod dosyasını kopyalarsınız. İstediğinizi yapın ve sonra geri dönün ve sorunu orada çözmelerine yardımcı olun. Ben de öyle yapardım.
Erin

@Maxpm Kodun bir kopyasını oluşturun ve önce astyle ( astyle.sourceforge.net ) üzerinden çalıştırın . Programlamayı nadiren öğrenen insanlar tutarlı kodlama stillerine sahiptir. Kodun düzgün biçimlendirildiğini görmek, görsel olarak "ayrıştırırken" çok yardımcı olur.
Vitor Py

1
@Maxpm, kopyalama ve sisteminiz üzerinde çalışmak en iyisidir, ancak önlerinde yapmak zorunda olsanız bile (sizden gelip size yardım etmenizi istiyorlarsa), bir değişkeni yeniden adlandırmanız gerekiyorsa, sadece yapmadığınızı söyleyin Yazmayın, bu yüzden her şeyin ne yaptığını bilmiyorum, bu yüzden onu yeniden adlandırmanız gerekiyor.
Dominique McDonnell

20

Sanırım bu konuda yanlış bir yaklaşım benimsiyorsunuz. Eğer insanlar kodları konusunda yardım için size dönüyorlarsa, sanırım geri dönme ve kodlarında size yol göstermeleri için onlara söyleme sorumluluğuna sahipsiniz. Hatalarını onlar için düzeltebilirsiniz ve bir şeyler öğrenebilirler (ezberleyerek), eğer kendi hatalarını (yardımlarınızla) tespit edebilirlerse daha fazla öğrenirler. Ayrıca, farklı insanların kodlamaya nasıl yaklaştığı konusunda daha geniş bir deneyim kazanacaksınız (bu da daha fazla kodu okumanıza / anlamanıza izin verecek) - erdemli bir döngü ...;)


2
neden aşağı oy? bu iyi bir fikir gibi görünüyor.
Matt Ellen

Katılıyorum. Çok tuhaf görünüyor.
Michael K

@Matt ad Michael, arabayla aşağıya vekiller, yapabileceğin pek bir şey yok ...
Nim

Güzel bir fikir ama gerçek hayatta "iş yerinde porno izlemek için kovulan destekten çıkan sekiz yıl önce yazılan bir kod" ve daha sonra ne, koşacak kimse yok. Ayrıca muhtemelen temel bilgilerle mücadele eden biri tarafından verilen bir açıklamanın gerçek değeri nedir?
biziclop

Bu iyi bir cevap. Kodlarının ne yapması gerektiğini düşündükleri ya da en azından yapmasını istediklerini düşünmeleri gerekir.
JeffO

3

Bu yeteneğin bir deneyim karışımı olması ve bunun için bir yeteneğe sahip olduğuna inanıyorum. Sıfırdan bir şeyler yapmalarını isteseydik az çok her şeyi çözebilecek çalışanlarımız vardı, aynı zamanda yazmadıkları kod parçalarında açıkça hatalar bulamıyorduk. Ve aynı zamanda, temel tasarımı aşan hiçbir şeye güvenmeyeceğimiz, ancak başkalarına dalmak ve sorunları kısa sürede takip edebilecek çalışanlarımız vardı.

Bununla birlikte, buna yaklaşmanın yolu kodu değiştirmektir. Alıştığınız şeye yeniden biçimlendirin, değişken adlarını sizin için anlamlı olan bir şeye değiştirin, kod net değilse yorum ekleyin. Senden yardım istediğinde, sorunu bulana kadar devam etmeli ve bir şeyler değiştirmelisin. Ardından, orijinal kodu düzeltmeyi veya kendinizinkini kullanmayı arkadaşınıza bırakın.


+1 - Kod geliştirmek ve başkaları tarafından yazılan hataları izlemek 2 farklı beceridir. İşverenler, her ikisini de iyi yapabilen birini bulduklarında sahip oldukları şeyleri takdir etmiyorlar.
Smaç

2

İlk olarak, sözdizimi hataları varsa, derleyici hatalarını dikkatlice okumalısınız. Genellikle bir satır hata olarak vurgulanır, ancak aslında hataya sahip olan önceki satırdı.

Bir giriş öğrencisi için, programın derlenmesini engelleyecek, görülemeyen bazı düzenleme yapıları olabileceğini unutmayın. Örneğin, bir keresinde dönüş yerine boşluk çubuğunu kullanan bir öğrenciyi (benim değil) gördüm: Kodu 80 sütundan sonra sarılmış bir editörde normal görünüyordu (öğrenci çok sabırlıydı) ve kod ekleyene kadar bile çalıştı //programın geri kalanını yorumlayan " " tarzı bir yorum. Benzer şekilde, kod örneklerini bir web sitesinden kopyalarsanız, genellikle kopyalanamayan karakterler de vardır (web sitesinin kodu nasıl biçimlendirdiğine bağlı olarak). Şüphe duyduğunuzda, kopyalayıp yapıştırmadan bir satıra yeniden yazın. [Bu biraz şaşırtıcı, ama son zamanlarda çok daha fazla olduğunu gördüm.]

Kötü derleyici hataları için, yeni bir dosya oluşturarak ve devam ederken tüm kodu yazarak programı büyütmeniz gerekebilir. Bir sonraki adıma geçmeden önce her büyük adımdan sonra derlediğinizden emin olun.

Peki, sözdizimi hatası yoksa ne olacak? Sonra kod adım adım! Bunun için bir hata ayıklayıcı kullanabilirsiniz, ancak printfkod boyunca çağrı yapmak da oldukça etkilidir. Örneğin, bir fordöngü varsa , döngü sayacı için bir print ifadesi ekleyin. İç içe fordöngüler olması durumunda , yanlış değişkenin artırıldığını görebilirsiniz.

printfS kullanmanın avantajı, şu anda baktığınız şeyi zaman / mekanda "sıkıştırma" yeteneğidir. Bir hata ayıklayıcı ile adım attığınızda, çok fazla alakasız durum görürsünüz ve daha sıkıcı olabilir. Ayrıca, konsola yazdırılanların geçmişini görmeden, bazı desenleri kaçırabilirsiniz. Buradaki nokta, hata ayıklayıcı ve printf'lerin tamamlayıcı teknikler olması ve her ikisinin de diğerinden daha iyi olmamasıdır.

Son olarak, arkadaşınıza neler olup bittiğini sorun! Ona bakmak ve "uh" demek yerine onlara ne yaptıklarını sorun: "şimdi ne yapıyor n?" Diyaloğu başlatarak, kendi sorularını cevaplayabilirler veya programın bir çözüme sahip olmalarını nasıl kavramsallaştırdıklarını fark edebilirsiniz, bu da sizi bir çözüme yönlendirebilir.

Başka bir yerde yorumlandığı gibi, tüm bu deneyim ile daha iyi olur. 20 yıldır programlama yapmama rağmen, son 5 yıla kadar öğrencilerle çalışmıyordum, hatalarında onlara daha iyi yardımcı oldum.


1

Bunu söylemekten nefret ediyorum, ama burada gümüş kurşun yok.

Açıkçası , vakaların% 10'unda bile yaptıklarını yazdıklarında başkalarının ne anlama geldiğini anlayabilecek kadar basiret olsaydım, şimdiye kadar milyonlarca şüphe gölgesi olmadan yapardım.

Daha pratik bir notta, akıllı bir IDE kullanmak adım 1'dir.

Adım 2 , kaynak kodu hiyerarşisini bulmak için doxygen veya benzeri bir şey çalıştırmak olacaktır .

Adım 3, bağlantı fonksiyonlarını veya nesneleri, komut satırınızı veya dosyanızı işleyen ve ardından mantık gerçekleştiren şeyleri bulmaktır.

Adım 3'e paralel olarak, kullanıyorsanız küreselleri takip edin. Ayrıca arkadaşlarınıza bilinen herhangi bir özel algoritma kullanıp kullanmadıklarını sorun - koda bakmadan önce algoritmayı okumak (eğer varsa) her zaman faydalıdır.


1

Tek kelimeyle: Deneyim, daha fazla deneyim kazandıkça, en iyi uygulamaları daha fazla öğrenir ve diğer insanların kodlarını yargılayabilir / anlayabilir. Otomatik olarak gelmez, bunun yerine genellikle aynı hatayı kendiniz yapmaktan gelir!

Bununla birlikte, programcıların kodlarını düzgün bir şekilde yorumlamayı öğrenmeleri önemlidir, çünkü koda baktığınızda genellikle koddan tahmin etmek çok zor olan büyük bir düşünce sürecinin sonucudur. Birkaç yorum, tasarım düşüncesi olan bir metin dosyası, kodu anlama ve tamamen yanlış anlama arasındaki farkı yaratabilir.


1

Aynı şeyi okuldaki laboratuvarda sık sık sordum. Genellikle, "Bu derleyici hatasını nasıl düzeltirim?" bu yüzden sarkanları else, eksik noktalı virgülleri ve benzerlerini tespit etmekte oldukça başarılı oldum . (Makrolar da hata ayıklamak için eğlencelidir - #define CUBE(x) x * x * xhepimizin yapmak istediği bir hatadır.) Sahip olduğum bir avantaj, aynı öğretmenlerle aynı sınıflardan geçmemdi, bu yüzden gereksinimleri zaten biliyordum.

En iyi çalıştığımı bulduğum işlem, çalışan bir iletişim kutusu tutmaktır. Programı onlar için yazmak istemezsiniz, çünkü öğrenmeleri gereken programlardır. Bu, onlarla aynı bilgisayarda olmanız gerektiği anlamına gelir. Laboratuarda bilgisayarlarına gelirdim. Derleyici mesajından başlayarak, hatayı tespit etmelerini sağlamaya çalışacağım. (C kullanıyorduk.) Satır numarasıyla başlayın ve mesajın ve hatanın nereye karşılık geldiğine dikkat edin. Aynı hatadan birden fazla varsa, onlara iki hata hakkında benzer olanları sorardım.

Bütün fikir diğer öğrenciye rehberlik etmektir. Kodlarını onlar için yeniden yazmak, öğrenmelerine yardımcı olmaz.


#define CUBE(x) x * x * xtip güvensizlikten başka ne yanlıştır ?
İş

Gibi çağrıldığında CUBE(3), iyi. İle arayın CUBE(x + 1)ve x + 1 * x + 1 * x + 1C de değerlendirilir olsun x + (1 * x) + (1 * x) + 1. Bu 3x + 1, x <sup> 3 </sup> olmayanları değerlendirir ! Bildirerek düzeltirsiniz #define CUBE(x) (x) * (x) * (x).
Michael K

0

Sözdizimi hatalarını bulmak mantık hatalarından çok daha kolaydır. Sorunlarının çoğu sözdizimi ise, bir IDE bulun, kodlarını kopyalayıp yapıştırın ve hataları düzeltin. Mantık hataları çok daha zordur. Neden kodlarını açıklamalarını isteyemeyeceğinizi söylediğinizden emin değilim. Başka birine kod açıklayarak birçok mantık hatası buldum.

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.