CodeBlanks Logo Icon CodeBlanks

Birleştirme

Tüm uzman konularını birleştirerek çalışan bir mini uygulama yazarsın.

Birleştirme

Son derste tüm parçaları birleştiriyoruz: FFI servisi, kod üreticisi, repository ve DI kapsayıcısı bir MathApp kabuğunda toplanır. run metodu uygulamayı başlatır.

MathApp, bir MathRepository ve bir BindingGenerator alır. run metodu repository üzerinden toplama yapar ve generator ile bağlayıcı kod üretir.

Bu yapı, temiz bir giriş noktası sağlar: main yalnızca MathApp yaratır ve run çağırır. Tüm bağımlılıklar constructor ile enjekte edilir; test ve genişletme kolaydır.

Tam akış

Tam akış: NativeMathService (FFI) → ServiceContainer (DI) → MathRepository (veri) → MathApp (kabuk) → run (başlatma). Her katman bir öncekine arayüzle bağlanır.

main tüm parçaları kurar: servis yarat, kapsayıcıya kaydet, repository çöz, app yarat, run çağır. Bu, dependency injection'ın somut uygulamasıdır.

Bu proje, uzman seviyenin üç konusunu birleştirir: FFI (native entegrasyon), codegen (kod üretimi), architecture (katmanlı tasarım). Her biri kendi dersinde öğrenildi; burada gerçek bir uygulamada buluştu.

Uygulama MathApp ekle ve çalıştır

Aşağıdaki kodda ServiceContainer zaten tanımlı. Şimdi bir class MathApp tanımla: final MathRepository repository; final BindingGenerator generator; MathApp(this.repository, this.generator); void run() { print('app: ${repository.sum(7, 8)}'); print(generator.generate('MathApp')); }. main içinde final app = MathApp(repo, gen); yarat ve app.run(); çağır.

Başlangıç kodu

main.dart
import 'dart:ffi';

abstract class MathService {
  int add(int a, int b);
}

typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);

class NativeMathService implements MathService {
  final String bindingName;
  NativeMathService(this.bindingName);
  @override
  int add(int a, int b) => a + b;
  String describe() => 'native: $bindingName';
}

class NativeBinding {
  final String name;
  const NativeBinding(this.name);
}

class BindingGenerator {
  String generate(String className) => '// generated binding for $className';
}

class MathRepository {
  final MathService service;
  MathRepository(this.service);
  int sum(int a, int b) => service.add(a, b);
}

class ServiceContainer {
  final Map<String, dynamic> _services = {};
  void register(String key, dynamic service) => _services[key] = service;
  T resolve<T>(String key) => _services[key] as T;
}

// MathApp sınıfını tanımla (repository ve generator alanları; run metodu)

void main() {
  print('servis hazır');
  final svc = NativeMathService('native_add');
  print(svc.describe());
  print('sonuç: ${svc.add(2, 3)}');
  final gen = BindingGenerator();
  print(gen.generate('NativeMathService'));
  final container = ServiceContainer();
  container.register('math', NativeMathService('native_add'));
  final repo = MathRepository(container.resolve<NativeMathService>('math'));
  print('repo: ${repo.sum(4, 6)}');
  // bir MathApp yarat; run ile başlat
}

Örnek çözüm

main.dart
import 'dart:ffi';

abstract class MathService {
  int add(int a, int b);
}

typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);

class NativeMathService implements MathService {
  final String bindingName;
  NativeMathService(this.bindingName);
  @override
  int add(int a, int b) => a + b;
  String describe() => 'native: $bindingName';
}

class NativeBinding {
  final String name;
  const NativeBinding(this.name);
}

class BindingGenerator {
  String generate(String className) => '// generated binding for $className';
}

class MathRepository {
  final MathService service;
  MathRepository(this.service);
  int sum(int a, int b) => service.add(a, b);
}

class ServiceContainer {
  final Map<String, dynamic> _services = {};
  void register(String key, dynamic service) => _services[key] = service;
  T resolve<T>(String key) => _services[key] as T;
}

class MathApp {
  final MathRepository repository;
  final BindingGenerator generator;
  MathApp(this.repository, this.generator);
  void run() {
    print('app: ${repository.sum(7, 8)}');
    print(generator.generate('MathApp'));
  }
}

void main() {
  print('servis hazır');
  final svc = NativeMathService('native_add');
  print(svc.describe());
  print('sonuç: ${svc.add(2, 3)}');
  final gen = BindingGenerator();
  print(gen.generate('NativeMathService'));
  final container = ServiceContainer();
  container.register('math', NativeMathService('native_add'));
  final repo = MathRepository(container.resolve<NativeMathService>('math'));
  print('repo: ${repo.sum(4, 6)}');
  final app = MathApp(repo, gen);
  app.run();
}

Beklenen çıktı

servis hazır
native: native_add
sonuç: 5
// generated binding for NativeMathService
repo: 10
app: 15
// generated binding for MathApp

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 run metodu

Soru
app.____();
Cevap
app.run();

Açıklama: run metodu uygulamayı başlatır.

2 MathApp neyi birleştirir?

  • Yalnızca yorumları
  • Yalnızca print'leri
  • Yalnızca import'ları
  • Repository ve generator'ı Doğru cevap

Açıklama: MathApp repository ve generator'ı bir kabukta birleştirir.

3 Birleştirme parçalarını eşleştir

Kavram Anlamı
MathApp Uygulama kabı
repository Veri katmanı
generator Üretim katmanı
run() Başlatma

Uzman bölümündeki tüm dersler