Yazılım mimarisinde kalıp: Borular ve Filtreler kalıbı
Modeller, modern yazılım geliştirme ve yazılım mimarisinde önemli bir soyutlamadır. İyi tanımlanmış terminoloji, açık belgeler sunar ve en iyisinden öğrenirler. Borular ve Filtreler mimari modeli, Katmanlar modeline benzer ve veri akışlarını işleyen sistemlerin yapısını açıklar.
Katmanlama modelinin arkasındaki fikir, sistemi katmanlar halinde yapılandırmaktır, böylece üst katmanlar alt katmanların hizmetlerine güvenir. Borular ve Filtreler modeli, katmanları filtreler ve veri akışını borular olarak kullanarak katmanlı modeli doğal olarak genişletir.
Borular ve filtreler
Kapsam
yapı
Filter
Borular ve Filtreler modelinin en ilginç kısmı veri akışıdır.
veri akışı
Veri akışını kontrol etmenin birkaç yolu vardır.
itme prensibi
Pipes and Filters modelinin en ünlü örneği UNIX komut kabuğudur.
Unix komut kabuğu
İşte boru hattı adımları:
tr -cs A-Za-z 'n' |
tr A-Z a-z |
sort |
uniq -c |
sort -rn |
sed ${1}q
Bu boru hattının nasıl çalıştığını öğrenmek istiyorsanız, arkasındaki tüm hikayeyi “Daha fazla kabuk, daha az yumurta” makalesinde bulabilirsiniz.
C++, C++20’deki Aralıklar kitaplığı sayesinde Borular ve Filtreler modelini destekler.
hizalamak
Aşağıdaki program firstTenPrimes.cpp 1000 ile başlayan ilk on asal sayıyı görüntüler.
// firstTenPrimes.cpp
#include <iostream>
#include <ranges>
#include <vector>
bool isPrime(int i) {
for (int j = 2; j * j <= i; ++j){
if (i % j == 0) return false;
}
return true;
}
int main() {
std::cout << 'n';
auto odd = [](int i){ return i % 2 == 1; };
auto vec = std::views::iota(1'000)
| std::views::filter(odd) // (1)
| std::views::filter(isPrime) // (2)
| std::views::take(10) // (3)
| std::ranges::to<std::vector>(); // (4)
for (auto v: vec) std::cout << v << " ";
}
Veri kaynağı (std::views::iota(1'000)) 1000’den başlayarak doğal sayıyı üretir. Önce tek sayılar (1) ve ardından asal sayılar (2) filtrelenir. Bu boru hattı, on değerden (3) sonra durur ve öğeleri dosyaya iter std::vector (4). pratik fonksiyon std::ranges::to yeni bir aralık oluşturun (4). Bu işlev C++23’te yenidir. Bu nedenle, kodu yalnızca derleyici gezgininde en son Windows derleyicisiyle çalıştırabilirim.
Avantajlar ve dezavantajlar
Aşağıdaki karşılaştırmada evrensel arayüz terimini kullanıyorum. Bu, tüm filtrelerin xml veya json gibi aynı dili konuştuğu anlamına gelir.
Avantajlar
Aracı, uzaktan hizmet çağrılarıyla etkileşime giren dağıtılmış yazılım sistemleri oluşturur. İletişimi, sonuçlarını ve istisnaları koordine etmekten sorumludur. Bir sonraki yazımda Broker’ın mimari modelini inceleyeceğim.
Tek başıma: 2023’te C++20’deki tek açık atölyem
Son dakika karar vericiler için. C++20 ile ilgili tüm detaylar:
()
Haberin Sonu
Yazılım mimarisinde kalıp: Borular ve Filtreler kalıbı
Modeller, modern yazılım geliştirme ve yazılım mimarisinde önemli bir soyutlamadır. İyi tanımlanmış terminoloji, açık belgeler sunar ve en iyisinden öğrenirler. Borular ve Filtreler mimari modeli, Katmanlar modeline benzer ve veri akışlarını işleyen sistemlerin yapısını açıklar.

Katmanlama modelinin arkasındaki fikir, sistemi katmanlar halinde yapılandırmaktır, böylece üst katmanlar alt katmanların hizmetlerine güvenir. Borular ve Filtreler modeli, katmanları filtreler ve veri akışını borular olarak kullanarak katmanlı modeli doğal olarak genişletir.
Borular ve filtreler
Kapsam
- Verileri aşamalı olarak işleyen bir sistem.
- Her adım, verilerini diğerlerinden bağımsız olarak işler.
- Görevin birkaç işleme aşamasına bölünmesi.
- Her işlem adımı, bir sonraki işlem adımının girdisidir.
- İşleme aşamasına filtreleme denir; filtreler arasındaki veri kanalına boru denir.
- Veriler, veri kaynağından gelir ve veri havuzunda sona erer.
yapı


Filter
- giriş verilerini alır,
- giriş verileri üzerinde işlemini gerçekleştirir e
- çıkış verileri üretir.
- Veri ilet,
- bir kuyruktaki arabellek verileri e
- Komşuları senkronize et.
- işleme boru hattı için girdiler üretir.
Borular ve Filtreler modelinin en ilginç kısmı veri akışıdır.
veri akışı
Veri akışını kontrol etmenin birkaç yolu vardır.
itme prensibi
- Filtre, önceki filtreden gelen verileri ileterek başlar.
- Filtre (n-1), verileri n’inci filtreye gönderir (yazar).
- Veri kaynağı, veri akışını başlatır.
- Filtre, önceki filtreden veri isteyerek başlar.
- n’inci filtre, (n-1)inci filtreden veri ister.
- Veri havuzu, veri akışını başlatır.
- n’inci süzgeç, (n-1)’inci süzgeçten veri ister ve açıkça (n+1)’inci süzgeçe iletir.
- n’inci filtre, işleme zincirindeki tek aktif filtredir.
- n’inci filtre veri akışını başlatır.
- Her filtre, önceki kuyruktan veri okuyan veya sonraki kuyruğa veri yazan bağımsız bir işlemdir.
- n’inci filtre, yalnızca (n-1)’inci filtre bağlantı kuyruğuna veri yazdıktan sonra verileri okuyabilir.
- n’inci süzgeç, verilerini ancak (n+1)’inci süzgeç bağlantı sırasını okuduktan sonra yazabilir.
- Bu yapıya üretici/tüketici denir.
- Her filtre veri akışını başlatabilir.
Pipes and Filters modelinin en ünlü örneği UNIX komut kabuğudur.
Unix komut kabuğu
- Python3.6 kurulumumda en fazla satırı içeren beş Python dosyasını bulun:

İşte boru hattı adımları:
- Birlikte gelen tüm dosyaları bulun py sona ermek: find -name "*.py".
- Her dosyadan satır sayısını alın: xargs wc -l.
- Sayısal olarak sırala: sort -g .
- Alakasız istatistiksel bilgiler içeren son iki satırı kaldırın: head -n -2.
- Son beş satırı bulun: tail -5.
tr -cs A-Za-z 'n' |
tr A-Z a-z |
sort |
uniq -c |
sort -rn |
sed ${1}q
Bu boru hattının nasıl çalıştığını öğrenmek istiyorsanız, arkasındaki tüm hikayeyi “Daha fazla kabuk, daha az yumurta” makalesinde bulabilirsiniz.
C++, C++20’deki Aralıklar kitaplığı sayesinde Borular ve Filtreler modelini destekler.
hizalamak
Aşağıdaki program firstTenPrimes.cpp 1000 ile başlayan ilk on asal sayıyı görüntüler.
// firstTenPrimes.cpp
#include <iostream>
#include <ranges>
#include <vector>
bool isPrime(int i) {
for (int j = 2; j * j <= i; ++j){
if (i % j == 0) return false;
}
return true;
}
int main() {
std::cout << 'n';
auto odd = [](int i){ return i % 2 == 1; };
auto vec = std::views::iota(1'000)
| std::views::filter(odd) // (1)
| std::views::filter(isPrime) // (2)
| std::views::take(10) // (3)
| std::ranges::to<std::vector>(); // (4)
for (auto v: vec) std::cout << v << " ";
}
Veri kaynağı (std::views::iota(1'000)) 1000’den başlayarak doğal sayıyı üretir. Önce tek sayılar (1) ve ardından asal sayılar (2) filtrelenir. Bu boru hattı, on değerden (3) sonra durur ve öğeleri dosyaya iter std::vector (4). pratik fonksiyon std::ranges::to yeni bir aralık oluşturun (4). Bu işlev C++23’te yenidir. Bu nedenle, kodu yalnızca derleyici gezgininde en son Windows derleyicisiyle çalıştırabilirim.

Avantajlar ve dezavantajlar
Aşağıdaki karşılaştırmada evrensel arayüz terimini kullanıyorum. Bu, tüm filtrelerin xml veya json gibi aynı dili konuştuğu anlamına gelir.
Avantajlar
- Bir filtre doğrudan komşusundan veri çeker veya iterse, ara veri arabelleğe almaya gerek yoktur.
- Yine başka bir filtre, katmanlı modeli uygular ve bu nedenle kolayca değiştirilebilir.
- Evrensel arayüzü uygulayan filtreler yeniden sıralanabilir.
- Her filtre birbirinden bağımsız çalışabilir ve bitişik filtrenin tamamlanmasını beklemek zorunda değildir. Bu, filtreler arasında optimal bir işbölümü sağlar.
- Filtreler dağıtık bir mimaride çalışabilir. Borular uzak birimleri birbirine bağlar. Borular ayrıca veri akışını bölebilir veya senkronize edebilir. Borular ve Filtreler, dağıtılmış veya eşzamanlı mimarilerde yaygın olarak kullanılır ve performans ve ölçeklenebilirlik için harika fırsatlar sunar.
- Paralel veri işleme, iletişim, serileştirme ve senkronizasyon ek yükü nedeniyle verimsiz olabilir.
- Sıralama gibi bir filtre tüm verileri gerektirir.
- Filtrelerin işlem gücü homojen değilse aralarında büyük bellekler gerekir.
- Evrensel arabirimi desteklemek için filtreler arasındaki veriler biçimlendirilmelidir.
- Muhtemelen bu modelin en karmaşık kısmı hata yönetimidir. Verileri işlerken Borular ve Filtreler mimarisi çökerse, veriler kısmen işlenmiş veya hiç işlenmemiş olabilir. Şimdi aşağıdaki seçenekler var:
- Orijinal veriler hala mevcutsa, işlemi yeniden başlatın.
- Yalnızca tamamen işlenmiş verileri kullanın.
- İşaretçileri yerleştirdikten sonra, sistem çökerse işlem işaretçiler tarafından yeniden başlatılabilir.
Aracı, uzaktan hizmet çağrılarıyla etkileşime giren dağıtılmış yazılım sistemleri oluşturur. İletişimi, sonuçlarını ve istisnaları koordine etmekten sorumludur. Bir sonraki yazımda Broker’ın mimari modelini inceleyeceğim.
Tek başıma: 2023’te C++20’deki tek açık atölyem
Son dakika karar vericiler için. C++20 ile ilgili tüm detaylar:
- C++20: 18/04/2023 – 20/04/2023 (Aramis Oteli’ndeki Herrenberg’de mevcudiyet eğitimi)
()
Haberin Sonu