GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

[RAGE-MP] Kod Kalitesini Artıracak 10 Design Pattern

Başlatan Krips Je, 18 Nisan 2025, 23:44:06

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Krips Je

Merhaba, Ben Krips.

Bu konuda sizlere RAGE:MP projelerinde kod kalitesini artıracak, sürdürülebilirliği kolaylaştıracak ve profesyonel yazılım mimarisine katkı sağlayacak 10 farklı Design Pattern'i anlatacağım. Her biri örneklerle desteklenecek ve gerçek dünya kullanım senaryolarına göre açıklanacak.

Bu sadece büyük projeler için değil, küçük sistemlerde bile işinizi kolaylaştıracak mimari prensiplerdir. Hazırsanız başlıyoruz... :oku2:



1. Singleton Pattern - Tekil Nesne Kullanımı

Sunucu projelerinde bazı sistemlerin tek bir örneği olmalıdır. Örneğin: Logger, Config, Database bağlantısı gibi.

Yanlış Kullanım: Her seferinde yeni nesne üretmek.
Doğru Kullanım: Tek örneğe erişim sağlamak.

Kod (js) Seç
class Logger {
  constructor() {
    if (Logger.instance) return Logger.instance;
    Logger.instance = this;
  }

  log(msg) {
    console.log(`[LOG]: ${msg}`);
  }
}

const logger = new Logger();
logger.log("Sunucu başlatıldı.");

Avantajı: Bellek verimliliği, merkezi kontrol, yönetilebilirlik.



2. Factory Pattern - Nesne Üretimi Kolaylaştırmak

Farklı türde nesneleri oluştururken, yapıcıyı doğrudan çağırmak yerine bir "üretici fonksiyon" üzerinden oluşturmak, kodu daha esnek hale getirir.

Örnek Kullanım: NPC, araç, görev nesnesi üretimi.

Kod (js) Seç
class VehicleFactory {
  static create(type, pos) {
    if (type === "police") return mp.vehicles.new(596, pos);
    if (type === "ambulance") return mp.vehicles.new(416, pos);
  }
}

let car = VehicleFactory.create("police", new mp.Vector3(0, 0, 0));

Avantajı: İhtiyaca göre farklı nesne üretimi, kod tekrarı engellenir.



3. Adapter Pattern - Uyum Sağlamak

Bu desen, eski sistemler ile yeni sistemler arasında köprü kurar. Örneğin: Veritabanı sürümünü değiştirdiniz ama eski fonksiyonlarınızı bozmadan kullanmak istiyorsunuz.

Kod (js) Seç
// Yeni DB
class NewDB {
  fetchUser(id) {
    return db.query("SELECT * FROM users WHERE id = ?", [id]);
  }
}

// Adapter
class DBAdapter {
  constructor() {
    this.db = new NewDB();
  }

  getUser(id) {
    return this.db.fetchUser(id); // eski sistemin beklediği fonksiyon
  }
}

let database = new DBAdapter();
database.getUser(1);

Avantajı: Kod bozulmadan yeni sistemlerle uyumlu hale gelir.



4. Command Pattern - Emir Bazlı Sistem

Bu yapı, bir işlemi komut olarak soyutlar. Özellikle admin komutları, UI tuşları veya görev emirleri için kullanışlıdır.

Kod (js) Seç
class BanCommand {
  constructor(player, reason) {
    this.player = player;
    this.reason = reason;
  }

  execute() {
    this.player.kick(`Banlandın: ${this.reason}`);
  }
}

const cmd = new BanCommand(player, "Hile");
cmd.execute();

Avantajı: Komutları kayıt altına alabilir, sıralayabilir, geri alabilir hale getirir.



5. Decorator Pattern - Özellik Genişletme

Bir sınıfın davranışını değiştirmeden, yeni özellikler eklemeni sağlar. Örneğin oyuncuya geçici bir güçlendirme vermek.

Kod (js) Seç
function withGodMode(player) {
  player.godMode = true;
  player.outputChatBox("Artık ölümsüzsün!");
  return player;
}

player = withGodMode(player);

Avantajı: Kalıtım kullanmadan esneklik sağlar.



6. Strategy Pattern - Davranışları Değiştirilebilir Yapmak

Her farklı davranışı bir strateji sınıfı/fonksiyonu olarak tanımlayıp oyuncuya özel uygulayabilirsin.

