C++26 ile Metin2 Kodlarını Refaktör Ediyoruz

Kaptan Yosun

Co-Co Admin
Moderatör
Geliştirici
Yardımsever Üye
Usta Üye
Mesaj
1.466
Çözümler
54
Beğeni
2.346
Puan
1.839
Ticaret Puanı
0
:mmotutkunlari-logo:
Bu başlık altında konu dışına çıkmadan, YMIR’in yaklaşık 20 yıl önce yazdığı ve günümüz standartlarına göre oldukça problemli olan kod bloklarını refaktör edip, ortaya çıkan sonuçları birbirimizle paylaşalım.

YMIR bu oyunu geliştirmeye başladığında, Visual Studio’da bugün bizim için son derece temel olan bazı kavramlar bile yoktu. Örneğin false ve true gibi değerler dahi makro olarak elle tanımlanmış:

Client\Source\libthecore\StdAfx.h:
Genişlet Daralt Kopyala
#ifndef FALSE
    #define FALSE    0
    #define TRUE    1
#endif

Biz bu antik kod tabanına mahkum olmayalım ve modern C++26 özelliklerini, güncel yazılım prensiplerini ve daha sağlıklı kod pratiklerini kullanarak altyapımızı ciddi anlamda iyileştirelim.

Amacım bu başlıkta:
  • Eski, problemli veya gereksiz kodları tespit etmek
  • Daha temiz, okunabilir ve modern hallerini paylaşmak
  • Birbirimizden öğrenerek ortak bir bilgi havuzu oluşturmak

Kod Refaktörizasyonu Yapmanın Başlıca Sebepleri:
  • Kodun okunabilirliğini artırır
  • Karmaşıklığı azaltır
  • Kaynak kodun bakımını kolaylaştırır
  • Sistemin genişletilebilirliğini artırır
  • Performans iyileştirmeleri sağlar
  • Daha stabil ve hızlı çalışan bir yazılım ortaya çıkarır

Herkesin katkı sunabileceği, örneklerle zenginleşen bir başlık olmasını istiyorum.

Lütfen paylaşımlarınızı önce-sonra kod örnekleri ile izahlı yapmaya özen gösterin.
 
Ben başlayayım o halde;

Server\Source\game\char_battle.cpp:
Genişlet Daralt Kopyala
void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller)
Fonksiyonu içinde bu kod bloğu:
Server\Source\game\char_battle.cpp:
Genişlet Daralt Kopyala
    int iAlignIndex;

    if (GetRealAlignment() >= 120000)
    {
        iAlignIndex = 0;
    }
    else if (GetRealAlignment() >= 80000)
    {
        iAlignIndex = 1;
    }
    else if (GetRealAlignment() >= 40000)
    {
        iAlignIndex = 2;
    }
    else if (GetRealAlignment() >= 10000)
    {
        iAlignIndex = 3;
    }
    else if (GetRealAlignment() >= 0)
    {
        iAlignIndex = 4;
    }
    else if (GetRealAlignment() > -40000)
    {
        iAlignIndex = 5;
    }
    else if (GetRealAlignment() > -80000)
    {
        iAlignIndex = 6;
    }
    else if (GetRealAlignment() > -120000)
    {
        iAlignIndex = 7;
    }
    else
    {
        iAlignIndex = 8;
    }

Refaktör edilmeli, çünkü;
C++:
Genişlet Daralt Kopyala
GetRealAlignment()
Fonksiyonu dokuz kere çağırılıyor, ayrıca denetlemesi zor, bozması kolay.

Bu kod bloğunu refaktör edip şu şekilde yazarak iyileştirebiliriz:
Server\Source\game\char_battle.cpp:
Genişlet Daralt Kopyala
Arayın:

void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller)
  
Üzerine yardımcı fonksiyonu ekleyin:

static constexpr int GetAlignIndex(int align)
{
    if (align >= 120000) return 0;
    if (align >= 80000)  return 1;
    if (align >= 40000)  return 2;
    if (align >= 10000)  return 3;
    if (align >= 0)      return 4;
    if (align > -40000)  return 5;
    if (align > -80000)  return 6;
    if (align > -120000) return 7;
    return 8;
}

Şimdi ise o koca kod bloğu yerine sadece bunu yapıştırın:

    int iAlignIndex = GetAlignIndex(GetRealAlignment());

Bu Refaktörün Sağladığı Faydalar:
  • Tekrarlı fonksiyon çağrıları ortadan kaldırıldı. GetRealAlignment() fonksiyonu artık yalnızca bir kez çağrılıyor.
  • Kod okunabilirliği ciddi şekilde arttı. Uzun ve karmaşık if / else zinciri yerine, amacı net bir yardımcı fonksiyon kullanıldı.
  • Bakımı ve değiştirilmesi kolaylaştı. Alignment aralıkları tek bir yerde tanımlı. Değerler değişirse yalnızca bu fonksiyon güncellenir.
  • Hata yapma riski azaltıldı. Çok sayıda koşullu blok yerine, merkezi ve kontrollü bir mantık kullanıldı.
  • Modern C++ yaklaşımına daha uygun. constexpr kullanımı sayesinde derleyici optimizasyonlarına açık, niyeti net bir kod elde edildi.
  • Davranış değişmeden iyileştirme yapıldı. Mevcut oyun mantığı korunarak sadece kod kalitesi artırıldı.
 
Geri
Üst