Soru Basit soru kodlama bilenler içeri

  • Konuyu açan Konuyu açan asilords
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 10
  • Gösterim Gösterim 251
Herhangi bir konuda danışmak istediğiniz soru varsa bu öneki seçebilirsiniz.

asilords

Üye
Üye
Mesaj
225
Çözümler
8
Beğeni
55
Puan
704
Ticaret Puanı
0
C++ ve c# ta yeniyim ve bazı if kodları gözüme takılıyor arasındaki farkı öğrenmek istiyorum.

C++:
Genişlet Daralt Kopyala
Örnek

if (isStone() && isEnemy())
{
    return;
}

bunla farkı nedir?
    
if (isStone())
{
    if (isEnemy())
    {
        return;
    }
}
 
performans açısından farkı yok kod okuma alışkanlığı olarak ben üsttekini tercih ediyorum alttaki şeklinde kod yazanlar ve kodda türkçe değişken adı kullananlar bana ankaralı yerine angaralı gibi geliyor.
 
ilk kodda ikisini de aynı anda kontrol ediyor ama alttaki kodda önce stone mi diye kontrol ediyor stoneyi doğrularsa enemy mi diye kontrol ediyor diye biliyorum. yani ilk kodda stone olmasa da enemyde return döndürebilir ama ikinci kodda yapamaz.
 
Modern derleyiciler kodu nasıl yazarsan yaz optimize ederek derleyeceği için performans farklı muhtemelen olmaz.

ChatGPT diyor ki::
Genişlet Daralt Kopyala
If isStone() returns false, Snippet 1 performs 1 function call (isStone()) and returns immediately.

If isStone() returns false, Snippet 2 also performs 1 function call (isStone()) and returns immediately.

If isStone() returns true and isEnemy() returns false, both snippets perform 2 function calls (isStone() and isEnemy()).

If isStone() returns true and isEnemy() returns true, both snippets again perform 2 function calls.

Yine de ilk fonksiyon daha okunaklı ve daha iyi bir yazım stili.
 
Modern derleyiciler kodu nasıl yazarsan yaz optimize ederek derleyeceği için performans farklı muhtemelen olmaz. Fakat mantıken üstteki fonksiyon daha hızlı çalışır. Çünkü üstteki fonksiyonda mantıksal operatör "&&" kullanılmış. Yani "isStone" koşulu "false" döndürürse, "isEnemy" koşulu kontrol dahi edilmez.

ChatGPT diyor ki::
Genişlet Daralt Kopyala
If isStone() returns false, Snippet 1 performs 1 function call (isStone()) and returns immediately.

If isStone() returns false, Snippet 2 also performs 1 function call (isStone()) and returns immediately.

If isStone() returns true and isEnemy() returns false, both snippets perform 2 function calls (isStone() and isEnemy()).

If isStone() returns true and isEnemy() returns true, both snippets again perform 2 function calls.

Dolayısıyla işlem gücünden tasarruf sağlanır. Yine de ilk fonksiyon daha okunaklı ve daha iyi bir yazım stili.
chat gpt bana da aynısını dedi ama mesela bazı dosyalarda bu şekilde kontroller var işte isshopowner isacceopen gibi art arda ve ilk sıradaki gibi eklenmiş. ordaki ilk değer false dönmüyor mu şimdi? false dönüyorsa diğerlerini de okuyor. bilemedim. ya da acaba oradakiler o düzene uygun mu sıralanmış kontroller acaba??? bende merak ettim.
 
chat gpt bana da aynısını dedi ama mesela bazı dosyalarda bu şekilde kontroller var işte isshopowner isacceopen gibi art arda ve ilk sıradaki gibi eklenmiş. ordaki ilk değer false dönmüyor mu şimdi? false dönüyorsa diğerlerini de okuyor. bilemedim. ya da acaba oradakiler o düzene uygun mu sıralanmış kontroller acaba??? bende merak ettim.
mantıksal ve işaretinde tüm değişkenler true dönerse ifade true döner diğer koşullarda hep false;
detaylı bilgi için:
Linkleri görebilmek için giriş yap veya kayıt ol.
 
chat gpt bana da aynısını dedi ama mesela bazı dosyalarda bu şekilde kontroller var işte isshopowner isacceopen gibi art arda ve ilk sıradaki gibi eklenmiş. ordaki ilk değer false dönmüyor mu şimdi? false dönüyorsa diğerlerini de okuyor. bilemedim. ya da acaba oradakiler o düzene uygun mu sıralanmış kontroller acaba??? bende merak ettim.
Aslında iki yazım tarzında da, "isStone" false dönerse, "isEnemy" kontrol edilmez, fonksiyon kesilir. Ben biraz yanlış anlamışım CHatGPT'yi iki fonksiyon arasında performans farkı yok ancak okunurluk olarak ilki daha iyi.
 
Aslında iki yazım tarzında da, "isStone" false dönerse, "isEnemy" kontrol edilmez, fonksiyon kesilir. Ben biraz yanlış anlamışım CHatGPT'yi iki fonksiyon arasında performans farkı yok ancak okunurluk olarak ilki daha iyi.
sen doğru anlamışsın da ben mantığıma oturtamadım
 
