Objective-C ile güzel bir DSL nasıl yazılır?

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

20 yıllık Han Ran, dokuz ay boyunca hamile kaldı ve sabahın erken saatlerinde bir belge yayınladı ve kocasının onu hamileliğin üçüncü üç aylık döneminde aldığını söyledi.
önceki
Panasonic, Lumix LX100 II kamerayı piyasaya sürdü: yükseltilmiş dokunmatik ekran / 17 milyon piksel
Sonraki
"Grup adına" finalleri, 16 kişi iki takım halinde ilk kez sahneye çıktı; Wang Yuan, dayak sahnesini restore etti.
pişman! "SpongeBob SquarePants" ın babası donmadan öldü! Eskiden "sünger hazinesi" yaratan bir oşinograf olarak
"Bir kişi gözyaşlarını tadıyor" Yu Xiaotong, endişeleri hakkında gece geç saatlerde bir yazı yazdı, ancak ikiyüzlü olduğundan şikayet edildi.
Hem iş hem de platform açısından daha güvenilir mikro hizmetler nasıl tasarlanır?
Yeni 360 N7 Pro ile değiştirilen fiyat hala aynı
"Red Velvet" "Paylaş" 190322 RV Albüm Çekiminde Öne Çıkanlar Güncellendi
"Dragon Ball Super" Wukong filminin yeni fragmanı şiddetli bir savaşa dönüşüyor, buz alanı öfkeli ve duman her yerde.
Bai Suzhen'i canlandırmasıyla ünlü olan kendisine her zaman varlıklı kocası eşlik ediyor.Kırmızı elbise içinde 64 yaşında ve enerji dolu.
Bir ana daldan doğdu ve sadece bir eserde rol aldı, ilkbahar ve yazdan sonra başka bir "hazine kızı" oldu.
"Little Pig Peppa New Year" ilk "Mutlu Universiade" afişini yayınladı. Film, yeni bir animasyon dizisi tarafından oluşturuldu.
"Aquaman" gişede 700 milyon kırdı ve bu beş yuva, iyi karşılanırken gittikçe daha fazla ilgi görüyor
Oğlunu fide dikmeye mi götüreceksin? Huo Qigang ve karısı gerçekten zenginler!
To Top