Thread overview
Ekim 2021 - Zoom Toplantısı İçin Konular
September 22

Merhaba,

Okullar açıldı ve ayın ortasını da geçtik. Toplantıya (ayın 3'üne) az bir zaman kaldı. Fikirleri ve/veya merak ettiğiniz konu/soruları alabilir miyiz?

Örneğin, (tabi Sevgili Hüseyin katılırsa) oyun mevzularına bir giriş yapalım demiştik. Eylül'de bunu sonraki aya erteleme kararı aldık; bu cepte! 2. olarak bense şunu merak ediyorum:

D'de DI (Dependency Injection)

Aslında daha çok interface'i bir dizi olarak tanımlayıp buna bağlı olan sınıfları diziye yerleştirip başka bir sınıfta foreach ile ortak property'lerine erişmek istiyorum. Galiba bir şeyleri yanlış yapıyorum ki önce şu hatayı aldım:

source_file.d(92): Error: new can only create structs, dynamic arrays or class objects, not `PCBs[]`'s

Kodu sonra paylaşacağım (çünkü biraz can çekişip öğrenme kalitesini arttırmalıyım!) ama hatalardan belli olduğu gibi PCBs isminde bir interface ve ona bağlı 2 sınıfım var. Bu sınıflar içinde de ortak 2 işlevim ben çalıştım diyor. Sonra kendi instance'ları yerine interface'i kullanmaya çalıştım ama olmadı şu hatayı aldım.

products.d(92): Error: cannot create instance of interface `PCBs`

Neyse çok uzattım, işte bu ay benim için OOP'da DI yörüngesinde geçmekte...:)

Sevgiler, saygılar...

September 27

On Wednesday, 22 September 2021 at 07:38:20 UTC, Salih Dincer wrote:

>

D'de DI (Dependency Injection)

Aslında daha çok interface'i bir dizi olarak tanımlayıp buna bağlı olan sınıfları diziye yerleştirip başka bir sınıfta foreach ile ortak property'lerine erişmek istiyorum.

IConnection isminde bir arayüzümüz (interface) ve iki de ona bağlı kurucusu olmayan tek üyeli sınıflarımız varsa...

interface IConnection {
  string SendMsg();
}

class SMSConnection : IConnection {
  string SendMsg() {
    return "Sending a SMS...";
  }
}

class EMAILConnection : IConnection {
  string SendMsg() {
    return "Sending an e-Mail...";
  }
}

Bir çizelgede görsel olarak şöyle gösterebiliriz:

string SendMsg(); IConnection
class SMSConnection auto SMS
class EMAILConnection auto EMAIL

Bu sınıflar ile tek bağımız, new işleçi ile oluşturup sınıf düzeyinde SMS ve EMAIL olarak referanslarını tutmak...

import std.stdio;

void main() {
  auto SMS = new SMSConnection();
  auto EMAIL = new EMAILConnection();
  auto services = [
    new ConnectionSetup(SMS),
    new ConnectionSetup(EMAIL)
  ];

  foreach(connect; services) {
    connect.Service.writeln();
  }
}

Normalde bu sınıflar (aslında X Service) interface'e bağlandığından tek instance'mış gibi aynı dizi içinde (Object[] olarak) birleştirmek mümkün ama foreach() ile erişirken hata alıyorum. Beraberinde override toString() dışında hatasız çalıştırmak mümkün değil.

En azından C#'da bu oluyorken D'de olmuyor! O yüzden kurala uygun olarak bir Helper tanımlıyorum. Kendisini aşağıda ve kullanışını yukarda main() içinde görmektesiniz.

class ConnectionSetup {
  private IConnection connection;

  this(IConnection connection) {
    this.connection = connection;
  }

  string Service() {
    return connection.SendMsg();
  }
}

Veee tataaa, her şey yolunda ve tıkırında işliyor...

September 27

On Monday, 27 September 2021 at 07:01:55 UTC, Salih Dincer wrote:

>

On Wednesday, 22 September 2021 at 07:38:20 UTC, Salih Dincer wrote:
En azından C#'da bu oluyorken D'de olmuyor! O yüzden kurala uygun olarak bir Helper tanımlıyorum. Kendisini aşağıda ve kullanışını yukarda main() içinde görmektesiniz.

Bu arada hata aldığım daha doğrusu almadığım C# kodu aşağıda. Yapı olarak yukardakinden farkı yardımcı Helper sınıfının olmayışı. Amaç ise DI Container yapısından uzaklaşıp nesneleri bir liste üzerinde kaydını tutmak. Bu D'de çalışmıyor (en azında toString harici) ama aşağıdaki kod nedense işliyor!

using System;
using System.Collections.Generic;

namespace DIsample2 {
  interface IConnection {
    string SendMsg();
  }

  class SMSConnection : IConnection {
    public string SendMsg() {
      return "Sending a SMS...";
    }
  }

  class EMAILConnection : IConnection {
    public string SendMsg() {
      return "Sending an e-Mail...";
    }
  }

  public class Program {
    public static void Main(string[] args)
    {
      var SMS = new SMSConnection();
      var EMAIL = new EMAILConnection();
      var services = new List<IConnection> { SMS,EMAIL };

      foreach(var connect in services) {
        Console.WriteLine(connect.SendMsg());
      }
    }
  }
}
September 27
On 9/27/21 12:01 AM, Salih Dincer wrote:

> En azından C#'da bu oluyorken D'de olmuyor!

Programa yalnızca writeln'ın tanımlanmış olduğu std.stdio modülünü eklemek verdiğin kodların D'de de çalıştığını gösteriyor:

import std.stdio;  // <-- Tek eklediğim satır

interface IConnection {
  string SendMsg();
}

class SMSConnection : IConnection {
  string SendMsg() {
    return "Sending a SMS...";
  }
}

class EMAILConnection : IConnection {
  string SendMsg() {
    return "Sending an e-Mail...";
  }
}

class ConnectionSetup {
  private IConnection connection;

  this(IConnection connection) {
    this.connection = connection;
  }

  string Service() {
    return connection.SendMsg();
  }
}

void main() {
  auto SMS = new SMSConnection();
  auto EMAIL = new EMAILConnection();
  auto services = [
    new ConnectionSetup(SMS),
    new ConnectionSetup(EMAIL)
  ];

  foreach(connect; services) {
    connect.Service.writeln();
  }
}

Bu vesileyle, zaten bildiğinden emin olduğum bir kaç noktayı hatırlatmak istiyorum. :)

