In: Genel


Birkaç kişi, dinamik bileşenleri ne zaman kullanmanız gerektiğine ilişkin açıklamamı sorguladı:

Bileşeniniz, birden çok çağrıda durumu koruyor mu ve bu durumun birden çok sürümüne mi ihtiyacınız var? Örneğin, bir kullanıcı oturumunu mu yoksa oynanan oyunların durumunu mu temsil ediyorsunuz? Öyleyse, her bileşenin oturum/oyun/… için durumunu koruduğu dinamik bir bileşen kullanın.

Onların itirazı, kelimeyi eklemem gerektiğidir. paylaşılanböylece verileri paylaşmak için yalnızca dinamik bileşenlere ihtiyacınız olur.

Bu ilginç bir bakış açısı ve akıl yürütmelerini çözmem biraz zaman aldı. Şimdi anladım, hala ifademi yapıştırıyorum ama her iki bakış açısını da açıklamak istiyorum.

Özet: Dinamik Bileşenler

Dinamik bir bileşen, bir sunucu fabrikasını temsil eder. Fabrikadan yeni bir sunucu isteyin ve işiniz bitene kadar o sunucuyu kullanın. Bir sunucu olarak kendi durumunu koruyabilir.

Adam Asmaca’yı Örnek Olarak Kullanalım

Bir cellat oyunu uyguladığınızı varsayalım.

Oyunu ayrı bir bileşen yapmak için baştan anlaşacağız: yani, yapacağız

ve oyun mantığını bu yeni dizin ağacına yazın.

Oyun için çeşitli istemciler yazacağız (bir komut satırı, bir Phoenix istemcisi vb.).

Oyunun kendi durumu vardır (tahmin edilecek kelime, şimdiye kadar tahmin edilen harfler vb.). Ayrıca, bu durumun harici bir sürümünü ortaya çıkaran bir API’ye sahiptir.

Oynanan her oyunun kendi durumuna ihtiyacı vardır.

Tartışma, bu devletin nerede yapılması gerektiği ile ilgili.

Bu Konudaki Bakış Açısı

Bazı insanlar, her müşterinin tam olarak bir oyunu olduğunu iddia ediyor. İstemci bir süreç olacak olsa da, oyunun tek olmasına gerek yoktur: istemci, oyunun durumunu tutabilir, her çağrıyı oyun API’sine iletebilir ve API’den her dönüşte onu güncelleyebilir. İstemci kodu şöyle görünebilir:

def play_game() do
  game = %Hangman.State{} |> Hangman.choose_word_to_guess
  accept_guess(game)
end

def accept_guess(game) do
  IO.puts "The word so far: #{game.word_so_far}"
  IO.puts "Letters used: #{game.letters_guessed |> Enum.join(",")}"
  guess = get_next_letter()
  game  = Hangman.score_guess(game, guess)
  cond do
   game.won || game.lost ->
    handle_end_of_game(game)
   game.good_guess ->
    handle_good_guess(game, guess)
   else
    handle_bad_guess(game, guess)
   end
end

Müthiş!

Benim bakış açım

İstemcinin oyunun durumuna sınırsız erişimi olması konusunda gerçekten gerginim. Aldatma konusunda endişelenmiyorum. Endişeliyim çünkü devlet gerçekten uygulama oyunun. Ve bir modülün uygulanması, modülün dışında kimsenin işi olmamalıdır.

Yukarıdaki kodda, istemci oyun durumunun bir dize içerdiğini varsayar, word_so_far Tahminin mevcut durumunu temsil eden ve bir numaralandırılabilir içerdiğini, letters_guessed Şimdiye kadarki tahminlerden.

Belki ilk yazdığımızda ikisi de doğruydu.

Ama belki oyunda işler değişti. Tahminleri kaydetme şeklimizi değiştirmeye karar verdik; bunun yerine bir bitmap kullandığımızı varsayalım. Ve belki de şimdiye kadar kelimenin bir versiyonunu tutmuyoruz: onu her zaman hedef kelimeden ve tahminlerden yeniden oluşturabiliriz.

Bunların her ikisi de dahili uygulama sorunlarıdır, ancak her iki değişiklik de istemciyi bozar.

Bu bir bağlantıdır ve daha büyük ölçekte bu, kodu değiştirmenin zor olmasının önemli bir nedenidir,

Elixir’deki işlemler pahalı olsaydı, bu yaklaşıma %100 katılırdım. Ama değiller. Bunun yerine, geliştirici zamanı önemli bir maliyettir ve özellikle kodun bakımı ve değiştirilmesi için harcanan zamandır. Bu yüzden, geleceğin-ben’in hayatını kolaylaştıracaksa, etrafta yatan fazladan bir sürece sahip olmanın isabetini almaya hazırım.

Bu yüzden benim yaklaşımım, oyunu kütüphane olmaktan çıkıp sunucuya dönüştürmek olacaktır. Oyun durumunu dış dünyadan tamamen gizli tutar: dünyanın geri kalanının gördüğü tek şey bir PID ve bir API’dir.

İstemci şöyle görünebilir:

alias Hangman, as: H  # 'cos I'm lazy

def play_game() do
  game = H.create()
  accept_guess(game)
end

def accept_guess(game) do
  IO.puts "The word so far: #{H.word_so_far(game)}"
  IO.puts "Letters used: #{H.letters_guessed(game) |> Enum.join(",")}"
  guess = get_next_letter()
  result = Hangman.score_guess(game)
  cond do
   result.won || result.lost ->
    handle_end_of_game(game)
   result.good_guess ->
    handle_good_guess(game, guess)
   else
    handle_bad_guess(game, guess)
   end
end

Pek farklı değil, gerçekten. Ancak şimdi dahili durum opaktır ve yalnızca API çağrıları yoluyla kullanılabilir hale getirilir. Dahili uygulamayı değiştirirsek, aynı API’yi koruyabilir ve bu nedenle hiçbir şeyi bozmayız.

Bu nedenle, teknik olarak gerekli olmasa bile, süreçlerin içinde durumu kapsüllemenin büyük bir hayranıyım.

Dinamik bileşenleri bunun için kullanıyorum.

Her zaman olduğu gibi, bazı ilginç yorumları ve bakış açılarını dört gözle bekliyorum.

Bir cevap yazın

Ready to Grow Your Business?

We Serve our Clients’ Best Interests with the Best Marketing Solutions. Find out More

How Can We Help You?

Need to bounce off ideas for an upcoming project or digital campaign? Looking to transform your business with the implementation of full potential digital marketing?

For any career inquiries, please visit our careers page here.
[contact-form-7 404 "Bulunamadı"]