bir makale yazalım! Ama bu imkansız bir görev. Ancak sonsuza kadar çalıştırılırsa sonsuz uzunlukta bir makale üretecek bir süreç yaratabiliriz. . Sonsuz uzunlukta Yeterince yakın Artık tek bir Python kodu satırıyla uzun ve tekrarlayan bir makale oluşturabilirsiniz: >>> "This is water. " * 20 'This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. ' … yuhalıyor! Bunun yerine, bu makalede Devlet tasarım modelini kullanarak çok daha ilginç bir makale oluşturacağız. Yaawn İlk olarak durum makinelerinin ne olduğunu ve bunların Durum tasarım modeliyle nasıl ilişkili olduğunu anlayacağız. Daha sonra, (makul ölçüde) ilginç ve sonsuz bir makale üretebilecek bir durum makinesi yaratacağız. Daha sonra kısaca durum tasarım deseninin üzerinden geçeceğiz. Son olarak, durum tasarım modelini kullanarak bu durum makinesini nesne yönelimli koda çevireceğiz. Yazılım tasarım kalıpları, yaygın olarak ortaya çıkan sorunları çözmenin etkili yollarındandır. Durum modeli gibi yazılım tasarım modelleri, uygun şekilde uygulandığında daha iyi ölçeklenebilir, bakımı yapılabilir ve test edilebilir yazılımlar yazmanıza yardımcı olabilir. Durum Makinesi Temelde, Durum tasarım modeli, Durum Makinesini nesne yönelimli koda dönüştürür. Durum makinelerine aşina değilseniz, bu oldukça basit bir kavramdır. Bir durum makinesinin ve vardır. Durumlar, çıkar sistemimizin belirli özellikleridir ve durum geçişleri, bu özellikleri değiştiren ve dolayısıyla aynı zamanda durum değişikliğine neden olan eylemlerdir. durumları geçişleri (Diğer şeylerin yanı sıra) Robotik geçmişim olduğundan ve Robotik alanında durum makineleri yaygın olarak kullanıldığından, durum makinelerinin nasıl çalıştığını göstermek için basit bir robot elektrikli süpürge örneğini kullanacağım. Durum makinesi diyagramı, durum makineleriyle hiç karşılaşmamış olsanız bile, robotun nasıl çalıştığına dair sezgisel bir resim çizer. Bu işlemi adım adım inceleyelim. Robot durumda başlar (siyah nokta başlangıç durumunu gösterir). Yerleştirilmiş Robot pilinin zayıf olduğunu tespit ederse, pili dolana kadar kendi kendini şarj etmeye başlar ( durumu). Pil dolduğunda durumuna geri döner. Şarj Yerleştirilmiş durumda, robot zeminin kirli olduğunu (ve pilinin zayıf olmadığını) tespit ederse zemini temizlemeye başlar ( durumu). Yerleştirilmiş Temizleme durumunda robotun pili azalırsa kendi kendini şarj etmeye başlar. Zemin temizse robot bağlantı istasyonuna ( durum) geri döner. Temizleme Yerleştirilmiş Bu nedenle, robot elektrikli süpürgemizin üç durumu vardır: , ve - ve zeminin ve pilinin duyusal algılanmasına dayalı geçişler vardır. Yerleştirildi Temizleniyor Şarj Ediliyor Sonsuz makale için basit durum makinesi Artık durum makinelerini temel düzeyde anladığımıza göre, sonsuz bir makale yazabilen bir durum makinesi oluşturalım. Yukarıda kısa, basit cümlelerden oluşan bir makale oluşturmak için İngilizce dilbilgisini kullanan bir durum makinesi bulunmaktadır. Çok yakında daha ilginç bir versiyona ulaşacağımıza söz veriyorum ama bu, konuyu anlamak için iyi bir başlangıç noktası olmalı. Nasıl çalıştığını gözden geçirelim. durumundan başlayarak, önceden tanımlanmış bazı isimler listesinden seçim yaparak bir isim üretiriz. İsmimizin “Dünya” olduğunu varsayalım. (şimdiye kadarki cümle: “Dünya”) İsim Daha sonra durumuna geçiyoruz ve bir sonraki fiili üretiyoruz (“havlıyor” diyelim). (şimdiye kadarki cümle: “Dünya havlıyor”) Fiil durumunda bir sıfat (“kırmızı” diyelim) üretiriz. (şimdiye kadarki cümle: “Dünya kırmızı havlıyor”) Sıfat Daha sonra durumunda son noktalama işaretlerinden birini oluşturuyoruz, “!” diyoruz. (cümle: “Dünya kırmızı havlıyor!”) Endmark Sonunda makaledeki bir sonraki cümleyi oluşturmak için durumuna geri döndük. İsim Bu durum makinesi buna benzeyen (saçma) bir makale üretebilir. Dünya kırmızı havlıyor! Kuzen Harry faul mü yağdırıyor? Kaplanlar eğlenceli bir şekilde parlıyor. … Sonsuz deneme için deterministik olmayan durum makinesi Her ne kadar "deterministik olmayan" kulağa karmaşık gelse de bizim amaçlarımız açısından bu sadece biraz rastgelelik eklemek anlamına geliyor. Temel olarak bazı eyaletlere geçmeden önce bir tür yazı-tura atışı ekliyoruz. Ne demek istediğimi anlayacaksın. Yukarıdaki deterministik olmayan durum makinesi öncekine çok benzer. Tek farklar şunlardır: Olumsuzluklar "hayır" veya "değil" gibi kelimelerdir ve bağlaçlar "ve" ve "ama" gibi kelimelerdir. durumunda, bir fiil üretiriz ve ardından yazı tura atarız. Eğer tura gelirse (%50 olasılık), durumuna gideriz; aksi takdirde durumuna gideriz. Fiil Olumsuzluk Sıfat Benzer şekilde, durumunda, bir sıfat üretiriz ve sonra yazı tura atarız. Eğer tura gelirse, durumuna gideriz; eğer yazı ise o zaman durumuna gideriz. Sıfat Kavuşum Endmark Rastgeleliğin, olumsuzluğun ve bağlaçların devreye girmesiyle artık daha ilginç ve değişken uzunlukta cümleler oluşturabiliyoruz. Durum Tasarım Deseni Şimdi durum tasarım modelinin nasıl çalıştığını anlayalım. Bir kez daha, bir durum makinesini nesne yönelimli koda çevirmeye çalıştığımızı unutmayın. Makale oluşturma durum makinesinde, her durumun iki şey yapması gerektiğini gözlemleyin. Biraz eylem gerçekleştirin. Bu durumda bir kelime (isim, sıfat vb.) üretiliyor. Bir sonraki duruma geçiş. Fiile . İsimden vb Belirli bir devletin bakış açısından, bilmesi veya yapması gereken yoktur. Tüm sistemin (tüm durumları ve geçişleri) karmaşıklığı nedeniyle çıkmaza girmek yerine, her seferinde yalnızca bir duruma odaklanabiliriz. Benim görüşüme göre, bu tür bir ve , Devlet modelinin en büyük çekiciliğidir. başka hiçbir şey izolasyon ayrışma Aşağıda, Durum tasarım deseni için bir diyagramımız var. Her bir durumun içinde çalıştığı, sınıfı tarafından gösterilen bir bağlam vardır. Bağlam nesnesi, eylemini gerçekleştirmek üzere geçerli durumu çağırmak için kullandığı özel bir durum özniteliğine sahiptir. Her durum, eylemini veya işlemini gerçekleştirmek ve bir sonraki duruma geri dönmek için yöntemler içeren bir arayüzünü uygular. UML Context State Bunu makale oluşturma örneğine eşlersek, UML diyagramı şöyle görünür. artık bir arayüz yerine soyut bir sınıftır (italik ile gösterilir). Soyut sınıflar bazı soyut (gerçekleştirilmemiş) yöntem ve niteliklere sahip olabilirken diğerleri tanımlanabilir. Arayüzler tamamen soyuttur: tüm yöntemleri soyuttur. Bu değişikliği yaptım çünkü uygulaması tüm eyaletlerde aynı ve mükerrer kodlardan kaçınmak iyi bir şey. WordState generateWord Yukarıdaki özelliklerin ve yöntemlerin her birini ayrı ayrı inceleyelim. sınıfında şunlara sahibiz: EssayContext : Geçerli nesnesine referans. state WordState : Şu ana kadar oluşturulan tüm kelimelerin listesi. essayBody : niteliğini değiştiren ayarlayıcı. setState() state : Bir sonraki sözcüğü makale gövdesine ekleme yöntemi. addWord() : Makalemizi oluşturmak için bu metodu çağırıyoruz; uzunluğu büyük olduğunda dururuz. generateEssay() essayBody length : Oluşturulan makalenin bir dizesini döndürür. printEssay() Soyut sınıfında elimizde: WordState : Oluşturulacak kelimeleri seçtiğimiz kelimelerin listesi için soyut özellik (italik ile gösterilir). wordList : Oluşturulan kelimeyi makale bağlamına ekleyen yöntem. generateWord() : Sonraki durumu döndürmek için soyut yöntem. nextState() devralınan diğer tüm somut durumlar için temsili bir örnek olarak kullanacağız. NounState WordState : Oluşturulacak kelimeleri seçtiğimiz isimlerin listesi. wordList : Sonraki durumu döndürür. nextState() Artık bunu kodda uygulamak için ihtiyacımız olan her şeye sahibiz. Devam edelim ve aynen bunu yapalım! Python Kodu Öncelikle sınıfını adlı bir dosyaya yazalım. Deve vakasını bir kenara bırakıp yılan vakasına geçeceğiz çünkü Python bir... yılandır (kusura bakmayın). EssayContext essay_context.py from word_state import WordState class EssayContext: def __init__(self, state: WordState): self.state = state self.essay_body: list[str] = [] def set_state(self, state: WordState): self.state = state def add_word(self, word: str): self.essay_body.append(word) def generate_essay(self, length: int): while len(self.essay_body) < length: self.state.generate_word(self) def print_essay(self) -> str: return " ".join(self.essay_body) Daha sonra durumları adlı bir dosyaya ekleyelim. word_state.py import abc import numpy as np class WordState(abc.ABC): word_list: list[str] @classmethod def generate_word(cls, context: "EssayContext"): word = np.random.choice(cls.word_list) context.add_word(word) context.set_state(cls.next_state()) @classmethod @abc.abstractmethod def next_state(cls) -> "WordState": pass class NounState(WordState): word_list: list[str] = ["everything", "nothing"] @classmethod def next_state(cls): return VerbState class VerbState(WordState): word_list: list[str] = ["is", "was", "will be"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return NegationState return AdjectiveState class NegationState(WordState): word_list: list[str] = ["not"] @classmethod def next_state(cls): return AdjectiveState class AdjectiveState(WordState): word_list: list[str] = ["fantastic", "terrible"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return ConjunctionState return EndmarkState class ConjunctionState(WordState): word_list: list[str] = ["and", "but"] @classmethod def next_state(cls): return NounState class EndmarkState(WordState): word_list: list[str] = [".", "!"] @classmethod def next_state(cls): return NounState Son olarak dosyasındaki her şeyi çalıştıracak kodu ekleyelim. main.py from essay_context import EssayContext from word_state import NounState if __name__ == '__main__': ctx = EssayContext(NounState) ctx.generate_essay(100) print(ctx.print_essay()) çalıştırmak bize aşağıdaki çıktıyı verir (determinizm olmadığı için her seferinde farklıdır): python main.py 'everything is not terrible and nothing was terrible ! everything will be not fantastic but everything is fantastic . everything will be fantastic . nothing will be fantastic and nothing will be terrible ! everything was not fantastic and everything will be not terrible . everything was terrible . nothing was terrible but nothing will be fantastic ! nothing is not terrible . nothing was not fantastic but everything was not fantastic ! everything will be not fantastic but everything will be terrible ! everything will be not fantastic . everything is fantastic but nothing will be not terrible ! everything will be not fantastic but nothing was not fantastic !' Bu kadar basit bir sistem için fena değil! Ayrıca makale oluşturmayı daha karmaşık hale getirmek için çeşitli kelime listelerini genişletebilir veya daha fazla durum ekleyebiliriz. Makalelerimizi bir sonraki seviyeye taşımak için bazı LLM API'lerini bile tanıtabiliriz. Son düşünceler Durum makineleri ve Durum modeli, iyi tanımlanmış bir "durum" kavramıyla sistemleri modellemek ve yaratmak için mükemmel bir uyum sağlar. Yani her durumla ilişkilendirilen belirli davranışlar ve özellikler vardır. Robot elektrikli süpürge temizliyor, yerleştirilmiş veya şarj oluyor. TV'niz AÇIK veya KAPALI olabilir ve TV'nin uzaktan kumanda düğmeleri TV'nin durumuna göre farklı şekilde hareket edecektir. Aynı zamanda iyi tanımlanmış bir modele sahip dizileri oluşturmak veya tanımlamak için de iyi bir seçimdir. Bu, makale oluşturma örneğimiz için geçerlidir. Son olarak şunu sorabilirsiniz: "Bütün bunların amacı ne?" Bu "sonsuz" makaleyi oluşturmak için neden çeşitli durumları ve sınıfları tanımlama zahmetine katlandık? Aynı davranışı elde etmek için 20 (veya daha az) satırlık Python kodu yazabilirdik. Kısa cevap daha iyi içindir. ölçeklenebilirlik Sadece üç veya beş eyalet yerine 50 veya 500 eyaletimiz olduğunu hayal edin. Bu abartı değil; gerçek kurumsal sistemler bu seviyede bir karmaşıklığa sahiptir. Birdenbire Devlet modeli, ayrıştırılması ve izolasyonu nedeniyle çok daha çekici görünüyor. Tüm sistemi kafamızda tutmak zorunda kalmadan, aynı anda yalnızca bir duruma odaklanabiliriz. Bir durum diğerlerini etkilemeyeceği için değişiklik yapmak daha kolaydır. Ayrıca ölçeklenebilir ve bakımı yapılabilir bir sistemin büyük bir parçası olan birim testlerinin daha kolay yapılmasına da olanak tanır. Sonuçta Devlet modeli yalnızca devletleri yönetmekle ilgili değildir; Tüm tasarım modelleri gibi, karmaşık olduğu kadar ölçeklenebilir ve bakımı da yapılabilir bina sistemleri için bir plandır.