Yazılım geliştirmede modeller: stratejik model

Adanali

Active member
Yazılım geliştirmede modeller: stratejik model


  1. Yazılım geliştirmede modeller: stratejik model

Kalıplar, modern yazılım geliştirmede önemli bir soyutlamadır. İyi tanımlanmış terminoloji, açık belgeler sunar ve en iyisinden öğrenirler. Strateji modeli, Design Patterns: Elements of Reusable Object-Oriented Software adlı kitaptan alınan bir davranışsal tasarım modelidir. Bir algoritma ailesi tanımlar ve bunları nesneler içinde kapsüller.







Rainer Grimm, uzun yıllardır yazılım mimarı, ekip lideri ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanır, aynı zamanda sık sık uzmanlık konferanslarında konuşmaktan da keyif alır. Modernes C++ blogunda yoğun bir şekilde C++ tutkusundan bahsediyor.













Strateji şablonu, standart şablon kitaplığında yaygın olarak kullanılır.

stratejik model


amaç

  • Bir algoritma ailesi tanımlar ve bunları nesneler içinde kapsüller.
Ayrıca şöyle bilinir


kullanım durumu


  • Bir algoritmanın birkaç varyasyonuna ihtiyaç vardır
  • müşteri algoritmayı bilmemeli,
  • algoritma, bir programın çalışma zamanı sırasında değiştirilebilir olmalıdır.
çerçeve








Strategy

  • Algoritma ailesine arayüzü tanımlar.
ConcreteStrategy

  • Bir algoritma uygulayın.
Context

  • bir referans tutar ConcreteStrategy,
  • birine sahip ConcreteStrategy.
the Context bir tane var ConcreteStrategybir nesnenin içine hapsedilmiş. the ConcreteStrategy arayüzünü uygulamak Strategy. Tipik olarak, ConcreteStrategy çalışma sırasında ayarlanır.

misal


Aşağıdaki örnek strategy.cpp üç somut strateji kullanır ve önceki görüntüdeki adlandırma kurallarını izler.


// strategy.cpp

#include <iostream>
#include <memory>
#include <utility>

class Strategy {
public:
virtual void execute() = 0; // (4)
virtual ~Strategy() {}
};

class Context {
std::unique_ptr<Strategy> strat{}; // (1)
public:
void setStrategy(std::unique_ptr<Strategy> strat_) { // (2)
strat = std::move(strat_); }
}
void strategy() { if (strat) strat->execute(); } // (3)
};

class Strategy1 : public Strategy {
public:
void execute() { std::cout << "Strategy1 executedn"; }
};

class Strategy2 : public Strategy {
public:
void execute() { std::cout << "Strategy2 executedn"; }
};

class Strategy3 : public Strategy {
public:
void execute() { std::cout << "Strategy3 executedn"; }
};

int main() {

std::cout << 'n';

Context k;

k.setStrategy(std::make_unique<Strategy1>());
k.strategy();

k.setStrategy(std::make_unique<Strategy2>());
k.strategy();

k.setStrategy(std::make_unique<Strategy3>());
k.strategy();

std::cout << 'n';

}


Context bahse konulabilen (2) ve uygulanabilen (3) bir stratejisi (1) vardır. Her strateji üyelik işlevine sahip olmalıdır execute (4) destek. Ana program üç somut strateji kullanır, kurar ve yürütür. İşte programın çıktısı:








C++’da kullanım

Strateji şablonu, standart şablon kitaplığında yaygın olarak kullanılmaktadır. Modeller söz konusu olduğunda, buna politika diyoruz.

İlke, davranışı yapılandırılabilen genel bir sınıf veya işlevdir. İlke parametreleri için genellikle varsayılan değerler vardır. std::vector Ve std::unordered_map C++’daki ilke örnekleridir.


template<class T, class Allocator = std::allocator<T>> // (1)
class vector;

template<class Key,
class T,
class Hash = std::hash<Key>, // (3)
class KeyEqual = std::equal_to<Key>, // (4)
class allocator =
std::allocator<std::pair<const Key, T>> // (2)
class unordered_map;


Bu, her kapsayıcının öğeleri için ayarlanan bir varsayılan ayırıcıya sahip olduğu anlamına gelir. T (1) veya std::pair<const Key, T> (2) bağlıdır. Özellikler de std::unorderd_map standart bir hash fonksiyonu (3) ve standart bir eşitlik fonksiyonu (4) aracılığıyla. Hash işlevi, anahtara dayalı olarak hash değerini hesaplar ve equal işlevi, kovalardaki çarpışmalarla ilgilenir. Daha fazla bilgi için önceki makalem olan “Hash Fonksiyonları”na bakın. std::unordered_map.

Sonuç olarak, kullanıcı tanımlı bir veri tipini sever MyInt birinde anahtar gibi std::unordered_map kullanım.


// templatesPolicy.cpp

#include <iostream>
#include <unordered_map>

