6 Eylül 2017 Çarşamba

Gömülü Proje - Component

Giriş
Gömülü bir projede kullanılan yapı hakkında notlarım

Component Sınıfı
Component denince insanın aklına modül gelebiliyor. Component modülden daha üst seviyede. Belki birçok modülü de içerebilir.

initialize metodu
Initialize metodu ile tüm kaynaklar, bellek alınır.

activate metodu
activate veya start metodu ile sonsuz döngü, thread'ler başlatılır.

deactivate metodu
deactivate veya stop ile sonsuz döngü, thread' bitirilir.

getState ve setState metodu
Bileşenin durumu atanır. State değer olarak "Off", "Stanby", "Operational",  "Degraded" gibi değerler alabilir.

setMode metodu
Bileşenin modu atanır. Mode değer olarak "RX_Only", "TX_RX", "Radio_Silent" gibi değerler alabilir.

Diğer
Component kendisine gelen mesajları ilgili Manager sınıfına iletir. Eğer asenkron çalışması gerekiyorsa içindeki "iş kuyruğuna" ekler.

Application Sınıfı
Bu sınıfı aslında QApplicatin'dan esinlendi. Bu sınıf uygulamadaki tüm Component'leri içerir. 

activate metodu
Tüm componentlerin activate metodunu çağırır.

deactivate metodu
Tüm componentlerin deactivate metodunu çağırır.

getInstance metodu
Application nesnesine global olarak erişimi sağlar.

getConfiguration metodu
Configuration nesnesini döndürür.

readConfiguration metodu
Uygulamanın çalışması için gerek dosyaları okur ve Configuration nesnesinde saklar.

getXComponent metodu
X isimli ilgili componenti döner.

Mediator Sınıfı
Componentler arası haberleşme içindir.Çağrı silsilesi şöyledir. Çağrılar genellikle asenkron çağrılardır.
XManager --> Mediator--> Component --> YManager
XMediator Sınıfı
Component içindeki Manager sınıfları birbirleri ile mesajlaşmak isteyebilir. Bu durumda mediator örüntüsü kullanılır. ComponentMediator ve Component arasındaki ilişki şöyledir.
Component <---> XMediator
XMediator gelen mesajı Component'in getXManager metodunu kullanarak elde ettiği manager nesnelerine paslar.
XManager Sınıfı
Bu sınıfların kendi işleyiş mantıkları ve veri modelleri vardır. Her manager Mediator nesnesini bildiği için başka component'ler ve kardeş Manager nesneleri ile mesajlaşabilir. Çağrı silsilesi şöyledir. Çağrılar senkron çağrılardır.
XManager --> XMediator--> Component --> YManager
XContext Sınıfı
Bu sınıfın varlığı beni herzaman rahatsız etti. Amacı Component içindeki herkesin kullandığı ortak verileri saklamak. Global veriye kolay erişim sağlar.

Ancak prensip olarak her verinin bir sahibinin olması gerekir. Context mantığı ile verinin sahibini kaybediyoruz. Veriyi güncelleme mantığı da zamanla context içine taşınabiliyor. Dolayısıyla sanki sadece salt okunur veriyi saklamak için kullanmak daha mantıklı.

Örneğin component'in ismi, numarası vs. gibi şeyler tutulabilir.

Veri Modeli
Veri modeli ile ilgili iki seçenek var.

Global Veri Model
Global veri modelini en iyi anlatan temsili örnek sanırım Data Distribution System (DDS)
Global veri modeli güncellenince modeli dinleyen processor sınıfının oncreate (), onUpdate (), onDelete() gibi metodları tetiklenir.

Component ilklenirken DDS'in ilgili topiclerini dinleyecek Processor nesneleri yaratılır ve bağlanır
DDS indeksleme mekanizmasını sağladığı için sadece veri ile ilgilenilir. Her veriye birincil anahtar veya indeks ile erişlir. Topicler'in yani verinin ortak bir ata sınıftan kalıtması gerekir. DDS altyapısıını zorladığı kalıtım hiyerarşisi takip edilir. Ayrıca DDS verimodeline erişim için ortak metodlar sunar.


Lokal Veri Modeli
Bu yöntemde programcı kod yazar. Veri modelinde kullanılacak veri yapısı (list, map vs.) seçilir ve veri güncellenince event/signal yötemi ile modeli dinleyen sınıflar tetiklenir. Yani klasik observer örüntüsü kullanılır.

Veri modeli ihtiyaca göre

Clear (), DeleteByKey (...), DeleteByIndex (,,,.indexID), GetAll(), GetFirst (), GetNewest(), GetOldest(), GetSize (), IsEmpty (), AddOrUpdate (), AddProcessor() gibi bir sürü API sağlar.

Soyut bir veri modeli sınıfı tanımlayıp bundan kalıtmak ta mümkün.

Dağıtık Sistemler
Yukarıdaki Global Veri Modeli ve Lokal Veri Modelinin karışımı kullanılır.




Hiç yorum yok:

Yorum Gönder