Temiz Mimarlık tepkisi / görüntü işlemek için (DIP takiben enjekte edilir) sunum gerçek uygulanmasını diyoruz interaktörüdür bir kullanım durumunda izin önerir. Ancak, bu mimariyi uygulayan, çıktı verilerini etkileşimden döndüren ve ardından denetleyicinin (bağdaştırıcı katmanındaki) nasıl işleyeceğine karar vermesine izin veren insanlar görüyorum. İkinci çözüm, uygulama sorumluluklarını uygulama katmanından dışarı atıyor mu, ayrıca etkileşimciye giriş ve çıkış portlarını net bir şekilde tanımlamamış mı?
Giriş ve çıkış portları
Temiz Mimari tanımını ve özellikle bir denetleyici, bir kullanım senaryosu etkileşimcisi ve sunum yapan arasındaki ilişkileri tanımlayan küçük akış şeması göz önüne alındığında , "Kullanım Durumu Çıktı Portunun" ne olması gerektiğini doğru bir şekilde anladığımdan emin değilim.
Temiz mimari, altıgen mimari gibi, birincil portlar (yöntemler) ve ikincil portlar (adaptörler tarafından uygulanacak arayüzler) arasında ayrım yapar. İletişim akışını takiben "Kullanım Durumu Giriş Bağlantı Noktası" nın birincil bir bağlantı noktası olmasını (bu nedenle sadece bir yöntem) ve "Kullanım Durumu Çıkış Bağlantı Noktasını" uygulanacak bir arabirim, belki de gerçek bağdaştırıcıyı alan bir yapıcı argümanı olmasını bekliyorum. Böylece etkileşici onu kullanabilir.
Kod örneği
Bir kod örneği yapmak için, bu denetleyici kodu olabilir:
Presenter presenter = new Presenter();
Repository repository = new Repository();
UseCase useCase = new UseCase(presenter, repository);
useCase->doSomething();
Sunucu arayüzü:
// Use Case Output Port
interface Presenter
{
public void present(Data data);
}
Son olarak, etkileşimin kendisi:
class UseCase
{
private Repository repository;
private Presenter presenter;
public UseCase(Repository repository, Presenter presenter)
{
this.repository = repository;
this.presenter = presenter;
}
// Use Case Input Port
public void doSomething()
{
Data data = this.repository.getData();
this.presenter.present(data);
}
}
Sunucuyu çağıran etkileşimde
Önceki yorumlama, yukarıda belirtilen diyagramın kendisi tarafından onaylanmış gibi görünmektedir, burada denetleyici ve giriş portu arasındaki ilişki, "keskin" bir kafa ("ilişkilendirme için UML" anlamına gelen "keskin" bir kafaya sahip olan katı bir okla temsil edilir; denetleyicinin "kullanım durumu" varken, sunucu ile çıktı portu arasındaki ilişki "beyaz" kafalı ("devralma" için UML, "uygulama" için değil, muhtemelen Zaten anlamı budur).
Ayrıca, başka bir soruya verilen bu cevapta , Robert Martin, tam olarak konuşmacının sunumcuyu okuma isteği üzerine çağırdığı bir kullanım durumunu açıklar:
Haritaya tıklamak, placePinController'ın çağrılmasını sağlar. Tıklamanın konumunu ve diğer tüm bağlamsal verileri toplar, bir placePinRequest veri yapısı oluşturur ve onu, iğnenin konumunu denetleyen, gerekirse doğrulayan, iğneyi kaydetmek için bir Yer varlığı oluşturan, bir EditPlaceReponse oluşturan bir Place öğesi oluşturan PlacePinInteractor'a iletir nesne ve yer editörü ekranını getiren EditPlacePresenter'a iletir.
Bunun MVC ile iyi bir şekilde oynamasını sağlamak için, geleneksel olarak kontrol cihazına girecek olan uygulama mantığının burada etkileşime girdiğini düşünüyorum, çünkü herhangi bir uygulama mantığının uygulama katmanının dışına sızmasını istemiyoruz. Bağdaştırıcılar katmanındaki denetleyici etkileşimi yalnızca çağırır ve işlem sırasında küçük bir veri biçimi dönüştürmesi yapabilir:
Bu katmandaki yazılım, verileri kullanım durumları ve varlıklar için en uygun formattan, Veri tabanı veya Web gibi bazı harici ajanslar için en uygun formata dönüştüren bir adaptörler setidir.
Orijinal makaleden Arayüz Adaptörleri hakkında konuşuyor.
Verileri dönen etkileşimli
Bununla birlikte, bu yaklaşımla ilgili sorunum, kullanım durumunun sunumun kendisiyle ilgilenmesi gerektiğidir. Şimdi, Presenter
arabirimin amacının birkaç farklı türdeki sunucuyu (GUI, Web, CLI, vb.) Temsil edecek kadar soyut olduğunu ve bunun gerçekten bir kullanım durumu olabilecek "çıktı" anlamına geldiğini görüyorum . çok iyi, ama yine de tamamen kendime güvenmiyorum.
Şimdi, temiz mimarinin uygulamaları için Web'in etrafına bakarken, yalnızca çıkış portunu bazı DTO'ları döndüren bir yöntem olarak yorumlayan insanları buluyorum. Bu gibi bir şey olurdu:
Repository repository = new Repository();
UseCase useCase = new UseCase(repository);
Data data = useCase.getData();
Presenter presenter = new Presenter();
presenter.present(data);
// I'm omitting the changes to the classes, which are fairly obvious
Bu caziptir çünkü sunumu "kullanım" durumunun dışına "çağırmak" sorumluluğunu taşıyoruz, bu nedenle kullanım durumu, yalnızca verileri sağlamak yerine verilerle ne yapılacağını bilmekle ilgilenmiyor. Ayrıca, bu durumda hala bağımlılık kuralını çiğnemiyoruz, çünkü kullanım durumu hala dış katman hakkında hiçbir şey bilmiyor.
Bununla birlikte, kullanım durumu, gerçek sunumun artık yapıldığı anı kontrol etmemektedir (bu, örneğin o noktada ek şeyler yapmak, kayıt yapmak ya da gerektiğinde tamamen iptal etmek için faydalı olabilir). Ayrıca, Case Case Portunu Kullandığımızı da fark ettiğimize dikkat edin, çünkü kontrolör sadece getData()
metodu kullanıyor (ki bu bizim yeni çıkış portumuzdur). Dahası, burada bana "söyleme, sorma" ilkesini çiğniyor olduğumuza bakıyor, çünkü etkileşimciden bazı verilerin, içinde gerçek şeyi yapmasını söylemek yerine onunla bir şeyler yapmasını istiyoruz. ilk yer.
Diyeceğim şey şu ki
Öyleyse, bu iki alternatiften herhangi biri, Clean Case'a Uygun Kullanım Case Çıkışı Portunun "doğru" yorumu mu? İkisi de uygulanabilir mi?