Yazılım Geliştirmede Idioma: Nesne Değerleri

Adanali

Active member
Yazılım Geliştirmede Idioma: Nesne Değerleri


  1. Yazılım Geliştirmede Idioma: Nesne Değerleri

Yazılımın geliştirilmesinde, bir değer nesnesi, eşitliği durumuna dayanan, ancak kimliğine dayanmayan küçük bir nesnedir. Tipik değer nesneleri para, sayılar veya dizelerdir.










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.













Değerler nesnesi terimi, Eric Evans'ın kitabın (DDD) alanı tarafından yönetilen devrimci tasarıma dayanır. Ama bir değer nesnesi var mı? Eric cevabı kitabında verdi: “Kavramsal kimlik olmadan alanın tanımlayıcı bir yönünü temsil eden bir nesneye değer nesnesi denir. Değer nesneleri, sadece ne olduklarını değil, kim veya ne olduklarını önemsediğimiz tasarım öğelerini temsil edecek şekilde başlatılır.. “

Oldukça resmi görünüyor, ama burada yazarın güzel bir örneği: “Bir çocuk çizirken, işaretleyicinin rengi seçen ve ucun keskinliği konusunda endişelenebilen rengi hakkında endişelenir. Ancak aynı renk ve şekle sahip iki belirteç varsa, muhtemelen onun için önemli olmayacaktır. Bir marker serbestse ve yeni bir paketle aynı renkten bir diğeri ile değiştirilirse, çalışmasını anahtara kayıtsız bırakabilir.

Nesne değerinin resmi tanım ve örneğindeki anahtar terim eşitlikti.

kimlik


Genel olarak, iki tür eşitlik vardır: referans eşitliği ve değer eşitliği. Basitlik nedeniyle, kimliğe dayalı eşitliği görmezden geleceğim.



  • Referans Eşitliği: Bellekteki aynı varlığı ifade ederse iki nesne aynıdır.
  • Eşit değer: Tüm üyeleri aynı değere sahipse iki nesne aynıdır.
Python ile her iki eşitliğe de karşı çıkmak oldukça kolaydır:









Python'un kabuğundaki kısa örnek, referans eşitliği ve değer eşitliği arasındaki farkı açık hale getirmelidir.

Önce iki liste tanımlıyorum list1 VE list2 Aynı öğelerle. Kimliğinizi karşılaştırırken (list1 is list2)), farklı. Değerlerinizi karşılaştırırken aynıdır. Python, eşitlik (ve eşitlik olmayan) için nesnelerin bellek adresini kullanır. . id-operatör (id(liste1)) Onaltılık bellek adresinin ondalık bir temsilini döndürür. Atamak list1 İLE list3 Aynı depolama alanının her iki listesine de bakın. Sonuç olarak id(list3) aynı id(list1)ve listeler liste3 true Geriye doğru.

Bu modern C ++ 20'yi nasıl etkiler? C ++ 20'de derleyici eşitlik operatörünü oluşturabilir.

Derleyici tarafından üretilen eşitlik operatörü

Kişiselleştirilmiş bir veri türü için, eşitlik için doğru semantiği seçmek gerekir.



// equalityReferenceValue.cpp

#include <iostream>

class Date{
public:
Date(int y, int m, int d): year(y), month(m), day(d){}
bool operator==(const Date&) const = default;
private:
int year;
int month;
int day;
};

class Man{
public:
Man(const std::string n, int a): name(n), age(a){}
bool operator==(const Man&) const = default;
private:
std::string name;
int age;
};

int main() {

std::cout << std::boolalpha << 'n';

Date date1(2022, 10, 31);
Date date2(2022, 10, 31);

std::cout << "date1 == date2: " << (date1 == date2) << 'n';
std::cout << "date1 != date2: " << (date1 != date2) << 'n';

std::cout << 'n';

Man man1("Rainer Grimm", 56);
Man man2("Rainer Grimm", 56);

std::cout << "man1 == man2: " << (man1 == man2) << 'n';
std::cout << "man1 != man2: " << (man1 != man2) << 'n';

std::cout << 'n';

}


C ++ 20'de derleyici, eşitlik operatörünü otomatik olarak oluşturabilir ve eşitsizlik operatörünü değiştirmek için kullanabilir. Üretilen eşitlik operatörü otomatik olarak değer eşitliğini kullanır. Daha kesin olarak, derleyici tarafından üretilen eşitlik operatörü bir sözlükbilim karşılaştırması gerçekleştirir. Sözlükli karşılaştırma, tüm temel sınıfların bildiri sırasına göre soldan sağa ve sınıfın tüm aktif olmayan üyelerine karşılaştırıldığı anlamına gelir.