İlk kod bloğunda isStone() ve isEnemy() fonksiyonları aynı anda değerlendiriliyor her iki fonksiyonda true değerini döndürürse return ifadesi koddan çıkar.

İkinci kod bloğunda isStone() fonksiyonu önce değerlendirilir, true değerini döndürürse sadece o zaman isEnemy() fonksiyonu değerlendirilir. Her iki fonksiyon da true değerini döndürürse return ifadesi koddan çıkar.

Sadece bu işlem özelinde verimlilik açısından ilk kod bloğu çok daha iyidir. Burada en önemli fark aslında şu, bilmen gereken programlamanın olmazsa olmaz bilgisi kodların yukarıdan aşağıya okunmasıdır. Şöyle bir kurgu yapalım:


C++:
Genişlet Daralt Kopyala
if (isStone() && isEnemy())
{
  specialAttack(); // Özel saldırıyı gerçekleştir
  return;
}

Burada taş ve düşmansa specialAttack() diye bir fonksiyon çağırıyoruz ve kodu aradan çıkarıyoruz.

C++:
Genişlet Daralt Kopyala
if (isStone())
{
  if (isEnemy())
  {
    specialAttack(); // Özel saldırıyı gerçekleştir
  }
  else
  {
    normalAttack(); // Normal saldırıyı gerçekleştir
  }
}

Burada ise canavar taşsa ve düşmanse specialAttack() eğer düşman değilse ama gene de taş ise normalAttack() fonksiyonunu çağırırız.

Yani kısaca görüldüğü gibi, ikinci kod bloğu ilk kod bloğundan farklı olarak canavarın taş ve düşman olması durumunda özel bir işlem, değilse de normal bir işlem yapmamızı sağlar.
 
Yorumlarda genel olarak gerekli bilgiler verilmiş zaten.

Ek olarak; bu tür kullanım şekilleri genellikle mevcut koşullar ele alınarak belirlenir.
Örneğin: Mesela bir karakterin, başka bir karaktere lonca isteği göndermesi durumunu ele alalım. Bu durumda şu şekilde bir kullanım daha mantıklı olacaktır.
C++:
Genişlet Daralt Kopyala
// Eğer "ch" bir oyuncuysa VE loncası yoksa..

if(ch->IsPC() && !ch->GetGuild())
    DAVET_GONDERILDI;
else
    DAVET_GONDERILEMEDI_HATASI;
    veya sadece return;

// Canavarlara ve npclere vb. zaten lonca daveti gönderemeyeceğimize göre neden hala IsPC() kontrolü yapıyoruz? 
// ..oluşabilecek bugları %100 önlemek için.

İç içe kullanım gerektiren bir diğer duruma örnek vermek gerekirse, bir karakterin market npcsini açtığını varsayalım.
Ve bu oyuncu marketten rastgele bir şey satın almak istesin:
C++:
Genişlet Daralt Kopyala
if(OYUNCUNUN_PARASI > ITEM_FIYATI) // her şeyden önce: oyuncunun parası yeterli mi?
{
    if(OYUNCUNUN_ENVANTERINDE_BOS_YER_VARSA) // Parası yeterli, peki envanterde boş yeri var mı?
    {
        SATIN_ALMA_ISLEMI_BASARILI
    }
    else
    {
        ENVANTERDE_YETER_ALAN_YOK_HATASI >>>
        return;
    }
    
}
else
{
    SATIN_ALMAK_ICIN_YETERLI_PARA_YOK_HATASI >>>>
    return;
}

Bu şekilde mantığa uygun kullanımlar, oluşabilecek hataları da daha detaylı yazdırmamıza kolaylık sağlar ve hepsinden önce kod okunabilirliğini iyileştirir.

Yukarıda verdiğim kodu şu şekilde de kullanabilirim ve aynı görevi görür:
C++:
Genişlet Daralt Kopyala
if(OYUNCUNUN_PARASI > ITEM_FIYATI && OYUNCUNUN_ENVANTERINDE_BOS_YER_VARSA)
{
    SATIN_ALMA_ISLEMI_BASARILI >>>>
}
else
{
    SATIN_ALMA_BASARISIZ >>>> // Ama neden başarısız? Para mı yetersiz? yoksa envanter mi dolu? Bunları detaylandırmak önemli.
    return;
}

İşlevsel olarak çalışır, ancak bu yazım şekli tamamen doğru değildir. Çünkü birden fazla(birbirini takip eden, fakat birbirinden farklı) senaryolar tek bir if ile ele alındı ve kullanışlı olma özelliğini kaybetti. Burada verdiğim örnekler basittir, ancak asıl anlatmak istediğim şey mesajımın en başında da belirttiğim gibi iflerin nasıl kullanılması gerektiği mevcut senaryoya göre değişebilir ve bu genellikle kodu yazan kişinin mantığıyla doğru orantılı bir durumdur.
Bu sadece metin2 için değil genel programlama için de geçerlidir.
Ve Metin2'de de okunurluğu düşük şekilde yazılmış birçok kod ve if bloğu örneği var. Özellikle client src içinde.

Performans açısından ise, yok denecek kadar az fark vardır.
 
Üst