Thread overview
UFCS ile Metod Yazmak
Mar 13, 2022
dunecourser
Mar 13, 2022
Ali Çehreli
Mar 13, 2022
Salih Dincer
Mar 13, 2022
Ali Çehreli
March 13, 2022

UFCS ile:

struct Köpek
{
    uint yaş;
    char[32] isim;
}

char[32] havla(Köpek k)
{
    return "Hav hav!";
}

uint köpekYılınaGöreYaş(Köpek k)
{
    return k.yaş * 7;
}

int main(int argc, const(char)** argv)
{
    Köpek k = Köpek(3, "D'og");
    assert(k.köpekYılınaGöreYaş == 21); // köpekYılınaGöreYaş(k)
    assert(k.havla == cast(char[32])"Hav hav!"); // havla(k)

    return 0;
}

Metotlar İle

struct Köpek
{
    uint yaş;
    char[32] isim;

    char[32] havla()
    {
        return "Hav hav!";
    }

    uint köpekYılınaGöreYaş()
    {
        return yaş * 7;
    }
}

int main(int argc, const(char)** argv)
{
    Köpek k = Köpek(3, "D'og");
    assert(k.köpekYılınaGöreYaş == 21); // k.köpekYılınaGöreYaş()
    assert(k.havla == cast(char[32])"Hav hav!"); k.havla()

    return 0;
}

İki sorum var:

I. D'nin structları nasıl C'ninkinden daha low-level tanımlanıyor; Gerçekten bilmiyorum inline assembly özelliği olan bir dil, falan filan ayrıntıları atladığımızda, zaten en en en low-level hâle gelmiş olmaz mı? (C++'ınkiler nasıl D'nin classlarından daha low-level de diyebiliriz. Yani demek istediğim şu: structlarımızın özelliklerini, atıyorum, ilkleyebildiğimiz için mi D, C'ninkilerden daha low level?)

II. UFCS kullanarak overloading ederek struct özel hâle getirdiğimiz fonksiyonların, sıradan tür metotları yazmaktan farkı nedir, bence betterC için epey hoş aslında ama merak ettiğim şey neyi farklı yaptığı, belki avantajları veya dezavantajları.

March 12, 2022
Merhaba! :)