İki önemli nokta eklemeliyim:

  • Dizeler ve taşıyıcılar için bir basitleştirme var: derleyici tarafından oluşturulan operatörler == VE != Önce uzunluğunuzu karşılaştırın, sonra gerekirse içeriğinizi.
  • Derleyici tarafından oluşturulan üç yollu karşılaştırma operatörü (<=>) Değer eşitliğini kullanın. Üç yollu karşılaştırma operatörü hakkında daha fazla bilgi en eski makalelerimde mevcuttur:
  1. Üç yollu karşılaştırma operatörü
  2. Astronavi operatörü hakkında daha fazla bilgi
  3. Uzay operatörü ile optimize edilmiş karşılaştırmalar
Dürüst olmak gerekirse, program beklendiği gibi davranıyorsa, ancak doğru hissetmiyorsa.









Aynı değerlere sahip iki tarih aynı olarak kabul edilmeli, ancak iki erkek değil. İki erkeğin eşitliği, kendi adlarına ve yaşlarına değil, kimliklerine dayanmalıdır.

Nesneleri değerlendirin


Şimdi değerli eşyaların ayrıntılarını girmek istiyorum.

Özellikler

Son bölüme göre, bu açık olmalı. Bir değer nesnesinin eşitliği, kimliğine değil, durumuna dayanmalıdır.

Bir değer nesnesi değiştirilmemelidir. Bu, değer adaylarının nesnelerini rekabet için ideal hale getirir. Bir nesne değerinin değiştirilmesi, değiştirilmiş özniteliklerle yeni bir nesnenin oluşturulduğu anlamına gelir. Bir işlemin yeni bir nesneyi değişmez bir nesneye döndürdüğü bu özelliğin iki ilginç sonucu vardır. Python ile bu sadece konuya getirilebilir.

Python'da bir dize değişmez:









  1. Yeni değeri eski isme atayarak bir değişikliği simüle eder: s = s.upper(). Orijinal s Ve yenisi s farklı adreslere sahip.
  2. Dize üzerinde bir işlem yeni bir dize sağlar. Sonuç olarak, dize işlemleri zincirlenebilir. Fonksiyonel programlamada, bu modele akan arayüz denir. Bu arada: (5 +5) * 10 – 20 gibi aritmetik ifadeler akan arayüze dayanmaktadır. Her işlem, bir sonraki işlemin uygulanabileceği geçici bir nesne döndürür. Tabii ki, sayılar değerli nesnelerdir.
Bir değer nesnesi, oluşturma sırasında özelliklerini doğrulamalıdır. Basitlik nedeniyle, bir öncekimde bu adımım var Date-Kass atlama.

Değerli nesnelerin avantajları ve dezavantajları nelerdir?

Avantajlar ve dezavantajlar

Değer nesnelerinin avantajları dezavantajlarını aşmaktadır.

Basit değerleri yönetmek için, entegre veri türleri yerine zengin veri türleri (zengin tipler) kullanmak gerekir. Bunun birçok etkisi var. Bir tarihin aşağıdaki iki örneğini karşılaştırıyoruz:



Date date1(2022, 10, 5);

std::string date2 = "2022 10 5";


  • Geçerli olamaz Datum Date(2022, 15, 5) Oluştur çünkü üreticinin girişi kontrol etme görevi vardır. Bu, dizenin değeri için geçerli değildir "2022 15 5“, Çünkü ay ve gün kolayca kafası karışabilir.
  • Programınızın okunması daha kolay. Sınıf belgelerinden Date Tek tek bileşenlerin nasıl anlaşılması gerektiği açıktır.
  • Operatörleri için kullanabilirsiniz Date aşırı yük. Örneğin, iki verinin çıkarılması bir zaman dilimine dönüşür. Bir dönem de bir değer nesnesi olmalıdır.
  • Değerlendirme nesneleri bir gün, bir yıl ve bir ay boyunca kişiselleştirilmiş literlerle genişletilebilir. Bu durumda, bu gerekli değildir, çünkü cppperferaralnence.com adresinde C ++ 20 :: chrono :: Süre ile aldık.
Nesnelerin değişmez olduğunu değerlendirin. Sonuç olarak, ek optimizer garantiler sunarlar ve senkronizasyon olmadan iplik arasında paylaşılabilirler.

Sadece konuların iyiliği için: Sonunda değerli eşyaları temsil eden çok fazla küçük sınıfınız olabilir.

Sırada ne var?


Bir nesne içindeki sıfır nesne tua-rene-davranışları bir nesne. Bir sonraki makalemde, sıfır nesneler hakkında daha fazla ayrıntı alacağım.

Bizim adımıza: Modern C ++ Mentorluk: “C ++ ile tasarım modelleri ve mimari desenler”


24/02/2023 tarihinden önce rezervasyon yaptığınızda%33 indirim alacaksınız. Ama önce mentorluk programımı sunmama izin verin.









Öğrenci olmak ister misin? Ayrıntıları buradan edinin: “C ++ ile tasarım modelleri ve mimari desenler” ve bir C ++ topluluğunun üyesi olur.


(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!
 
Üst