struct MyInt{
explicit MyInt(int v):val(v){}
int val;
};

struct MyHash{ // (1)
std::size_t operator()(MyInt m) const {
std::hash<int> hashVal;
return hashVal(m.val);
}
};

struct MyEqual{
bool operator () (const MyInt& fir,
const MyInt& sec) const { // (2)
return fir.val == sec.val;
}
};

std::eek:stream& operator << (std::eek:stream& strm,
const MyInt& myIn){ // (3)
strm << "MyInt(" << myIn.val << ")";
return strm;
}

int main(){

std::cout << 'n';

using MyIntMap =
std::unordered_map<MyInt, int,
MyHash, MyEqual>; // (4)

std::cout << "MyIntMap: ";
MyIntMap myMap{{MyInt(-2), -2}, {MyInt(-1), -1},
{MyInt(0), 0}, {MyInt(1), 1}};

for(auto m : myMap) std::cout << '{' << m.first
<< ", " << m.second << '}';

std::cout << "nn";

}


Hash işlevini (1) ve eşitlik işlevini (2) bir işlev nesnesi olarak uyguladım ve basitlik için çıktı operatörünü (3) aşırı yükledim. (4)’te tüm bileşenler yeni bir tür haline gelir MyIntMap oluşturulan, MyInt anahtar olarak kullanılır. Aşağıdaki ekran görüntüsü örnek çıktısını gösterir myMap:









İlgili modeller


  • Model yöntemi ve strateji modelinin kullanım durumları oldukça benzerdir. Her iki model de bir algoritmanın varyasyonlarını sağlamanıza izin verir. Model yöntemi, alt sınıflandırmaya göre bir sınıf düzeyine, strateji modeli ise kompozisyona göre bir nesne düzeyine dayanmaktadır. Strateji modeli, farklı stratejilerini nesneler olarak tutar ve bu nedenle çalışma zamanında stratejilerini değiştirebilir. Model yöntemi, kontrol akışını tersine çevirir ve böylece Hollywood’un “Bizi aramayın, sizi arayacağız” ilkesini izler. Strateji modeli genellikle bir kara kutudur. Ayrıntılarını bilmeden bir stratejiyi diğeriyle değiştirmenize olanak tanır.
  • Köprü modeli ve strateji modeli aynı yapıya ancak farklı amaçlara sahiptir. Köprü Modeli yapısal bir modeldir ve fiziksel bağımlılıkları ayırmayı amaçlarken, Strateji Modeli mantıksal bağımlılıkları ayrıştıran ve harici uygulamaların enjeksiyonuna izin veren davranışsal bir modeldir.
Avantajlar ve dezavantajlar


faydalar


  • Algoritmalar nesneler içinde kapsüllenir ve çalışma zamanında değiştirilebilir.
  • Yeni stratejiler eklemek kolaydır. Sadece yeni bir strateji uygulamanız gerekiyor.
  • Strateji şablonu, şuna dayalı koşullu yürütmenin yerini alır: if/else– veya switch-Talimatlar.
  • Callable’lar genellikle C++’daki stratejilerin hafif uygulamalarıdır:

// sortVariations.cpp

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

bool greater(const std::string& first, const std::string& second) {
return first > second;
}

int main(){

std::vector<std::string>
myStrings{"Only", "for", "testing", "purpose", "."};

// sort ascending
std::sort(myStrings.begin(), myStrings.end());

// sort descending // (1)
std::sort(myStrings.begin(), myStrings.end(), greater);
std::sort(myStrings.begin(), myStrings.end(),
std::greater<std::string>());
std::sort(myStrings.begin(), myStrings.end(),
[](const std::string& first,
const std::string& second) {
return first > second;
});

// sort based on the length of the strings
std::sort(myStrings.begin(), myStrings.end(),
[](const std::string& first,
const std::string& second) {
return first.length() < second.length();
});
}



Program işlevi kullanır greatervarsayılan işlev nesnesi std::greater<std::string> ve elde etmek için bir lambda(1) ifadesi std::vector<std::string> azalan düzende sıralayın. Bu örnekte, çağrılabilir öğeler ikili yüklemlerdir.

Dezavantajları

  • Kullanıcıların doğru stratejiyi bilmesi ve seçmesi gerekir.
  • Öğelerin (stratejilerin) sayısı önemli ölçüde artar.
Sıradaki ne?


Son makalelerimde, yeni ufuklar açan Design Patterns: Elements of Reusable Object-Oriented Software adlı kitaptan aşağıdaki tasarım modellerini öne çıkardım:








Burada listelenen planlar, geçmişte benim için en önemli olanlardır. Bir sonraki yazımda C++ deyimleri hakkında yazacağım. Dil, belirli bir programlama dilinde bir mimarinin veya tasarım modelinin uygulanmasıdır.

Bizim adımıza: Modern C++ danışmanlığı










Mentorluk programlarımdan haberdar olun: Buradan kaydolun.


(rm)



ana sayfaya
 
Üst