Forum: Projeler Genel RSS
İlk 'pull request'i ekledim
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İlk 'pull request'i ekledim
Bu düzen işlemeye başladı yani... :)

İlk yamayı bir çalışma zamanı hatasını giderdiği için ve ilk request olduğu için kabul ettim; ama bundan sonrası için dikkat etmemiz gereken noktaları hatırlatmak istiyorum:

(1) Yamaları olabildiğince küçük tutmaya çalışalım: çalışma zamanı hatasını gideren yama yalnızca onunla ilgili olsun

Git bu işi çok kolaylaştırıyor. Git'i kullanan arkadaşlara yeni soru: Yamaları küçük tutmak için şu adımlar uygun mu?

1) yerel olarak dallayın
2) çalışma hatasını o dalda giderin
3) bu dala commit edin
4) github'daki kendi deponuza push edin
5) github'daki deponuzdan pull request gönderin

Sonra başka değişiklikler için başka dala geçin.


(2) Kodlama standardımıza uymuyoruz; uyalım! :) Özellikle şu maddelerde anlaşamıyoruz:

  http://ddili.org/wiki/index.…?title=Kodlama_Standard%C4%…

  http://ddili.org/wiki/index.…?title=Kodlama_Standard%C4%…

  http://ddili.org/wiki/index.…?title=Kodlama_Standard%C4%…

Eğer o standartlarda uygunsuz bulduğunuz maddeler varsa belirtin; yol yakınken düzeltelim.

Birim testleri çok önemli. Örneğin şu satırda açık bir hata var:

return "<bo dir=\"ltr\">"~text~"</bdo>\n"

Böyle hataların hepsini insanların yakalaması çok zordur. Bugün düzeltiriz, koda yarın dokunduğumuzda başka tarafından patlar...

Ayrıca birim testlerinin kodu denetlemelerini bekliyoruz. Yani ekrana yazılan metine bakarak karar veremeyiz. Aslında birim testlerini kendim yazacağımı söylemiştim ama günümüzde birim testi olmayan program artık kabul edilmemeli. Bence her programcı öncelikle birim testlerini düşünerek programlamalı.

Örneğin yukarıdaki kodu yazmadan önce şöyle bir test yazılmış olması çok yararlı olurdu:

    assert(help.bidirectional(42, "merhaba") ==
           "<bdo dir=\"ltr\">merhaba</bdo>\n");

(Not: 42 yasal bir değer mi? ;))

Ali
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
4'yi yasal tuttum.Çünkü tersten yazdırmak isteyen adam özellikle bir sayı girer ama yine de ters için 'r'(reverse) düz için 'n'(normal) karakteriyle kontrol edebilirim.

assert leri daha tam öğrenemedim ama öğreneceğim.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kadir Can:
'r'(reverse) düz için 'n'(normal) karakteriyle kontrol edebilirim.

Bu gibi durumlarda enum'lar daha iyi oluyor: hata yapması daha güç ve ne anlama geldiği açık oluyor:

enum Yön { sol, sağ };

D'nin C ve C++'da bulunmayan güzel bir olanağı final switch... Bütün değerleri kullanılan enum'larda çok yararlı oluyor: hiçbir değerin unutulmadığını garanti ediyor; o yüzden default kullanmak da yasak:

import std.stdio;
 
enum Yön { sol, sağ };
 
void foo(Yön yön)
{
    final switch (yön) {
    case Yön.sol:
        writeln("Sola gitmemi istediniz");
        break;
 
    case Yön.sağ:
        writeln("Sağa gitmemi istediniz");
        break;
    }
}
 
void main()
{
    foo(Yön.sol);
}

assert leri daha tam öğrenemedim ama öğreneceğim.

Neden daha önce sormadın! :) Yükte hafif, pahada ağır, son derece yararlı bir olanak. Öğrenmesi şu kadar basit: "assert'e verilen mantıksal ifadenin doğru çıkmasını bekliyoruz." Öyle olmazsa bir hata var demek. Burada anlatacağım. :)

Kendisine verilen string'leri aralarında tire karakteri ile birleştiren bir işlev:

import std.stdio;
 
string tireyleBirleştir(string[] parçalar ...)
{
    string sonuç = parçalar[0];
 
    foreach (parça; parçalar[1 .. $]) {
        sonuç ~= '-' ~ parça;
    }
 
    return sonuç;
}
 
void main()
{
    writeln(tireyleBirleştir("abc", "xyz"));
}

O programı çalıştırabilir ve ekrandaki çıktısına bakabiliriz. Ama bu çok yetersiz olur çünkü program değiştikçe çıktı bozulmuş olabilir; örneğin "abc-xyz-" haline gelmiş olabilir. assert, bu beklentimizi denetleyebilir. Örneğin bir unittest bloğuna şöyle yazabiliriz:

unittest
{
    assert(tireyleBirleştir("abc", "xyz") == "abc-xyz");
    assert(tireyleBirleştir("abc", "xyz", "123") == "abc-xyz-123");
}

Çok kolay: yaptığımız tek şey, işlevin döndürdüğü değerin neye eşit olması gerektiğini düşündüğümüzü belirtmek oldu (== işleci ile).

Neler olabileceğine bakalım:

1) Daha sonradan bir programcı gelip parçalar[0]'a neden özel olarak davranıldığını anlamadan işlevi şöyle değiştirebilir:

string tireyleBirleştir(string[] parçalar ...)
{
    string sonuç;
 
    foreach (parça; parçalar) {
        sonuç ~= '-' ~ parça;
    }
 
    return sonuç;
}