On 3/12/22 16:36, dunecourser wrote:
> **UFCS ile:**
> ```d
> struct Köpek
> {
>      uint yaş;
>      char[32] isim;

Belki özel bir amacı vardır ama D'de normalde string kullanıyoruz:

  string isim;

Ama tabii 32 karakterin yeterli olduğu durumlarda char[32] de çok uygun. Bir hatırlatma daha: O 32 char "32 harf değil, 32 UTF-8 kodudur". Dolayısıyla aslında örneğin 16 tane 'ğ' barındırabilir.

>      assert(k.havla == cast(char[32])"Hav hav!"); // havla(k)

Genel bir kural olarak da her 'cast' kullandığımızda da daha uygun bir durumu gözden kaçırmış olabiliriz diye düşünmek gerek. :)

> İki sorum var:
>
> I. D'nin `struct`ları nasıl C'ninkinden daha low-level tanımlanıyor;

Doğru değil. Ben D ve C yapılarını aynı derecede alt düzey görüyorum. (?)

> zaten en en en low-level hâle gelmiş olmaz mı?

Olur. Veya şöyle diyebiliriz: Derlendiğinde zaten mikroişlemcinin diline inmiştir.

> (C++'ınkiler nasıl D'nin `class`larından daha low-level de
> diyebiliriz.

Ben onları da aynı düzeyde görüyorum. D'nin sınıfları referans türüdürler; belki o açıdan öyle mi düşünülebilir? (Doğrusu, C++'nın sınıfları da aslında referans türüdür çünkü öyle kullanılmadıkları hemen her durumda hatalıdır. (Bakınız "slicing".)

> II. UFCS kullanarak overloading ederek `struct` özel hâle getirdiğimiz
> fonksiyonların, sıradan tür metotları yazmaktan farkı nedir,

Hiçbir farkı yok. Ben genel programcılık öğüdü olarak yapıları olabildiğince küçük tutmaya çalışırım. Yapının işlevleri yalnızca o yapının değişmezlerini (invariant) sağlamak için bulunmalıdır. Veya üyeleri getter/setter da denen işlevler arkasına saklayarak korumak için...

Ben artık her kodumu şöyle yazıyorum:

- Her işlev öncelikle serbest işlev olarak yazılıyor

- Yapılar olabildiğince basit değer türleri oluyorlar

- İşlevler gerektikçe yapılara taşınıyor

Böyle "sorumsuz" :) programcılık bana çok kolay ve çok etkin geliyor.

> şey neyi farklı yaptığı, belki avantajları veya dezavantajları.

Ben D'yi C ve C++ ile aynı yerde tutuyorum. Farkları var ama hiçbirisi çok büyük değil:

- D'nin dizileri süper ama std::vector gibi

- D'nin çöp toplayıcısı var

- Sınıflar referans türleri

- Daha bir sürü kolaylığı var...

Bunlar dışında temelde bir fark olduğunu düşünmüyorum.

Ali

March 13, 2022

Bu konular hakkında en kısassından diyebilirim ki kodlar karmaşıklaştıkça yapılar (yerine göre sınıflar) şart! Çünkü ortada dolaşan bir sürü bi'şeye biraz sonra baktığında neydi, ne işe yarar diye uzunca düşünürsün; kodu sen yazmış olsan bile.

Abartmıyorum, ama güldürmek için söyleyeyim; aralıksız yazım esnasında bile "ula bu da ne şimdi" der durursun!

Ha, sınıf kullanman çok da şart değil hani ama bir konu hakkında 2 işlev hadi 2 de değişken oluştu mu sal gitsin yapıyı.

Hele ki yapı değişkenlerine birlik (union) işlevlerine de yükleme (overloading) yaptın mı tadından yenmez. Dil ile öyle uyumlu çalışmaya başlar ki her şey derli toplu ve tıkırında ilerler. İşin güzeli de ne biliyor musun: yapı/sınıf dışında hala bağımsız işlevler (hatta main içinde veya işlevin de içinde işlev) kullanmaya devam edebilirsin. Bunları yapılarla kullandığında duruma göre kolaylık işlevi veya yapıyı işlev ile sarmaladığında Harry Potter'ın burunsuz karakter Voldemort olarak çıkar.

Voldemort yapılar/türler çok güzeldir bu arada. Ortada bir yapı vardır ama işlev içinde hapsolmuş gibidir ve dilersen kopyalarını çıkarabilir bir sihirbaz gibi kullanabilirsin. Tıpkı filmdeki karakterin yaptığı gibi. Bu konuda yazdığım birkaç başlık var. Uygulayıp denemeni salık veririm.

On Sunday, 13 March 2022 at 00:36:55 UTC, dunecourser wrote:

>

UFCS kullanarak overloading ederek struct özel hâle getirdiğimiz fonksiyonların, sıradan tür metotları yazmaktan farkı nedir, bence betterC için epey hoş aslında ama merak ettiğim şey neyi farklı yaptığı, belki avantajları veya dezavantajları.

Bildiğim kadarıyla UFCS, dile sonradan eklenen (her şey ECMA Script gibi oldu) ve daha genel bir konu.

Yapıların özel işlevlerini(function) yükle
me olayı da sanırım C++'da da olan ama D'de zirve yapmış bir konu. Ali hocam daha yetkin anlatacaktır.

Başarılar...

March 13, 2022
On 3/12/22 22:22, Salih Dincer wrote:

> Yapıların özel işlevlerini(function) yükle
> me olayı da sanırım C++'da da olan ama D'de zirve yapmış bir konu.

Yükleme (overloading) de C++ ve D'de aynı. D'nin bu konuda üstünlüğü varsa ben bilmiyorum veya şimdi hatırlamıyorum. :)

Ali