Kod (js) Seç
class AggressiveStrategy {
  act(player) {
    player.call("doAggressiveAction");
  }
}

class PassiveStrategy {
  act(player) {
    player.call("doPassiveAction");
  }
}

function assignStrategy(player) {
  player.strategy = player.rank > 5 ? new AggressiveStrategy() : new PassiveStrategy();
}

player.strategy.act(player);

Avantajı: if/else karmaşası olmadan davranışları değiştirmek mümkün.



7. Observer Pattern - Takip Et ve Tepki Ver

Event bazlı yapılarda, bir olay gerçekleştiğinde birçok sistemin bundan haberdar olması gerekebilir.

Kod (js) Seç
class PlayerLevelUp {
  constructor() {
    this.listeners = [];
  }

  subscribe(cb) {
    this.listeners.push(cb);
  }

  notify(player) {
    this.listeners.forEach(cb => cb(player));
  }
}

const levelUp = new PlayerLevelUp();

levelUp.subscribe(player => db.saveLevel(player));
levelUp.subscribe(player => player.call("updateLevelUI"));

levelUp.notify(player);

Avantajı: Olaylara çok sayıda modül tepki verebilir. Modülerlik sağlar.



8. Middleware Pattern - Adım Adım İşlem

Sunucuya gelen talepler, kontrol zincirinden geçerek işlenir. Örneğin: kimlik kontrolü, yetki, loglama.

Kod (js) Seç
function authMiddleware(player, next) {
  if (!player.loggedIn) return;
  next();
}

function permissionMiddleware(player, next) {
  if (!player.isAdmin) return;
  next();
}

function executeCommand(player) {
  player.outputChatBox("Komut çalıştı!");
}

function runMiddlewares(player, middlewares) {
  const exec = index => {
    if (index >= middlewares.length) return;
    middlewares[index](player, () => exec(index + 1));
  };
  exec(0);
}

runMiddlewares(player, [authMiddleware, permissionMiddleware, executeCommand]);

Avantajı: Her işlemi ayrı fonksiyona ayırarak temiz kod ve denetlenebilirlik sağlar.



9. Builder Pattern - Karmaşık Nesneleri Parça Parça Oluştur

Karmaşık nesneleri adım adım oluşturmak için kullanılır. Özellikle görev, karakter, araç tanımı gibi çok parametreli sistemlerde idealdir.

Kod (js) Seç
class VehicleBuilder {
  constructor() {
    this.data = {};
  }

  setModel(model) {
    this.data.model = model; return this;
  }

  setColor(color) {
    this.data.color = color; return this;
  }

  build() {
    return mp.vehicles.new(this.data.model, this.data.pos, { color: this.data.color });
  }
}

let car = new VehicleBuilder().setModel(411).setColor([255, 0, 0]).build();

Avantajı: Parametre sayısı arttıkça yönetimi kolaylaştırır.



10. Proxy Pattern - Erişimi Kontrol Et

Gerçek objeye erişimi sınırlamak için bir aracı sınıf kullanılır. Özellikle güvenlik, loglama ve API sınırlandırmaları için ideal.

Kod (js) Seç
class Inventory {
  use(item) {
    console.log(`Kullanıldı: ${item}`);
  }
}

class InventoryProxy {
  constructor(player) {
    this.player = player;
    this.realInventory = new Inventory();
  }

  use(item) {
    if (!this.player.loggedIn) return;
    this.realInventory.use(item);
  }
}

let inv = new InventoryProxy(player);
inv.use("healthkit");

Avantajı: Kontrol mekanizması eklenebilir, güvenlik sağlanır.



Final Notlar

Bu design patternler RAGE:MP de sistematik, modüler, sürdürülebilir kod yazmanızı sağlar. Büyük projelerde kodun okunabilirliğini, yeniden kullanılabilirliğini ve test edilebilirliğini artırır. Her sistemde hepsi kullanılmasa da, uygun yerlerde hayat kurtarır.

Yorumlarda sizin önerdiğiniz patternler varsa memnuniyetle eklerim. Daha fazlası için takipte kalın, görüşmek dileğiyle ! :serefe:


"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı
    

Krips Je

Eğer yorgun olmazsam az sonra anticheat hakkındada bir konu oluşturmayı düşünüyorum. bu konu hakkında olan fikirlerinizi bekliyorum  :oku2:

"Kodunu yaz, gerisini compiler düşünsün." - Meçhul Yazılımcı