Menu
Coddy logo textTech

Arayüzleri Uygulama

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 41 / 61.

Artık yalnızca function pointer’ları içeren bir struct olan interface’in ne olduğunu anladığınıza göre, bu sözleşmeyi yerine getiren somut uygulamalar oluşturmanın zamanı geldi.

Önceki dersteki ILogger arayüzümüzü hatırlayın:

typedef void (*LogFunc)(const char* message);

typedef struct {
    LogFunc log;
} ILogger;

Bu interface'i uygulamak için, LogFunc imzasıyla eşleşen gerçek functions yazar, ardından bu functions atanmış şekilde ILogger örnekleri create ederiz:

void console_log(const char* message) {
    printf("[CONSOLE] %s\n", message);
}

void file_log(const char* message) {
    printf("[FILE] %s\n", message);  // Dosya çıktısını simüle etme
}

ILogger create_console_logger() {
    ILogger logger = { console_log };
    return logger;
}

ILogger create_file_logger() {
    ILogger logger = { file_log };
    return logger;
}

Her bir "constructor" function, farklı bir function bağlanmış bir ILogger döndürür. Bu logger'ları kullanan kodun hangi uygulamayı aldığını bilmesine gerek yoktur:

void do_work(ILogger* logger) {
    logger->log("Starting work...");
    logger->log("Work complete!");
}

int main() {
    ILogger console = create_console_logger();
    ILogger file = create_file_logger();
    
    do_work(&console);  // console_log kullanır
    do_work(&file);     // file_log kullanır
    return 0;
}

do_work işlevi, günlük kaydı uygulamasından tamamen bağımsızdır. Temel mantığı değiştirmeden günlük kaydı araçlarını özgürce değiştirebilirsin: bir arayüze programlamanın gücü budur.

challenge icon

Görev

Kolay

Her iki uygulamanın da aynı arayüz sözleşmesini nasıl karşılayabileceğini gösteren bir INotifier sistemi oluşturalım. Ortak bir arayüze uyan ancak farklı çıktılar üreten somut bildirimciler, bir EmailNotifier ve bir SMSNotifier oluşturacaksın.

kodunu üç dosya arasında düzenleyeceksin:

  • notifier.h: Arayüzü burada Define et. const char* türünde bir message alan ve hiçbir şey döndürmeyen NotifyFunc adlı bir function pointer türü Create et. Ardından yalnızca bu türde bir notify function pointer içeren bir INotifier struct tanımla. Ayrıca her biri değer olarak bir INotifier döndüren iki constructor function bildir: create_email_notifier ve create_sms_notifier.
  • notifier.c: Somut bildirim function'larını ve constructor'ları burada Implement et. Şunları Create et:
    • email_notify: message'ı şu formatta yazdırır: [EMAIL] message
    • sms_notify: message'ı şu formatta yazdırır: [SMS] message
    • create_email_notifier: email_notify'a bağlanmış bir INotifier döndürür
    • create_sms_notifier: sms_notify'a bağlanmış bir INotifier döndürür
  • main.c: Her şeyi burada bir araya getir. Bir notification type ve bir message oku, constructor function'larını kullanarak appropriate notifier'ı Create et ve notification'ı arayüz üzerinden gönder.

Programın iki girdisi olacak: bir notification type (email için 1, SMS için 2) ve gönderilecek bir message.

Appropriate notifier'ı Create etmek için constructor function'larını kullan, ardından message'ı görüntülemek üzere arayüz üzerinden notify'ı Call et.

type 1 ve message Meeting at 3pm olduğunda örnek çıktı:

[EMAIL] Meeting at 3pm

type 2 ve message Your code shipped olduğunda örnek çıktı:

[SMS] Your code shipped

Bu pattern'in gücü, main.c'in her notifier'ın dahili olarak nasıl çalıştığını bilmek zorunda olmamasıdır. Yalnızca arayüzün notify function'ını Call eder ve doğru Implementasyon çalışır. Header file'ında include guard'ları kullanmayı unutma.

Kendin dene

#include <stdio.h>
#include "notifier.h"

int main() {
    int type;
    char message[256];
    
    // Bildirim türünü oku (1 e-posta için, 2 SMS için)
    scanf("%d", &type);
    getchar(); // yeni satırı tüket
    
    // Mesajı oku
    fgets(message, sizeof(message), stdin);
    // Varsa sondaki yeni satırı kaldır
    int len = 0;
    while (message[len] != '\0') len++;
    if (len > 0 && message[len-1] == '\n') message[len-1] = '\0';
    
    // TODO: Türe göre uygun notifier'ı oluştur
    // type 1 için create_email_notifier() kullan
    // type 2 için create_sms_notifier() kullan
    
    // TODO: Arayüz üzerinden notify fonksiyonunu çağır
    // notifier.notify(message);
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi