API Design neden Interface Segregation Prensiplerini Talep Ediyor
Modern yazılım sistemleri API'leri tarafından canlı veya ölür. API'nizi temiz tutmak için en etkili yollardan biri olun, kullanılabilir ve geliştirici-dost, veya iç tüketim için bir dizi SDK'yı uygulamak için aşağıdaki kararları geçerlidir.[FONTS)[ISP)).
ISS, Java veya C++ gibi diller için dördüncüsüdür, rehberlik doğrudan transfer edilebilir - ve muhtemelen daha da kritik - API tasarımı ilkeleri, aslında Robert C. Martin tarafından 1990'ların sonlarında tanıtıldı.
API açısından, bu, yalnızca API tasarımcıları için ne anlama geldiği konusunda derin bir şekilde son noktaları ve sözleşmeleri tasarlamaya çalışır ve yağ arabirimlerinin bu şekilde nasıl etkin bir şekilde uygulanmasına izin verirsiniz ve her müşterinin sadece onunla etkileşime girmesine izin verir.Bu makale API tasarımcıları için ne anlama geliyor, yağ arabirimlerinin cazibesinden nasıl etkili bir şekilde faydalanır ve neden uzun vadeli kargalar ödersiniz.
Interface Segregation Prensibini Anlamak
Origins ve Core Fikir
Interface Segregation Prensibi, büyük, “saf” arayüzlerinin zaman içinde sorumluluklar biriktirdiği gözlemden ortaya çıktı. Okumaya devam eden tek bir arayüz, yazmak, güncellemek, silme ve denetim altına almak için her tüketicinin farkında olması - ve potansiyel olarak uygulanması - her bir yöntemden biri, sadece okuma işlemlerine ihtiyaç duyduklarını.
ISS, bu tür sarışın arabirimleri daha küçük, [[DataDeleter'e ayırıyor ve “Denetçi” ile tam ihtiyaç duyduğu arayüzlere bağlı.Bu, değişikliklerin parçalanmasını ve evrimleşmesini kolaylaştırır.
API Design in the Context of API Design
API'leri tasarlarken, hizmet ve tüketicileri arasındaki sözleşme olarak “interface” düşünün – bu tüketicilerin ön uç uygulamalar, diğer mikro hizmetler veya üçüncü taraf geliştiriciler için bir REST API kaynağı veya onlarca uç nokta ile GraphQL şemaları, tek bir büyük mutasyon türü ile, bir “sor arayüzü” haline gelebilir. Müşteriler asla aramadıkları işlemler için belgeye zorlanırlar.
ISS size soruyor: “Bunu daha küçük, bağımsız sözleşmelere kırabilir miyim?” Cevap genellikle daha temiz sürümleme, daha kolay test ve daha iyi ölçeklenebilirlik sağlar. Örneğin, bir kamuya açık API, mobil müşteriler için hafif bir okuma optimize edilmiş arayüz ortaya çıkarabilir ve daha fazla özellik zengin bir yazı arayüzü sunar.
API'nizi API'nizde uygulamanın temel Faydaları
Geliştirilmiş Geliştirici Deneyimi (DX)
Narrow arabirimleri öğrenmek ve kullanmak daha kolaydır. Geliştiriciler API'niz için yeni Geliştiriciler, görevlerine ilişkin son noktaları veya işlemleri, sorumsuz işlevsellikten yoksun bırakarak, bilişsel yük ve hızları bir entegrasyon için azaltır. Örneğin, izin için ayrı arabirimleri açığa çıkaran bir ödeme geçiti, yakalama, geri ödeme, ve boşluk, işlemleri ayırt etmek için karmaşık ödeme noktaları gerektiren tek bir “transaction” uç noktasından daha sezgiseldir.
Geliştirilmiş Flexability ve Evolvability
arayüzler küçük ve odaklanmış olduğunda, sistemin bir parçasına değişiklikler, diğerlerine en az etkiye sahiptir.Eğer tüm API'ye yeni bir yetenek eklemek gerekir - diyor, paginasyon veya filtreleme seçenekleri - yazma arayüzü dayanılmaz kalır. Benzer şekilde, belirli bir uç noktasının kırılma değişiklikleri gerekiyorsa, sadece tüm API'den daha küçük bir sözleşmeyi tercih edebilirsiniz.
Daha İyi Koruma ve Testability
Küçük arabirimler, retorik ve izolasyonda test etmek daha kolaydır.Ek-end takımlar için, bu, tüm uygulama paketini açmadan her uç noktası sözleşmesini bir araya getirebilmeniz anlamına gelir.Müşteri-başı takımları için dar sözleşmeler yüzey alanını azaltır. Sonuç daha hızlı geri bildirimler döngüler ve daha az kusurlar.
Azım Coupling ve Bağımlılık Bloat
Fat arabirimleri kapalı bağımlılıklar yaratır. Sadece kullanıcı profillerini okumak için ihtiyaç duyulan mobil bir uygulama, yazı ve silme yeteneklerini içeren bir kütüphaneye veya ulaşım katmanına bağlı olmamalıdır. ISS bu darbeyi azaltır ve hem API hem de tüketicilere bağımsız olarak evrimleşmeyi kolaylaştırır.
API Design'de ISS'yi uygulamak: Pratik Stratejiler
1. Müşteri Rollarını Tanımlayın
İlk adım, API müşterilerinizin kim olduğunu ve gerçekte hangi operasyonları yaptıklarını anlamaktır. Ortak roller şunları içerir:
- [FONT:0) Sadece tüketiciler[[Döneticiler[Döneticiler) [Düzg., mobil uygulamalar verileri gösteriyor)
- [[Düzg:0)Yazdır- sadece tüketiciler[Dönetici:0)
- [FONT:0) ⁇ tüketiciler[DÜT:1) (örneğin, silme ve denetim yeteneklerine ihtiyaç duyan panolar)
- [FONTD:0]Third-parti geliştiricileri), sadece alt özelliklerine ihtiyaç duyan özelliklerin alt kümesine ihtiyaç duyanlar
Her rolü gerektirdiği belirli işlemlere haritalayın. Bu, segregasyon için doğal sınırları ortaya çıkarır.
2. Ayrı uç noktaları veya Kaynaklar kullanın
REST'de, farklı sorumluluklar için özel uç noktaları oluşturmak. tek bir “/api/orders’ kaynağı her şeyi ele almak yerine, bölmeyi düşünün:
- "GET /api / emirler" - liste siparişleri (oku)
- "POST /api / emirler" - sipariş oluşturmak (yazma)
- "GET /api / emirler /{id}/status' - kontrol durumu (oku, uzmanlık)
- "P /api / emirler / {id}/cancel" - iptal sipariş (ödün)
Her uç nokta kendi semantikleriyle mini-interface olur. Bu, kaynak seviyesinde doğrudan bir ISS uygulamasıdır.
3.Komyo Kompozisyon (Inheritance) için
İç API sözleşmelerini tasarlarken (örneğin, bir SDK veya hizmet katmanında), örneğin TypeScript veya Java'da oluşturulabilecek küçük arayüzler lehine, tanımlayın:
interface OrderReader {
getOrder(id: string): Promise<Order>;
listOrders(filter: OrderFilter): Promise<Order[]>;
}
interface OrderWriter {
createOrder(data: CreateOrderInput): Promise<Order>;
updateOrder(id: string, data: UpdateOrderInput): Promise<Order>;
}
// A composite interface for admin use
interface OrderAdmin extends OrderReader, OrderWriter {
deleteOrder(id: string): Promise<void>;
}
Bu model, müşterilerin yalnızca ihtiyaç duydukları şeye bağlı olmasını sağlar. Hizmetler yalnızca kullanılan yöntemden kaçınarak ilgili arayüzleri uygulayabilir.
4. Ayrı Oku ve Modeller Yaz (CQRS)
Karmaşık domainler için, ES'yi yazı modellerinden (köpekler) ayırarak kabul etmeyi düşünün.Command Query Sorumluluk Segregation (CQRS)). CQRS, müşterilerin asla kullanmadıkları yöntemlere bağlı kalmamasını sağlamak için farklı uç noktaları veya kanalları gösterir.
5. Rol tabanlı Access ile Granular İzinleri Kullanın
ISS ayrıca güvenlik için de geçerlidir. tek bir monolithic API anahtarının tüm yetenekleri, konu kapsamını ve belirli arayüzlere erişimi kısıtlayan API anahtarları veya API anahtarlarını vermek yerine, bir kamu müşteri sadece “GET / ürün” de arama iznine sahip olabilir, ancak bir iç sistem “POST / ürün” de çağırabilir.
Action'da ISS'nin Gerçek Dünya Örnekleri
RESTful APIs: GitHub, Twilio, Stripe
Binbaşı API sağlayıcıları ISS.ETHFLT:0)GitHub'un API ayrı mesajlaşma, ses ve doğrulama için farklı uç noktalarına hizmet ediyor.[Döneticileri yönetmek için bir yöntem kullanmamalısınız.[Döneticileri yönetmek için bir yöntem, ödeme yapmak istediğiniz zaman.)Twilio's API ayrı mesajlaşma, ses ve doğrulama farklı uç noktalarına odaklanır.
Ziyaret etmeyi düşünün:0)Stripe'in API referansı) şişman arabirimlerden nasıl kaçındıklarını görmek için.
GraphQL ve ISS
GraphQL başlangıçta ISS'yi ihlal edebilir çünkü tek bir uç noktası tüm şemayı ortaya koyar. Ancak, iyi tasarlanmış GraphQL API'leri birden çok alt paragraftan bir grafikle uygulamaktadır.
Mikro hizmetler ve Sınırlanmış Contexts
Mikro hizmet mimarilerinde, her hizmet kendi arayüzünü ortaya çıkarır (API). Bir hizmet işleme kullanıcı kimlik doğrulaması, küçük ve odaklandığınız zaman, doğal olarak ISS'ye bağlı olarak. ”Ş.T.:0)Martin Fowler'in mikro hizmetlere ilişkin makalesini ortaya koyar).
SDK ve Kütüphane Tasarımı
API'niz için bir müşteri SDK sağladığınızda, kütüphanenin halka açık API'si uygulanır. Örneğin, bir merkezi “ApiClient’ sınıfı yerine yüzlerce yöntem sunar, “OrdersClient”, “ÜrünlerClient” gibi özel dersler sunar.
Ortak Pitfalls ve Them'dan Nasıl Kaçırmak
Over-Segregation
Çok fazla granular, aynı müşteri tarafından birlikte kullanılan çok sayıda küçük arayüz oluşturabilir. Hedef, yöntem başına bir arayüze sahip değil, birlikte değişen operasyonlarla ilgili olarak, iyi bir başparma kuralı oluşturabilir: eğer iki işlem her zaman aynı müşteri tarafından birlikte kullanılırsa, muhtemelen aynı arayüze ait.
Premature Granularity
Müşteri ihtiyaçlarını anlamadan önce motorlu arayüzler üzerinde değil. biraz daha büyük bir arayüzle başlayın ve sadece farklı müşteri rollerini veya basınçlarını somut kanıt gördüğünüzde bölün.Refaksiyon arabirimleri daha sonra kabul edilebilir - özellikle de yerinde sürümleme stratejileri varsa.
Geri Bilgiyi Ignoring Backward Compatality
Mevcut bir arayüze bölündüğünüzde, mevcut müşteriler eski sözleşmeye güvendikleri takdirde kırılabilir.Her zaman · REST için, uç noktalarınızı (örneğin, “/v1/orders/read’) indirebilirsiniz.
Takım ve Dokümantasyon Overhead
Daha fazla arayüz daha fazla belge anlamına gelir. İyi API belgeleri araçlarına (OpenAPI/Swagger veya GraphQL introspection) yatırım yapmak ve her arayüzün açıkça tanımlanmasını sağlamak.
ISS ve Diğer SOLID İlkeleri
Tek Sorumluluk Prensi (SRP)
ISS doğal olarak SRP ile uyumludur. SRP, bir modülün değişmesinin bir nedeni olduğunu söylüyor. ISS, bir arayüzin bir sorumluluğuna sahip olmasını sağlar - bir müşteri rolüne hizmet eder.SRP'yi modül seviyesinde takip ettiğinizde, genellikle zaten ayrılıkçı olan arayüzlerle sonuçlanırsınız.
Liskov Altung Prensliği (LSP)
ISS LSP ile çatışma yapmaz. Aslında, küçük arayüzler, substitutable uygulamaları oluşturmak için daha kolay hale getirir.Eğer bir arayüz sadece iki yönteme sahiptir, bu yöntemleri yerine getiren herhangi bir uygulama güven ile takas edilebilir. Fat arabirimleri genellikle basit olmayan yöntemler atmak için cazip hale getirir (örneğin, “Uygulamasız dışlama”), LSP'yi ihlal eder.
Açık / Kısa Prensip (OCP)
Segregated arabirimler OCP'yi destekliyor çünkü mevcut olanları değiştirmek yerine yeni arayüzler yaratarak yeni davranışları ekleyebilirsiniz. Örneğin, bir toplu operasyon eklemek mevcut okuma / yazma arabirimlerini değiştirmek gerektirmez - istemcinin uygulamayı tercih edebileceği yeni bir “BatchProcessor” arayüzü oluşturabilirsiniz.
Bağlanma Prensipleri (DIP)
ISS, DIP ile el ele çalışır: soyutlamalar (interfaces) ayrıntılara bağlı olmamalıdır; ayrıntılar soyutlamalara bağlı olmalıdır. Bu soyutlamalar yüksek derecede uyumlu ve ayrımcı olduğunda, kablo bağımlılıklarında maksimum esneklik elde edersiniz.
Test APIs with ISS in Mind
ISS'yi birden çok seviyede test etmek:
- [FONT:0)Ölmüş testler:[Dönetici:0)[Döneticiler:[Döneticiler) Her küçük arayüz kolayca alay edilebilir. Sadece bir okuyucu arayüzüne yönelik bir test, tüm API'yi alay etmek zorunda değildir.
- [FONT:0)Integration testleri:[Dönetici: 1 ) izolasyonda uç noktaları test edebilirsiniz.Bir yaz uç nokta testi, son noktaları egzersiz yapmak zorunda değildir.
- [FONT:0)Kontrat testi:[Döneticileri, sözleşme testleri (örneğin Pact kullanarak) daha odaklanmış hale gelir. Her tüketici pact sadece kullandığı etkileşimleri kapsar, yanlış pozitiflerin olasılığını azaltır.
- [FONT:0)Performance testleri:[Dönlendirme:[Dönlendirme:[Dönlendirme):[Dönlendirmeler:[Dönlendirmeler:))) Okunma vs. yazma yolları gerçek dünya kullanım desenlerini daha doğru bir şekilde simüle etmenizi sağlar.
ISS'nin Etkisini Ölçmek
API tasarımınızın iyi kodlanmış olup olmadığını nasıl biliyorsunuz? Bu göstergelere bakın:
- Düşük “fan-out” - tipik bir müşteri entegrasyonu sadece birkaç uç nokta veya arayüze sahiptir.
- arayüzleri paylaşmanın nadiren değişiklikler – bir arayüz genellikle birincil müşteriyle ilgili nedenlerden dolayı değişirse, muhtemelen çok geniştir.
- Birkaç deprecated yöntem - API'niz birçok işaretli “@deprecated” getirirse, yağ arayüzlerinden miras kalanlar zayıftı.
- Yeni geliştiriciler için zaman ayırmak - dar bir API öğrenmek daha kolaydır.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Interface Segregation Prensibi sadece akademik bir kılavuz değildir - zaman testini gerçekleştiren API'ler oluşturmak için pratik bir araçtır.Küçük, rol özel arayüzler, darbeyi azaltır, geliştirici deneyimini geliştirir ve sisteminizi değiştirmek için daha dirençli hale getirirsiniz. GraphQL şemaları veya SDK'ları tasarlayın, “Müşterim gerçekten buna ihtiyaç duyar mı?”
Unutmayın, ISS katı kurallarla değil, niyetle ilgili değildir. Bir müşteri odaklı bir perspektifle başlayın, gerçek kullanım kalıplarına dayanan ve anlayışınız büyüdükçe yeniden faktör arabirimleri yeniden kurmaktan korkmayın. Sonuç, geliştiricilerin dünyayı kırmadan gelişebileceği bir API olacaktır.
Daha fazla okuma için, ESNT'nin Wikipedia'daki ISS makalesi) ve ) Robert C. Martin'in SOLID'deki yazıları) Bu kaynaklar, ISS'nin diğer tasarım heuristics ile nasıl ilişkili olduğu hakkında daha fazla derinlik sağlar.