Menu
Coddy logo textTech

Arayüzleri Uygulama

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 61.

Artık yalnızca işaretçi içeren bir yapı olan arayüzün 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 arayüzü uygulamak için LogFunc imzasıyla eşleşen gerçek işlevler yazar, ardından bu işlevleri atayarak ILogger örnekleri oluştururuz:

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 "constructor" işlevi, içine farklı bir işlev bağlanmış bir ILogger döndürür. Bu günlükleyicileri 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

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

Kodunu üç dosyaya ayıracaksın:

  • notifier.h: Arayüzü burada tanımla. NotifyFunc türünde bir mesaj alan ve hiçbir şey döndürmeyen const char* adlı bir işaretçi türü oluştur. Ardından yalnızca bu türde bir INotifier işlev işaretçisi içeren bir notify yapısı tanımla. Ayrıca her biri değer olarak bir create_email_notifier döndüren iki kurucu işlev bildir: create_sms_notifier ve INotifier.
  • notifier.c: Somut bildirim işlevlerini ve kurucuları burada uygula. Şunları oluştur:
    • email_notify: Mesajı şu biçimde yazdırır: [EMAIL] message
    • sms_notify: Mesajı şu biçimde yazdırır: [SMS] message
    • create_email_notifier: INotifier işlevine bağlanmış bir email_notify döndürür
    • create_sms_notifier: INotifier işlevine bağlanmış bir sms_notify döndürür
  • main.c: Her şeyi burada bir araya getir. Bir bildirim türü ve mesaj oku, kurucu işlevleri kullanarak uygun bildirimciyi oluştur ve bildirimi arayüz üzerinden gönder.

Programın iki girdi alacak: bir bildirim türü (e-posta için 1, SMS için 2) ve gönderilecek bir mesaj.

Uygun bildirimciyi oluşturmak için kurucu işlevleri kullan, ardından mesajı görüntülemek için arayüz üzerinden notify işlevini çağır.

Türün 1 ve mesajın Meeting at 3pm olduğu durumdaki örnek çıktı:

[EMAIL] Meeting at 3pm

Türün 2 ve mesajın Your code shipped olduğu durumdaki örnek çıktı:

[SMS] Your code shipped

Bu tasarım deseninin gücü, main.c dosyasının her bildirimcinin dahili olarak nasıl çalıştığını bilmek zorunda olmamasıdır. Yalnızca arayüzün notify işlevini çağırır ve doğru uygulama çalışır. Başlık dosyanda 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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi