Yazar Zang Chengwei
Düzenle Xiaozhi
Önüne yaz
Program geliştirmede, mantığımızı her zaman daha özlü ve anlamsal olarak ifade etmeyi umuyoruz.Zincir çağrısı yaygın bir işleme yöntemidir. Masonry ve Expecta gibi yaygın olarak kullanılan üçüncü taraf kitaplıklarımız bu yaklaşımı benimsemiştir.
Belirli bir etki alanında kullanılan bu tür ifadeler DSL (Etki Alanına Özgü Dil) olarak adlandırılır Bu makale, bir zincir arama DSL'nin nasıl uygulanacağını açıklar.
Zincir aramanın uygulanması
Spesifik bir örnek verelim: Örneğin, bir UIView oluşturmak için zincir ifadeleri kullanıyoruz, çerçevesini ve backgroundColor'u ayarlıyoruz ve onu bir üst Görünüme ekliyoruz.
En temel Objective-C için (iOS4 bloğu görünmeden önce), zincir çağrıları uygulamak istiyorsanız, yalnızca şu şekilde görünebilir:
Blok ile köşeli parantezlerin biçimini nokta sözdizimi olarak değiştirebiliriz
Görülüyor ki zincir dilbilgisinin anlamsallığı çok net ve ikincisinin dilbilgisi daha derli toplu ... İkincisinin gerçekleştirilmesine iki açıdan bakalım.
1. Dilbilgisi açısından
Zincir arama iki şekilde uygulanabilir:
1. Yöntemdeki bilgileri kaydetmek için dönüş değerindeki öznitelikleri kullanın
Örneğin, Duvarcılıkta .left .right .top .bottom gibi yöntemler, çağrıldığında, her çağrıda bilgileri kaydetmek için sol / sağ / üst / alt gibi özniteliklere sahip olan MASConstraintMaker sınıfının bir örneğini döndürür;
Başka bir örnek için, Expecta'daki .notTo yöntemi, .notTo'nun çağrılıp çağrılmadığını kaydetmek için bir BOOL özelliği self.negative olan EXPExpect sınıfının bir örneğini döndürür;
Başka bir örnek olarak, yukarıdaki örnekte .with yönteminde, doğrudan self'e dönebiliriz;
2. Parametreleri kabul etmek için blok türü niteliklerini kullanın
Örneğin, parametre olarak bir CGFloat alan Masonry'deki .offset (15) yöntemi, MASConstraintMaker sınıfına bir blok türü özniteliği ekleyebilir:
Örneğin, örnekte .position (x, y), belirli bir sınıfa bir nitelik ekleyebilirsiniz:
.Position (x, y) yöntemi çağrılırken, bu blok yürütülür ve zincirleme çağrının gerçekleştirilebilmesini sağlamak için ViewMaker örneği döndürülür.
2. Anlamsal açıdan
Anlamsal düzeyden, hangilerinin yardımcı sözcükler olduğunu ve hangilerinin parametreleri kabul etmesi gerektiğini tanımlamak gerekir. Zincir aramanın tamamlanabilmesini sağlamak için, neyin aktarıldığını ve neyin geri döndüğünü göz önünde bulundurmanız gerekir.
Veya yukarıdaki örneği ele alalım:
Buna adım adım bakalım: Bu DSL ifadesinin, Alloc ile başlayıp intoView ile biten zorunlu bir cümleyi tanımlaması gerekiyor. İntoView'un son sözünden önce, positionsizebgColor kullanarak UIView'ı bir ölçüde değiştirdik.
Aşağıda dört paragrafa ayrı ayrı bakıyoruz, böyle bir ifadenin nasıl gerçekleştirileceği:
(1) Nesne
AllocA'nın (UIView) semantiğinde, nesnenin bir UIVIew olduğunu belirledik. UIView in InView sonunda olduğu belirlendiğinden, tüm ara koşulları kaydetmek için bir ara sınıf oluşturmamız gerekiyor Burada ViewMaker sınıfını kullanıyoruz.
Ek olarak, AllocA'nın bir işlev olduğunu ve UIView'ın bu işleve doğrudan aktarılamayacağını ve sözdiziminin AllocA () olacağını ve basitliğini yitireceğini fark edebiliriz. Bu nedenle, parantezleri ve sınıf yöntemini "yutmak" için bir makro tanımlamamız gerekir:
(2) Parçacık
Çoğu durumda, DSL sözdiziminin daha tutarlı görünmesini sağlamak için, Masonry'deki make.top.equalTo (süperview.mas_top) gibi yardımcı kelimelere ihtiyacımız var. ile .offset (padding.top) Bu cümledeki ile, çok yardımcı bir kelimedir.
Ve bu parçacık, öğrendiğimiz gramer ile aynıdır.Genellikle pratik bir etkisi yoktur.Sadece kendine dönün.
Kendinize dönerseniz, kullanıcıların sürekli olarak kendilerini.with.with.with çağırmasını engellemenin bir yolu olmadığı unutulmamalıdır. Bu durumdan kaçınmak için yeni bir sınıf oluşturabilirsiniz, her sınıfın kendi yöntemleri vardır, katman çağrılarından kaçınarak .
Bu, .with.with.with gibi sözdizimini etkili bir şekilde önler. Ama aslında gerçek ihtiyaçlara göre geliştirmemiz gerekiyor. DSL kullanan kullanıcılar daha iyi ifade içindir, bu yüzden .with.with.w gibi kod yazmayacaklar. Bu tür koruyucu önlemler biraz görünüyor Artık gerekli değil.
Bununla birlikte, yardımcı sözcükleri ayırt etmek için sınıfları kullanmanın başka küçük faydaları da vardır.Dilbilgisi komutları verdiğinde, ViewClassHelper sınıfının yalnızca .with gibi bir dilbilgisi istemine sahip olmasını ve ViewMaker'ın. Görünmek.
Ancak makaleyi basitleştirmek için hepimiz ilkini kullanıyoruz, yani .with, aşağıdakilere devam etmek için self'i döndürüyor:
(3) Modifikasyon bölümü öznitelikli
Örnekteki positionsizebgColor gibi, bunların tümü UIView'i değiştirmek için kullanılan öznitelikli parçalardır. ViewMaker örneğinde öznitelikler olarak bulunurlar. Zincir ifadesini desteklemek için, uygulandığında self'e dönmeye devam edecekler.
Başarmaya çalışalım:
(4) Son sözler
"Son kelime" modern dilbilgisinde gerçekten karşılık gelen bir ilişki değildir, ancak DSL'de bu paragraf özellikle önemlidir. ViewMaker örneği, baştan sona birçok değişiklik toplar ve burada "uç kelime" olarak adlandırılan nihai sonucu üretmek için son ifade kelimesini gerektirir. Örneğin, açık kaynak bir kütüphane olan Expecta'da eşit olduğunda, gerçek davranışı gösterir, davranışı gerçekte ne tetikler ne de tetikler.
Örneğimizde, .intoView (aSuperViwe) son kelimesi şu şekilde uygulanabilir:
Bu şekilde son bir söz yazılır.
Nihai kodun özeti:
Sonuna yaz
Bu tür bir zincirleme çağrı programı daha net hale getirebilir ve programı belirli bir senaryoda daha okunabilir hale getirebilir. Bu yöntem Swift'de de aynı, kodunuzu daha güzel hale getirmek için onu iyi bir şekilde kullanabilirsiniz.
Bu bir paskalya yumurtası
Aslında, bir geliştirici gelişmeye devam etmek ve gerçek bir usta haline gelmek istiyorsa, vizyonunu iş ihtiyaçlarının üzerine koymalı, temel becerilerini düzene koymalı ve güçlendirmeli ve geliştirme verimliliğini artırmak ve iyileştirmek için dil ve araçlara hakimiyet düzeyini iyileştirmelidir. Beceri seviyeleri.
İşte daha azla daha fazlasını yapabilmeniz için daha eğlenceli, iOS gelişmiş kara büyü taarruzu ve savunma teknikleri, Stark Academy (StuQ) sevilen kıdemli iOS teknik uzman öğretmeni Zang Chengwei'yi onu açmaya özel olarak davet ediyor "IOS Gerçek Kara Büyü" Kurs, 6 hafta ve 12 saat yüksek verimli iOS'u edinin, üst düzey kara büyü saldırı ve savunma becerilerinde ustalaşmalı, kademeli olarak sıradan geliştiricilerden çıkmanıza, farklı bir dil görmenize ve farklı bir gelişme hissetmenize izin vermelidir!
ana öğretim üyesi: Zang Chengwei, Meituan · Dianping iOS teknik uzmanı, QCon öğretim görevlisi
Sınıf dönemi: 6 hafta ve 12 saat sistematik öğrenme
Sınıf formu: yakınlaştır Canlı video öğretimi
Kurs fiyatı: 1599 yuan
Kayıt için son tarih: 10 Şubat (Cuma) 18:00