Olaylar sadece GUI programlama için kullanılıyor mu?
Diğer bir şeye bir şey olduğunda normal arka uç programlamayı nasıl ele alırsınız?
Olaylar sadece GUI programlama için kullanılıyor mu?
Diğer bir şeye bir şey olduğunda normal arka uç programlamayı nasıl ele alırsınız?
Yanıtlar:
Hayır! Gözlemcileri uygulamak ve sınıfların değişime kapalı olduğundan emin olmak için gerçekten kullanışlıdırlar.
Diyelim ki yeni kullanıcıları kaydeden bir yöntemimiz var.
public void Register(user) {
db.Save(user);
}
Sonra birisi bir e-postanın gönderilmesi gerektiğine karar verir. Bunu yapabiliriz:
public void Register(user) {
db.Save(user);
emailClient.Send(new RegistrationEmail(user));
}
Ama biz sadece değişime kapalı olması gereken bir sınıfı değiştirdik. Muhtemelen bu basit sözde kod için gayet iyi, ancak üretim kodunda deliliğin yolu. Bu yöntemin ne kadar zamandır yeni bir kullanıcı oluşturmanın asıl amacı ile zorlukla bağlantılı olmayan 30 satır kod vardır?
Sınıfın çekirdek işlevini yerine getirmesine izin vermek ve bir kullanıcının kayıtlı olduğunu kim dinleyeceğini söyleyen bir etkinlik geliştirmek ve hangi işlemi yapmaları gerekiyorsa yapmaları (örneğin bir e-posta göndermek gibi) daha iyidir.
public void Register(user) {
db.Save(user);
RaiseUserRegisteredEvent(user);
}
Bu kodumuzu temiz ve esnek tutar. Göz ardı edilen OOP parçalarından biri, sınıfların birbirlerine mesaj göndermesidir . Olaylar bu mesajlardır.
Hayır!
GUI olmayan mantıkta kullanılan klasik olay örnekleri veritabanı tetikleyicileridir.
Tetikleyiciler, belirli bir olay gerçekleştiğinde yürütülen koddur (INSERT, DELETE, vb.). Bana bir olay gibi geliyor.
Bu, Wikipedia'nın etkinlik tanımıdır:
Hesaplamada olay, yazılım tarafından ele alınabilecek bir yazılım tarafından tanınan bir eylem veya olaydır. Bilgisayar olayları sistem tarafından, kullanıcı tarafından veya başka yollarla üretilebilir veya tetiklenebilir. Tipik olarak, olaylar program akışıyla eşzamanlı olarak gerçekleştirilir, yani yazılım, olayların işlendiği bir veya daha fazla özel yere, sıklıkla bir olay döngüsüne sahip olabilir. Bir olay kaynağı, örneğin, klavyedeki tuş vuruşları yoluyla yazılımla etkileşime girebilen kullanıcıyı içerir. Başka bir kaynak, zamanlayıcı gibi bir donanım cihazıdır. Yazılım ayrıca, örneğin bir görevin tamamlandığını bildirmek için kendi olay setini olay döngüsüne tetikleyebilir. Olaylara cevaben davranışını değiştiren yazılımın, çoğu zaman etkileşimli olmak amacıyla olaya yönelik olduğu söylenir.
Tüm olaylar kullanıcı tarafından oluşturulmaz. Bazıları daha önce de bahsettiğim gibi INSERT veri tabanının crontabı gibi bir zamanlayıcı tarafından üretilir.
Bu tanım aynı zamanda bazı programlardan veya sistemlerden "olay odaklı, çoğu zaman etkileşimli olma hedefiyle" ifade edildiğini ifade eder, ki bunlardan biri olayların amacının ya da kullanışlılığının yalnızca etkileşimi sağlamak için değil, sık sık etkileşimi sağlamaktır (GUI'ler gibi). her ne kadar mutlaka GUI olmasa da, CLI programları da etkileşimli olabilir).
Olay tabanlı programlama aslında yüksek performanslı sunucu programlaması için de kullanılıyor.
Tipik bir sunucu iş yükünde, bir sonucu işleyen zamanın çoğu aslında G / Ç'den gelir. Örneğin, bir (7200 RPM) sabit disk sürücüsünden veri çekmek 8,3 ms'ye kadar sürebilir. Modern bir GHz işlemci için bu, ~ 1 milyon saat döngüsüne eşittir. Bir CPU her seferinde veriyi bekleyecek olsaydı (hiçbir şey yapmadan), LOT saat döngüsü kaybederdik.
Geleneksel programlama teknikleri, çoklu ipliklerle bu sorunu çözer . CPU aynı anda yüzlerce iplik çalıştırmaya çalışıyor. Bununla birlikte, bu modelin problemi, bir CPU her iş parçacığı değiştirdiğinde, bağlam anahtarına yüzlerce saat döngüsü gerektirmesidir . Bağlamsal anahtar, CPU iş parçacığı yerel belleği CPU'nun kayıt defterlerine kopyaladığında ve aynı zamanda eski iş parçacığının kayıt / durumunu RAM'de sakladığında ortaya çıkar.
Ek olarak, her iş parçacığı durumunu depolamak için belirli miktarda bellek kullanmalıdır.
Bugün, tek bir iş parçacığı olan, bir döngü içinde çalışan sunucular için bir itme olmuştur. Ardından iş parçaları , tek bir iplik için bir sıra görevi gören (bir UI ipliğinde olduğu gibi) bir mesaj pompasına itilir . İşlemin bitmesini beklemek yerine, CPU sabit disk sürücüsü erişimi gibi şeyler için bir geri çağrı olayı ayarlar. Hangi bağlam anahtarlamasını azaltır.
Böyle bir sunucunun en iyi örneği, mütevazı bir donanım ile 1 milyon eşzamanlı bağlantıyı idare edebileceği gösterilen Node.js'dir. Java / Tomcat sunucusu ise birkaç bin kişiyle mücadele eder.
Olaylar ayrıca pahalı meşgul bekleme döngülerinden kaçınmak için ağ programlamasında (örneğin Nginx) yoğun olarak kullanılır ve bunun yerine tam olarak belirli bir işlemin ne zaman mümkün olduğunu (I / O, acil veriler vb.) Bilmek için temiz bir arayüz sağlar . Bu aynı zamanda C10k problemine de bir çözümdür .
Temel fikir, İşletim Sistemine olayları, hepsini veya yalnızca özellikle ilgilendiğiniz bazılarını izlemek için bir dizi soket (yani ağ bağlantıları) sağlamaktır (örneğin, okuma için kullanılabilir veriler); Bu tür bir etkinlik işletim sistemi tarafından listedeki soketlerden birinde algılandığında, API tarafından aradığınız olayı size bildirir ve ardından nereden geldiğini çözmeniz ve ona göre davranmanız gerekir. .
Şimdi, bu düşük seviyeli ve soyut bir görünüm, dahası iyi ölçeklendirmek için zor. Bununla birlikte, bununla bile çapraz platformda başa çıkacak çok sayıda üst düzey çerçeve var: Python için Twisted, C ++ için Boost.Asio veya C için libevent aklıma geldi.
Gömülü sistemler, açık bir şekilde programlanmamış olsalar bile, neredeyse her zaman doğal olarak olaya bağlıdır.
Bu olaylar donanım kesintileri, düğme presleri, analog-dijital okumalar, zamanlayıcı süreleri vb.
Düşük güçlü gömülü sistemlerin olay odaklı olması daha da muhtemeldir; zamanlarının çoğunu uyuyarak geçiriyorlar (CPU düşük güç modunda uyuyor), bir şeyin olmasını bekleyerek ("bir şey" bir olaydır).
Olay odaklı gömülü sistemler için en yaygın ve popüler çerçevelerden biri olan Kuantum Platformu (QP) (QP ayrıca Linux, Windows ve herhangi bir unix benzeri işletim sistemi altında da çalışıyor.) Durum makineleri, olay odaklı programlamaya uygun Program tipik anlamda "sıralı" olmadığından, sistem durumuna ve mevcut olaya bağlı olarak çağrılan bir "geri çağırma" kümesidir.
Olay Mesajları Gregor Hohpe.
Etkinlik Odaklı Mimariler Gregor Hohpe.
SEDA mimarisi , Galce, Culler, Brewer.
Başka bir şey olduğunda bir şey olduğunda normal arka uç programlamasında nasıl baş edersiniz?
Sonlu Durum Makinesi , ortak bir yaklaşımdır
Given(State.A)
When(Event.B)
Then(State.C)
.and(Consequences.D)
Gömülü sistemlerde, kesintiler sırasında olaylar meydana gelir. Zamanlayıcılardan G / Ç'ye kadar birçok kesinti kaynağı vardır.
Ayrıca, RTOS'da da olaylar olabilir. Bir örnek başka bir görevden mesaj bekliyor.
Gömülü olmayan sistem için ama C # ile yaptığım bir şey SCADA sistemi idi. Yük boşaltılırken sistem tarafından üretilen olayın bir kısmı boşaltılırken, diğer kısım veritabanına yeni durum yazarken depoda olanlarla ilgili birçok olay vardı. Elbette bazı GUI istemcilerimiz vardı, fakat sadece depo durumunu yansıtan veri tabanının durumunu göstermekti. Bu yüzden olaylara ve iş parçacığına dayanan arka uç sunucu yazılımıydı. Geliştirilmesi oldukça zor.