Thread overview
Interface ile kendini kısıtlamak!
Nov 03, 2021
Salih Dincer
Nov 03, 2021
Ali Çehreli
Nov 03, 2021
Salih Dincer
Nov 03, 2021
Ferhat Kurtulmuş
November 03, 2021

Merhaba,

Sonda çıkaracağım sonucu/soruyu başta soruyorum: Override imkanı varken interface türünde abstract benzeri sınıf görünümlü şeyler ne işe yarar, DI için mi?

Konuyu ilk olarak geçen ay dile getirmiş ve şuraya kısa bir inceleme olarak bildirmiştim:

https://forum.dlang.org/post/trfaapnxvlozbxeceuog@forum.dlang.org

Diğer başlıkta tipik bir DI örneği mevcut. Ama bugün bir şey keşfettim; sanki interface boşa zaman kaybı ve kafa karıştırıcı. Aynı kodu gereksiz kısımlarını gizleyerek naklediyorum:

class/*
interface //*/
IConnection {
  string SendMsg() { return ">IConnection"; }
}

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

class EMAILConnection : IConnection {
  override string SendMsg() {
    return "Sending an e-Mail...";
  }
}
/*
class ConnectionSetup {
  private IConnection connection;

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

  string Service() {
    return connection.SendMsg();
  }
}
*/
import std.stdio;

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

  foreach(connect; services) {
    //connect.Service.writeln();/*
    connect.SendMsg.writeln();//*/
  }
  typeof(services).stringof.writeln;
}

Özetle aynı sonucu elde ediyorsak neden sağ elimizi boynumuz çevresinden çevirip sol kulağımızı tutmaya çalışıyoruz ki!

Neredeyse 50 satırlık bir kodu yarı yarıya indirmek ve gereksiz bir helper (ConnectionSetup)'dan kurtulmak mümkünken, override olanağına teşekkür etmek geçiyor içimden 😀

Sevgiler, saygılar...

November 03, 2021
Bu mesajını da tam anlayamadım. :)

On 11/2/21 10:45 PM, Salih Dincer wrote:

> sanki interface boşa zaman kaybı ve kafa karıştırıcı.

Ben 'interface'i arayüzü belirlemek için çok uygun buluyorum. Genellikle arayüz düzeyinde işlev gerçekleştirmesi olmadığından yalnızca işlevin tanımını veriyoruz. Öyle yapınca sonra 'override' sözcüğüne de gerek kalmıyor:

interface IConnection {
  string SendMsg();
}

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

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

import std.stdio;

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

  foreach(connect; services) {
    connect.SendMsg.writeln();
  }
  typeof(services).stringof.writeln;
}

Benimkinde de ConnectionSetup yok. (?) Benim kodumdaki tek sorun, senin yaptığın gibi dizi tanımlayınca, elemanlar Object olmasınlar diye cast kullanmak zorunda kaldım. Onun yerine örneğin şöyle de yapabilirdim:

  IConnection[] services;
  services ~= SMS;
  services ~= EMAIL;

Ali


November 03, 2021

On Wednesday, 3 November 2021 at 08:13:40 UTC, Ali Çehreli wrote:

>

Benimkinde de ConnectionSetup yok. (?) Benim kodumdaki tek sorun, senin yaptığın gibi dizi tanımlayınca, elemanlar Object olmasınlar diye cast kullanmak zorunda kaldım.

Harika! Interface'lere bağlı sınıfları ekstra helper kullanmadan array&foreach kullanımını yapabildiğimize çok sevindim. Zaten bunu İngilizce forumda şurada dile getirmiştim:
https://forum.dlang.org/thread/tydqchcukdymaczuvthf@forum.dlang.org

Ama 1 kişi dışında kimsenin ilgisini çekmedi sanırım. Yine de override kullanımı daha çok ilgimi çekiyor işte n'apayım! Çünkü interface yerine pekala abstract class daha işlevsel görünüyor:

abstract class IConnection {
  struct Message {
    string s = "Sending ";
    string r = "Receiving ";
  } Message msg;

  string srvStatus(bool sending);
}

class SMSConnection : IConnection {
  override string srvStatus(bool mode) {
    auto result = mode ? msg.s : msg.r;
    return result ~ "an SMS...";
  }
}

class EMAILConnection : IConnection {
  override string srvStatus(bool mode) {
    auto result = mode ? msg.s : msg.r;
    return result ~ "an e-Mail...";
  }
}
import std.stdio;
void main() {
  auto services = cast(IConnection[])
  [
    new SMSConnection(),
    new EMAILConnection()
  ];

  foreach(connect; services) {
    connect.
    srvStatus(false).
    writeln();
  }
}
/*
   Receiving an SMS...
   Receiving an e-Mail...
*/
November 03, 2021

On Wednesday, 3 November 2021 at 14:12:08 UTC, Salih Dincer wrote:

>

On Wednesday, 3 November 2021 at 08:13:40 UTC, Ali Çehreli wrote:

>

[...]

Harika! Interface'lere bağlı sınıfları ekstra helper kullanmadan array&foreach kullanımını yapabildiğimize çok sevindim. Zaten bunu İngilizce forumda şurada dile getirmiştim:
https://forum.dlang.org/thread/tydqchcukdymaczuvthf@forum.dlang.org

[...]

Çoklu miras söz konusu değilse bence de interface çok gerekli değil.