Ve yaptığı yanlışı birim testler tarafından hemen yakalanır:

core.exception.AssertError@deneme(28464): unittest failure

2) Veya başka bir programcı gelip tireyleBirleştir()'in gereksizce yazıldığını düşünüp onun std.array.join çağrılarak da yazılabileceğini düşünebilir:

import std.array;
// ...
string tireyleBirleştir(string[] parçalar ...)
{
    return join(parçalar, "-");
}

Ve tamamen emin bir şekilde olay yerinden ayrılır. :) Çünkü birim testleri geçerler. Yani işlev istendiği gibi işlemiş ve iki örnek çağrı için doğru sonucu üretmiştir.

Öte yandan, birim testi olmayan koda dokunulamaz ve sonuçta kod çürür (code rot).

İşte assert bu kadar basit ve bu kadar kullanışlıdır. :) Programın başka yerlerine de yazılabilir ama şimdilik bu kadarı yeterli.

Ali
doganaydin #4
Kullanıcı başlığı: Doğan Aydın
Üye Şub 2011 tarihinden beri · 7 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
github için bir ipucu vereyim. Mesela birden fazla sorunu çözmemiz lazım veya farklı kısımlara kod yazmamız lazım, bir sorunu gideren yamayı hazırladınız bitti. Bu yamayı push etmeyin, sadece commit edip bırakın. Daha sonra 2.,3. ve daha sonraki sorunları çözün ve toptan push edin. Böylece pull requestlerde de kolaylık olur, eklediğiniz commit mesajlarını ayırt etmesi de daha kolay olur. Mesela deneme.d dosyasında bir sorunu çözdünüz. commit -m "yazdırma sorunu çözüldü" gibi o dosyada yaptığınız değişikliği commit edin, daha sonra diğerlerini. Çok uzattım ama kısacası her commit işleminden sonra push etmek zorunda değilsiniz :)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben de öyle anlıyorum ama 'pull request'in kabul edilmesini beklerken bir yandan da çalışmaya devam etmek istendiğinde kişinin github'daki kendi deposuna 'push' etmesi gerekiyor, değil mi?

Küçük parçalarla uğraşmak daha kolay olduğu için bana daha kolay geliyor.

Ali

Not: Aslında ev bilgisayarlarımız arasında bağlantı kurmuş olsak github'daki kişisel depolarımıza da gerek yok. Ama bunun sorunlarıyla uğraşmak yerine github'a teşekkür ediyor ve onlardan yararlanıyoruz. :)
doganaydin #6
Kullanıcı başlığı: Doğan Aydın
Üye Şub 2011 tarihinden beri · 7 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Ben de öyle anlıyorum ama 'pull request'in kabul edilmesini beklerken bir yandan da çalışmaya devam etmek istendiğinde kişinin github'daki kendi deposuna 'push' etmesi gerekiyor, değil mi?

Küçük parçalarla uğraşmak daha kolay olduğu için bana daha kolay geliyor.

Ali

Not: Aslında ev bilgisayarlarımız arasında bağlantı kurmuş olsak github'daki kişisel depolarımıza da gerek yok. Ama bunun sorunlarıyla uğraşmak yerine github'a teşekkür ediyor ve onlardan yararlanıyoruz. :)
Pull request gönderdiktek sonra diğer commitler de bu pull requestte görünür. Ama dediğiniz gibi küçük parçalarda commit edildiği zaman pull requestlerde de daha rahat çalışılıyor.
Kadir Can #7
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali bey;
assert anlatımı için teşekkür ederim.Yarın unittest kısmını assertlerle dolduracağım.

enumlar güzel.İlk defa kullanacağım.İnşallah hatasız olur.
Kadir Can #8
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İkinci pull request atıldı.

assert ve enum olayını hallettim.

Kod assert'leri sorunsuz geçiyor.
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben de onun üzerine bir kod temizliği yaptım:

- boşluklar

- küme parantezleri

- enum türünün ismini büyük harfle başlattım

- satır uzunluklarını 80'le sınırladım

- vs.

Soru: benim değişikliklerimden sizin haberiniz oluyor, değil mi? Ayrıca bilgi vermeme gerek yok herhalde.

Aynı şekilde sizin de pull request'leri burada bildirmenize gerek olmuyor; bana e-mail olarak geliyor.

Ali
Kadir Can #10
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Ali bey,

Şu kodlama düzenine dikkat edeceğim.Kod çok güzel görünüyor. :D

Sizin commitlediğiniz kodu çekemedim.Nasıl yapabilirim?

Bİr şey sormak istiyorum.Şu anda kodun durumu sizce nasıl?İyiye gidiyor mu?
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kadir Can:
Sizin commitlediğiniz kodu çekemedim.Nasıl yapabilirim?

Senin origin'inin github'daki acehreli/turna olduğunu varsayıyorum. Türkilişce konuşarak: :) daha önce ondan "clone etmiştin" değil mi? O zaman "senin origin'inden pull edeceksin".

Şu anda kodun durumu sizce nasıl?İyiye gidiyor mu?

Şimdi zamanım yok; sonra yazarım. Ama bence onu turna forumunda yeni bir konu olarak konuşsak daha iyi olacak. "İlk 'pull request'i ekledim" konusundan bayağı uzaklaşmış olduk. ;)

Ali
Kadir Can #12
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Doğru.Kodun durumunu önemsediğim için sordum.

Ayrıca ;
git pull https://acehreli@github.com/acehreli/tuna.git 

Koduyla ana depodan çekim yapabiliyoruz. :D
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Projeler Genel RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-12-16, 08:28:08 (UTC -08:00)