Arayüz Ayrışma İlkesi diyor ki:
Hiçbir müşteri, kullanmadığı yöntemlere bağımlı olmaya zorlanmamalıdır. İSS, çok büyük olan arayüzleri daha küçük ve daha spesifik arayüzlere böler, böylece müşteriler sadece ilgilendikleri yöntemleri bilmek zorunda kalırlar.
Burada cevaplanmamış birkaç soru var. Biri:
Ne kadar küçük?
Diyorsun:
Şu anda bunun için modülün ad alanını müşterilerinin gereksinimlerine göre bölerek başa çıkıyorum.
Bu manuel ördekle yazma diyorum . Yalnızca istemcinin neye ihtiyacı olduğunu ortaya koyan arabirimler oluşturursunuz. Arabirim ayırma prensibi basitçe manuel ördek yazma değildir.
Ancak ISS, yalnızca yeniden kullanılabilen "tutarlı" rol arabirimleri için bir çağrı değildir. Hiçbir "tutarlı" rol arayüz tasarımı, kendi rol ihtiyaçları ile yeni bir müşterinin eklenmesine karşı mükemmel bir koruma sağlayamaz.
İSS , müşterileri hizmette yapılan değişikliklerin etkisinden soyutlamanın bir yoludur. Değişiklik yaptıkça yapının daha hızlı gitmesi amaçlanmıştır. Elbette, müşterileri kırmamak gibi başka faydaları da var, ancak ana nokta buydu. Hizmetler count()
işlev imzasını değiştirirsem, kullanmayan istemcilerin count()
düzenlenmesi ve yeniden derlenmesi gerekmez.
Arayüz Ayrışma İlkesini NEDEN önemsiyorum. İnanç konusunda benim kadar önemli bir şey değil. Gerçek bir problemi çözer.
Dolayısıyla, uygulanması gereken yöntem sizin için bir sorunu çözmelidir. İSS'yi uygulamak için sadece gerekli bir değişikliğin doğru örneğiyle yenilemeyen beyin ölü bir yolu yoktur. Sistemin nasıl değiştiğine bakmanız ve işleri sessizleştirecek seçimler yapmanız gerekiyor. Seçenekleri inceleyelim.
İlk önce kendinize sorun: Servis arayüzünde değişiklik yapmak şu anda zor mu? Değilse, dışarı çıkın ve sakinleşene kadar oynayın. Bu entelektüel bir egzersiz değil. Lütfen tedavinin hastalıktan daha kötü olmadığından emin olun.
Birçok istemci aynı işlev alt kümesini kullanıyorsa, bu "tutarlı" yeniden kullanılabilir arabirimler anlamına gelir. Altküme muhtemelen hizmetin istemciye sağladığı rol olarak düşünebileceğimiz tek bir fikre odaklanır. Bu işe yaradığında güzel. Bu her zaman işe yaramaz.
Birçok istemci farklı işlev alt kümeleri kullanıyorsa, istemcinin hizmeti birden çok rol üzerinden kullanması mümkündür. Sorun değil ama rolleri görmeyi zorlaştırıyor. Onları bulun ve birbirinden ayırmaya çalışın. Bu durum bizi durum 1'e geri getirebilir. Müşteri hizmeti birden fazla arabirim üzerinden kullanır. Lütfen hizmeti yayınlamaya başlamayın. Hizmeti istemciye bir kereden fazla geçirmek anlamına gelen bir şey varsa. Bu işe yarıyor ama hizmetin parçalanması gereken büyük bir çamur topu olup olmadığını sorgulamama neden oluyor.
Birçok istemci farklı altkümeler kullanıyor ancak istemcilerin birden fazla kullanabilmesine izin veren roller görmüyorsanız, arayüzlerinizi tasarlamak için ördek yazmadan daha iyi bir şeyiniz yoktur. Arabirimleri tasarlamanın bu yolu, istemcinin kullanmadığı bir işleve bile maruz kalmamasını sağlar, ancak yeni bir istemci eklemenin, hizmet uygulamasının bilmesi gerekmediği her zaman yeni bir arabirim eklemeyi içereceğini neredeyse garanti eder. bu konuda rol arayüzlerini toplayan arayüz olacaktır. Bir acıyı diğerine takas ettik.
Birçok istemci farklı altkümeler kullanıyorsa, çakışıyorsa, öngörülemeyen alt kümelere ihtiyaç duyacak yeni istemcilerin eklenmesi bekleniyor ve hizmeti bölmek istemiyorsanız daha işlevsel bir çözüm düşünün. İlk iki seçenek işe yaramadığından ve hiçbir şeyin bir deseni takip etmediği ve daha fazla değişikliğin geldiği kötü bir yerdeyseniz, her işleve kendi arayüzü sağlamayı düşünün. Buraya gelmek, İSS'nin başarısız olduğu anlamına gelmez. Bir şey başarısız olursa, nesne yönelimli bir paradigma oldu. Tek yöntem arabirimleri aşırı derecede ISP'yi takip eder. Bu, klavye yazmanın adil bir parçasıdır, ancak bunu aniden arayüzleri yeniden kullanılabilir hale getirebilirsiniz. Yine, olmadığından emin ol
Yani gerçekten çok küçük olabilirler.
Bu soruyu ISS'yi en uç durumlarda uygulamak için bir meydan okuma olarak ele aldım. Ancak, aşırı uçlardan en iyi şekilde kaçınıldığını unutmayın. Diğer SOLID ilkelerini uygulayan iyi düşünülmüş bir tasarımda, bu konular genellikle ortaya çıkmaz veya önemli değildir.
Yanıtlanmamış başka bir soru:
Bu arayüzlerin sahibi kim?
Tekrar tekrar "kütüphane" zihniyeti dediğim şekilde tasarlanmış arayüzler görüyorum. Hepimiz sadece bir şey yaptığınız yerde maymun-gör-maymun-yap kodlamasından suçluyduk çünkü bunu böyle gördünüz. Arayüzlerle aynı şeyden suçluyuz.
Bir kütüphanede bir sınıf için tasarlanmış bir arayüze baktığımda şöyle düşünürdüm: ah, bu adamlar profesyoneller. Bir arayüz yapmanın doğru yolu bu olmalıdır. Anlayamadığım şey, bir kütüphane sınırının kendi ihtiyaçları ve sorunları olduğu. Bir kere, bir kütüphane müşterilerinin tasarımından tamamen habersizdir. Her sınır aynı değildir. Ve bazen aynı sınırın bile onu aşmak için farklı yolları vardır.
Arayüz tasarımına bakmanın iki basit yolu:
Hizmete ait arabirim. Bazı insanlar bir servisin yapabileceği her şeyi ortaya çıkarmak için her arayüzü tasarlar. IDE'lerde, beslediğiniz sınıfı kullanarak sizin için bir arabirim yazacak olan yeniden düzenleme seçeneklerini bile bulabilirsiniz.
Müşteriye ait arayüz. İSS bunun doğru olduğunu ve sahip olunan hizmetin yanlış olduğunu iddia ediyor gibi görünüyor. Müşterilerin ihtiyaçları göz önünde bulundurularak her arayüzü bozmalısınız. İstemci arabirimin sahibi olduğundan, onu tanımlamalıdır.
Kim haklı?
Eklentileri düşünün:
Burada arayüzlerin sahibi kim? Müşteriler? Hizmetler?
Her ikisini de ortaya çıkarır.
Buradaki renkler katmanlar. Kırmızı katmanın (sağ) yeşil katman (solda) hakkında hiçbir şey bilmemesi gerekiyor. Yeşil katman, kırmızı katmana dokunmadan değiştirilebilir veya değiştirilebilir. Bu şekilde, herhangi bir yeşil katman kırmızı katmana takılabilir.
Neyin ne olduğunu ve neyin bilinmeyeceğini bilmeyi seviyorum. Bana göre, "neyi bilen nedir?", En önemli mimari sorudur.
Bazı kelimeleri açıklığa kavuşturalım:
[Client] --> [Interface] <|-- [Service]
----- Flow ----- of ----- control ---->
İstemci kullanan bir şeydir.
Hizmet kullanılan bir şeydir.
Interactor
her ikisi de olur.
ISP, istemciler için ayrılık arayüzleri diyor. Tamam, şunu uygulayalım:
Presenter
(bir hizmet) Output Port <I>
arayüze dikte etmemelidir . Arayüz Interactor
(burada bir müşteri olarak hareket eder) ihtiyacı olan şeyle sınırlandırılmalıdır . Bu, ISS'yi Interactor
takip etmek için BILGI arabiriminin ve onunla değişmesi gerektiği anlamına gelir . Ve bu iyi.
Interactor
(burada bir hizmet olarak işlev görür) Input Port <I>
arayüze dikte etmemelidir . Arayüz Controller
(bir istemcinin) ihtiyacı olan şeyle daraltılmalıdır . Bu, ISS'yi Controller
takip etmek için BILGI arabiriminin ve onunla değişmesi gerektiği anlamına gelir . Ve bu iyi değil .
İkincisi iyi değil, çünkü kırmızı katmanın yeşil katmanı bilmemesi gerekiyor. ISS yanlış mı? İyi gibi. Hiçbir ilke mutlak değildir. Bu, servisin yapabileceği her şeyi göstermek için arayüzü seven aptalların doğru olduğu bir durumdur.
En azından, Interactor
bu kullanım durumundan başka bir şey yapmazsa haklılar . Interactor
Diğer kullanım durumları için bir şeyler yaparsa, Input Port <I>
bunun onlar hakkında bilmesi için bir neden yoktur . Neden Interactor
sadece bir Kullanım Örneği'ne odaklanamayacağından emin değilim, bu yüzden bu bir sorun değil, ancak işler oluyor.
Ancak input port <I>
arayüz kendisini Controller
istemciye köle edemez ve bunun gerçek bir eklenti olmasını sağlar. Bu bir 'kütüphane' sınırıdır. Tamamen farklı bir programlama mağazası, kırmızı katman yayınlandıktan yıllar sonra yeşil katmanı yazıyor olabilir.
Bir 'kütüphane' sınırını geçiyorsanız ve diğer tarafta arayüze sahip olmasanız bile ISS'yi uygulama gereğini hissediyorsanız, arayüzü değiştirmeden daraltmanın bir yolunu bulmanız gerekecektir.
Bunu çıkarmanın bir yolu bir adaptördür. Gibi istemciler Controler
ve Input Port <I>
arayüz arasına koyun . Adaptör kabul Interactor
bir şekilde Input Port <I>
ve delegelere kendisine 's çalışmalarını. Ancak, Controller
yeşil katmana ait bir rol arabirimi veya arabirimler aracılığıyla yalnızca istemcilerin ihtiyaç duydukları şeyleri ortaya çıkarır . Adaptör ISP'yi takip etmez, ancak daha karmaşık sınıfların Controller
ISP'nin keyfini çıkarmasına izin verir . Bu gibi istemcilerden daha az bağdaştırıcı varsa Controller
ve kitaplık sınırını aştığınız alışılmadık bir durumdaysanız ve yayımlanmasına rağmen kitaplık değişmeyi bırakmazsa bu yararlıdır . Sana bakıyorum Firefox. Şimdi bu değişiklikler sadece adaptörlerinizi bozuyor.
Peki bu ne anlama geliyor? Dürüst olmak gerekirse, size ne yapmanız gerektiğini söylemem için yeterli bilgi sağlamadığınız anlamına gelir. ISS'yi takip etmemek size bir soruna neden olup olmadığını bilmiyorum. Takip etmenizin size daha fazla soruna neden olup olmayacağını bilmiyorum.
Basit bir yol gösterici ilke aradığınızı biliyorum. İSS bu olmaya çalışır. Ama çok söylenmemiş bırakıyor. Buna inanıyorum. Evet, lütfen müşterileri iyi bir neden olmadan kullanmadığı yöntemlere bağımlı olmaya zorlamayın!
Eklentileri kabul etmek için bir şey tasarlama gibi iyi bir nedeniniz varsa, ISS nedenlerini takip etmeyen sorunların (istemcileri bozmadan değiştirmek zor) ve bunları azaltmanın ( Interactor
en azından bir Input Port <I>
ahırda kalmanın veya en azından bir kararlılığa odaklanmanın ) farkında olun kullanım örneği).