Dart
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.
Örnek çözümü göster
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();
}
Kendini test et
-
run metodu
app.____();
Cevabı göster
app.run();
-
MathApp neyi birleştirir?
- Yalnızca yorumları
- Yalnızca print'leri
- Yalnızca import'ları
- Repository ve generator'ı
Cevabı göster
Repository ve generator'ı — MathApp repository ve generator'ı bir kabukta birleştirir.
-
Birleştirme parçalarını eşleştir
- MathApp
- Uygulama kabı
- repository
- Veri katmanı
- generator
- Üretim katmanı
- run()
- Başlatma