Yazılım Geliştirmedeki Modeller: Sıfır Nesne Tasarım Modeli
Sıfır nesne bir nesne içinde aksiyon olmayan bir davranış scheres. Sıfır bir nesne kullanmak genellikle çok hoştur.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Sıfır nesne
Stratejik kilitleme
Rekabet gibi çeşitli alanlarda kullanılması gereken bir kütüphane uygulandığını varsayalım. Güvende olmak için kritik bölümleri bir blokla koruyun. Kütüphane artık tek bir iş parçacığı ortamında kullanılıyorsa, bir performans sorunu vardır, çünkü pahalı bir senkronizasyon mekanizması gereksiz uygulanmıştır. Bu durumda, stratejik blok yardımcı olur.
Stratejik blok, strateji modelini bloklarda kullanmak için kullanılır. Bu, kontrol stratejisinin bir nesneye konulduğu ve onu sistemin değiştirilebilir bir bileşeni haline getirdiği anlamına gelir.
Stratejik bloğu uygulamanın iki tipik yolu vardır: derleme döneminde (modeller) (modeller) yürütme aşamasında (nesnelere yönelim) polimorfizm.
Her iki yol da kilitleme stratejisinin uyarlanmasını ve genişlemesini geliştirir, sistemin bakımını kolaylaştırır ve bileşenlerin yeniden kullanımını destekler. Buna ek olarak, kilitleme stratejisinin uygulanması, çeşitli yönlerde değişir veya doldurulur.
Avantajlar
Program strategizedLockingRuntime.cpp Üç farklı muteks hayal edin.
// strategizedLockingRuntime.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
class Lock {
public:
virtual void lock() const = 0;
virtual void unlock() const = 0;
};
class StrategizedLocking {
Lock& lock; // (1)
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock(); // (2)
}
~StrategizedLocking(){
lock.unlock(); // (3)
}
};
struct NullObjectMutex{
void lock(){}
void unlock(){}
};
class NoLock : public Lock { // (4)
void lock() const override {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.lock();
}
void unlock() const override {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.unlock();
}
mutable NullObjectMutex nullObjectMutex; // (9)
};
class ExclusiveLock : public Lock { // (5)
void lock() const override {
std::cout << " ExclusiveLock:
" << 'n';
mutex.lock();
}
void unlock() const override {
std::cout << " ExclusiveLock:
" << 'n';
mutex.unlock();
}
mutable std::mutex mutex; // (10)
};
class SharedLock : public Lock { // (6)
void lock() const override {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared(); // (7)
}
void unlock() const override {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared(); // (8)
}
mutable std::shared_mutex sharedMutex; // (11)
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking startLock3{sharLock};
}
}
std::cout << 'n';
}
Sınıf StrategizedLocking Bir bloğu vardır (1). StrategizedLocking Modelleri alanla kilitleme ve daha sonra üreticideki (2) muteks'i engeller ve onu Destroyer'da (3) tekrar serbest bırakır. Lock Soyut bir sınıftır ve tüm türev sınıfların arayüzünü tanımlar. Bunlar sınıflar NoLock (4), ExclusiveLock (5) e SharedLock (6). SharedLock çağrı lock_shared (7) e unlock_shared (8) std::shared_mutex AÇIK. Bu kilitlerin her biri mutekslerden birine sahiptir NullObjectMutex (9), std::mutex (10) veya std::shared_mutex (11). NullObjectMutex Noop bir yer tutucu. Muthexs değiştirilebilir ilan edilir. Bu nedenle, sürekli olarak üyelerin işlevleridir. lock VE unlock Kullanılabilir.
Derleme süresine dayalı uygulama polimorfizmi
Modele dayalı uygulama nesne yönelimli uygulamaya çok benzer.
// strategizedLockingCompileTime.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
template <typename Lock>
class StrategizedLocking {
Lock& lock;
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock();
}
~StrategizedLocking(){
lock.unlock();
}
};
struct NullObjectMutex {
void lock(){}
void unlock(){}
};
class NoLock{ // (1)
public:
void lock() const {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.lock();
}
void unlock() const {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.lock();
}
mutable NullObjectMutex nullObjectMutex;
};
class ExclusiveLock { // (2)
public:
void lock() const {
std::cout << " ExclusiveLock:
" << 'n';
mutex.lock();
}
void unlock() const {
std::cout << " ExclusiveLock:
" << 'n';
mutex.unlock();
}
mutable std::mutex mutex;
};
class SharedLock { // (3)
public:
void lock() const {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared();
}
void unlock() const {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared();
}
mutable std::shared_mutex sharedMutex;
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking<NoLock> stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking<ExclusiveLock> stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking<SharedLock> startLock3{sharLock};
}
}
std::cout << 'n';
}
Programlar strategizedLockingRuntime.cpp VE strategizedLockingCompileTime.cpp Aynı sorunu yaratın:
Kilitler NoLock (1), ExclusiveLock (2) e SharedLock (3) Soyut bir temel sınıfı yoktur. Sonuç olarak, bu StrategizedLocking Doğru arayüzü desteklemeyen bir nesne ile başlatılabilir. Bu örnek kaçınılmaz olarak derleme sırasında bir hataya yol açar. Bu kaçış C ++ 20'deki kavramlarla zarif bir şekilde kapatılabilir.
Kavram BasicLockable
Yerine template <typename Lock> class StrategizedLocking Kavram olabilir mi BasicLockable: template <BasicLockable Lock> class StrategizedLocking kullanmak. Bu, kullanılan tüm kilitlerin kavram olduğu anlamına gelir BasicLockable Desteklemelidirler. Kavram aday gösterilen bir gereksinimdir ve C ++ 20 Kavram Kütüphanesi'nde birçok kavram zaten tanımlanmıştır. Kavram BasicLockable Sadece C ++ 20 standardının metninde kullanılır. Bu nedenle kavramı tanımlıyorum ve kullanıyorum BasicLockable Derleme döneminde stratejik bloğun uygulanmasının aşağıdaki iyileştirilmesinde.
// strategizedLockingCompileTimeWithConcepts.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
template <typename T> // (1)
concept BasicLockable = requires(T lo) {
lo.lock();
lo.unlock();
};
template <BasicLockable Lock> // (2)
class StrategizedLocking {
Lock& lock;
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock();
}
~StrategizedLocking(){
lock.unlock();
}
};
struct NullObjectMutex {
void lock(){}
void unlock(){}
};
class NoLock{
public:
void lock() const {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.lock();
}
void unlock() const {
std::cout << "NoLock:
" << 'n';
nullObjectMutex.lock();
}
mutable NullObjectMutex nullObjectMutex;
};
class ExclusiveLock {
public:
void lock() const {
std::cout << " ExclusiveLock:
" << 'n';
mutex.lock();
}
void unlock() const {
std::cout << " ExclusiveLock:
" << 'n';
mutex.unlock();
}
mutable std::mutex mutex;
};
class SharedLock {
public:
void lock() const {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared();
}
void unlock() const {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared();
}
mutable std::shared_mutex sharedMutex;
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking<NoLock> stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking<ExclusiveLock> stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking<SharedLock> startLock3{sharLock};
}
}
std::cout << 'n';
}
BasicLockable (1) 'de bir nesnenin lo Üyenin işlevleri verisi türünden lock VE unlock Desteklemeli. Kavramın kullanımı basittir. Yerine typename Kavramı kullanıyorum BasicLockable Modelinin beyanında StrategizedLocking (2).
Sırada ne var?
Kişiselleştirilmiş bir veri türü aralık tabanlı bir döngüde kullanmak için yineleyici protokolünü uygulamalıdır. Bir sonraki makalemde, Yineleyici Protokolü hakkında daha ayrıntılı olarak derinleşeceğim.
(RME)
Ne yazık ki, bu bağlantı artık geçerli değil.
Boşa harcanan eşyalara olan bağlantılar, 7 günlük daha büyükse veya çok sık çağrılmışsa gerçekleşmez.
Bu makaleyi okumak için bir Haberler+ paketine ihtiyacınız var. Şimdi yükümlülük olmadan bir hafta deneyin – yükümlülük olmadan!
Yazılım Geliştirmedeki Modeller: Sıfır Nesne Tasarım Modeli
Sıfır nesne bir nesne içinde aksiyon olmayan bir davranış scheres. Sıfır bir nesne kullanmak genellikle çok hoştur.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Sıfır nesne
- Capsa Bir nesne ile donatılmayan davranış,
- koşullu mantık olmadan iş akışını destekler e
- Kullanıcının önündeki özel uygulamaları gizler.
Stratejik kilitleme
Rekabet gibi çeşitli alanlarda kullanılması gereken bir kütüphane uygulandığını varsayalım. Güvende olmak için kritik bölümleri bir blokla koruyun. Kütüphane artık tek bir iş parçacığı ortamında kullanılıyorsa, bir performans sorunu vardır, çünkü pahalı bir senkronizasyon mekanizması gereksiz uygulanmıştır. Bu durumda, stratejik blok yardımcı olur.
Stratejik blok, strateji modelini bloklarda kullanmak için kullanılır. Bu, kontrol stratejisinin bir nesneye konulduğu ve onu sistemin değiştirilebilir bir bileşeni haline getirdiği anlamına gelir.
Stratejik bloğu uygulamanın iki tipik yolu vardır: derleme döneminde (modeller) (modeller) yürütme aşamasında (nesnelere yönelim) polimorfizm.
Her iki yol da kilitleme stratejisinin uyarlanmasını ve genişlemesini geliştirir, sistemin bakımını kolaylaştırır ve bileşenlerin yeniden kullanımını destekler. Buna ek olarak, kilitleme stratejisinin uygulanması, çeşitli yönlerde değişir veya doldurulur.
Avantajlar
- Terim boyunca kontrol stratejisini yapılandırmanıza olanak tanır,
- Nesne yönelimli bir arka plana sahip geliştiriciler için anlamak daha kolaydır.
- Derleme süresi polimorfizm
- Ek çalışma zamanı maliyeti yok,
- Düz hiyerarşileri var.
- ek bir işaretçi veya referans dolgu gerektirir,
- Derin bir türev hiyerarşisi yaratabilir.
- Derleme süresi polimorfizm
- Çok küçük hata mesajları oluşturabilir.
Program strategizedLockingRuntime.cpp Üç farklı muteks hayal edin.
// strategizedLockingRuntime.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
class Lock {
public:
virtual void lock() const = 0;
virtual void unlock() const = 0;
};
class StrategizedLocking {
Lock& lock; // (1)
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock(); // (2)
}
~StrategizedLocking(){
lock.unlock(); // (3)
}
};
struct NullObjectMutex{
void lock(){}
void unlock(){}
};
class NoLock : public Lock { // (4)
void lock() const override {
std::cout << "NoLock:

nullObjectMutex.lock();
}
void unlock() const override {
std::cout << "NoLock:

nullObjectMutex.unlock();
}
mutable NullObjectMutex nullObjectMutex; // (9)
};
class ExclusiveLock : public Lock { // (5)
void lock() const override {
std::cout << " ExclusiveLock:

mutex.lock();
}
void unlock() const override {
std::cout << " ExclusiveLock:

mutex.unlock();
}
mutable std::mutex mutex; // (10)
};
class SharedLock : public Lock { // (6)
void lock() const override {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared(); // (7)
}
void unlock() const override {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared(); // (8)
}
mutable std::shared_mutex sharedMutex; // (11)
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking startLock3{sharLock};
}
}
std::cout << 'n';
}
Sınıf StrategizedLocking Bir bloğu vardır (1). StrategizedLocking Modelleri alanla kilitleme ve daha sonra üreticideki (2) muteks'i engeller ve onu Destroyer'da (3) tekrar serbest bırakır. Lock Soyut bir sınıftır ve tüm türev sınıfların arayüzünü tanımlar. Bunlar sınıflar NoLock (4), ExclusiveLock (5) e SharedLock (6). SharedLock çağrı lock_shared (7) e unlock_shared (8) std::shared_mutex AÇIK. Bu kilitlerin her biri mutekslerden birine sahiptir NullObjectMutex (9), std::mutex (10) veya std::shared_mutex (11). NullObjectMutex Noop bir yer tutucu. Muthexs değiştirilebilir ilan edilir. Bu nedenle, sürekli olarak üyelerin işlevleridir. lock VE unlock Kullanılabilir.
Derleme süresine dayalı uygulama polimorfizmi
Modele dayalı uygulama nesne yönelimli uygulamaya çok benzer.
// strategizedLockingCompileTime.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
template <typename Lock>
class StrategizedLocking {
Lock& lock;
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock();
}
~StrategizedLocking(){
lock.unlock();
}
};
struct NullObjectMutex {
void lock(){}
void unlock(){}
};
class NoLock{ // (1)
public:
void lock() const {
std::cout << "NoLock:

nullObjectMutex.lock();
}
void unlock() const {
std::cout << "NoLock:

nullObjectMutex.lock();
}
mutable NullObjectMutex nullObjectMutex;
};
class ExclusiveLock { // (2)
public:
void lock() const {
std::cout << " ExclusiveLock:

mutex.lock();
}
void unlock() const {
std::cout << " ExclusiveLock:

mutex.unlock();
}
mutable std::mutex mutex;
};
class SharedLock { // (3)
public:
void lock() const {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared();
}
void unlock() const {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared();
}
mutable std::shared_mutex sharedMutex;
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking<NoLock> stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking<ExclusiveLock> stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking<SharedLock> startLock3{sharLock};
}
}
std::cout << 'n';
}
Programlar strategizedLockingRuntime.cpp VE strategizedLockingCompileTime.cpp Aynı sorunu yaratın:

Kilitler NoLock (1), ExclusiveLock (2) e SharedLock (3) Soyut bir temel sınıfı yoktur. Sonuç olarak, bu StrategizedLocking Doğru arayüzü desteklemeyen bir nesne ile başlatılabilir. Bu örnek kaçınılmaz olarak derleme sırasında bir hataya yol açar. Bu kaçış C ++ 20'deki kavramlarla zarif bir şekilde kapatılabilir.
Kavram BasicLockable
Yerine template <typename Lock> class StrategizedLocking Kavram olabilir mi BasicLockable: template <BasicLockable Lock> class StrategizedLocking kullanmak. Bu, kullanılan tüm kilitlerin kavram olduğu anlamına gelir BasicLockable Desteklemelidirler. Kavram aday gösterilen bir gereksinimdir ve C ++ 20 Kavram Kütüphanesi'nde birçok kavram zaten tanımlanmıştır. Kavram BasicLockable Sadece C ++ 20 standardının metninde kullanılır. Bu nedenle kavramı tanımlıyorum ve kullanıyorum BasicLockable Derleme döneminde stratejik bloğun uygulanmasının aşağıdaki iyileştirilmesinde.
// strategizedLockingCompileTimeWithConcepts.cpp
#include <iostream>
#include <mutex>
#include <shared_mutex>
template <typename T> // (1)
concept BasicLockable = requires(T lo) {
lo.lock();
lo.unlock();
};
template <BasicLockable Lock> // (2)
class StrategizedLocking {
Lock& lock;
public:
StrategizedLocking(Lock& l): lock(l){
lock.lock();
}
~StrategizedLocking(){
lock.unlock();
}
};
struct NullObjectMutex {
void lock(){}
void unlock(){}
};
class NoLock{
public:
void lock() const {
std::cout << "NoLock:

nullObjectMutex.lock();
}
void unlock() const {
std::cout << "NoLock:

nullObjectMutex.lock();
}
mutable NullObjectMutex nullObjectMutex;
};
class ExclusiveLock {
public:
void lock() const {
std::cout << " ExclusiveLock:

mutex.lock();
}
void unlock() const {
std::cout << " ExclusiveLock:

mutex.unlock();
}
mutable std::mutex mutex;
};
class SharedLock {
public:
void lock() const {
std::cout << " SharedLock::lock_shared: " << 'n';
sharedMutex.lock_shared();
}
void unlock() const {
std::cout << " SharedLock::unlock_shared: " << 'n';
sharedMutex.unlock_shared();
}
mutable std::shared_mutex sharedMutex;
};
int main() {
std::cout << 'n';
NoLock noLock;
StrategizedLocking<NoLock> stratLock1{noLock};
{
ExclusiveLock exLock;
StrategizedLocking<ExclusiveLock> stratLock2{exLock};
{
SharedLock sharLock;
StrategizedLocking<SharedLock> startLock3{sharLock};
}
}
std::cout << 'n';
}
BasicLockable (1) 'de bir nesnenin lo Üyenin işlevleri verisi türünden lock VE unlock Desteklemeli. Kavramın kullanımı basittir. Yerine typename Kavramı kullanıyorum BasicLockable Modelinin beyanında StrategizedLocking (2).
Sırada ne var?
Kişiselleştirilmiş bir veri türü aralık tabanlı bir döngüde kullanmak için yineleyici protokolünü uygulamalıdır. Bir sonraki makalemde, Yineleyici Protokolü hakkında daha ayrıntılı olarak derinleşeceğim.
(RME)
Ne yazık ki, bu bağlantı artık geçerli değil.
Boşa harcanan eşyalara olan bağlantılar, 7 günlük daha büyükse veya çok sık çağrılmışsa gerçekleşmez.
Bu makaleyi okumak için bir Haberler+ paketine ihtiyacınız var. Şimdi yükümlülük olmadan bir hafta deneyin – yükümlülük olmadan!