* Forumlarda "hata alıyorum" veya "D'de olmuyor" yerine tam olarak ne beklendiğini söylemek önemli. Çünkü derleme hatası mı, çalışma hatası mı, D'de zaten bulunmayan bir olanak mı, vs. anlaşılmıyor.

* Aylık buluşmalarımızda konuşacak konu fikri aramamın nedeni, "ne konuşsak acaba" diye birbirimizin yüzüne bakıp düşünmeyelim diye. Başka amacı da, baştan duyurursak belki bunları okuyan birilerinin de ilgisini çekebiliriz. Örneğin birisi "unittest nedir?" diyebilir. "Dependency injection" da güzel konu... Ama buradaki örnek kod, başlı başına bir konu olabilirmiş. Şimdi "toplantı için konular" başlığının altında gizlenmiş oldu. :)

* Bir önceki maddede anlaşıyorsak, her küçük soru kendi başlığında açılmalı ki forum da sanki canlanıyormuş gibi görünebilsin. :)

Bunları yazarken aklıma şöyle bir konu geldi: Derleyici, yukarıdaki kodu işletirken perde arkasında "virtual function table pointer" düzeneğinden nasıl yararlanıyor? Eğer ilgilenen olursa belki onun ayrıntılarını konuşuruz. (Bir zamanlar, C++ mülakatlarında adaylardan "nesne yönelimli programlama C'de de yapılabilir" diyenler olurdu. Ben de sözü çevirip "demin öyle demiştiniz; haydi, C'de nesne yönelimli programlama yapalım derdim. :) )

Ali


September 27

Kusura bakmayın hocam, şuraya bir konu gönderdim: https://forum.dlang.org/thread/tydqchcukdymaczuvthf@forum.dlang.org

Kendi dilim olmadığı için uzun uzadıya yazamadım.

Rafine bir şekilde Foo Bar ile kodladım.

Sonuç tür çıkarsama hatası.

Birkaç gündür kafayı yiyordum!

Sonunda çözdüm, yanş auto'ya çok güvenmemek lazım...