Yazılım geliştirmede deyimler: değerli şeyler

Adanali

Active member
Yazılım geliştirmede deyimler: değerli şeyler


  1. Yazılım geliştirmede deyimler: değerli şeyler

Yazılım mühendisliğinde, bir değer nesnesi, eşitliği kimliğine değil statüsüne dayanan küçük bir nesnedir. Tipik değerli şeyler para, sayılar veya dizilerdir.







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.













Değer nesnesi terimi, Eric Evans’ın ufuk açıcı kitabı Domain-Driven Design’a (DDD) kadar uzanır. Ama değerli bir nesne neye benziyor? Eric yanıtını kitabında verdi: “Alanın tanımlayıcı bir yönünü temsil eden ve kavramsal kimliği olmayan bir nesneye Değer Nesnesi denir. Değerler, kim veya ne oldukları için değil, sadece ne oldukları için önemsediğimiz tasarım unsurlarını temsil edecek şekilde somutlaştırılır..”

Yeterince resmi geliyor, ama işte yazardan güzel bir örnek: “Bir çocuk çizerken, seçtiği keçeli kalemin rengiyle ilgilenir ve ucunun keskinliğiyle ilgilenebilir. Ancak aynı renk ve şekilde iki keçeli kalem varsa, muhtemelen hangisini kullandığını umursamayacaktır. Bir jeton kaybolur ve yeni bir desteden aynı renkteki başka bir jetonla değiştirilirse, değişiklik konusunda endişelenmeden işine devam edebilir.

Value nesnesinin resmi tanımındaki ve örneğindeki anahtar kavram eşitlikti.

kimlik


Genel olarak iki tür eşitlik vardır: referans eşitliği ve değer eşitliği. Kolaylık olsun diye, kimliğe dayalı eşitliği göz ardı edeceğim.


  • referans eşitliği: Bellekte aynı varlığa gönderme yapan iki nesne eşit kabul edilir.
  • eşit değer: Tüm üyeleri aynı değere sahipse iki nesne eşittir.
Python ile her iki eşitlik türünü karşılaştırmak yeterince kolaydır:








Python kabuğundaki kısa örnek, referans eşitliği ile değer eşitliği arasındaki farkı açıklığa kavuşturmalıdır.

Önce iki liste tanımlıyorum list1 VE list2 aynı elemanlarla. Kimliklerini karşılaştırdığımda (list1 is list2), Onlar farklı. Değerlerini karşılaştırdığımda aynılar. Python, eşitlik (ve eşitlik olmayan) karşılaştırmaları için karşılaştırılan nesnelerin bellek adresini kullanır. ONLAR idŞebeke (id(liste1)) onaltılık bellek adresinin ondalık gösterimini döndürür. atama list1 İLE list3 her iki liste de aynı hafıza konumuna atıfta bulunur. sonuç olarak öyle id(list3) aynı id(list1)ve list1’i çağırmak, list3’ü döndürür true geri dönmek.

Bu, modern C++20’yi nasıl etkiler? C++20’de derleyici eşitlik operatörünü üretebilir.

Derleyici tarafından oluşturulan eşitlik operatörü

Kullanıcı tanımlı bir veri türü için uygun eşitlik anlamını seçmelisiniz.


// 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 bunu eşitsizlik operatörünün yerine kullanabilir. Otomatik olarak oluşturulan eşitlik operatörü, değer eşitliğini zorunlu kılar. Daha spesifik olarak, derleyici tarafından oluşturulan eşitlik operatörü sözlükbilimsel bir karşılaştırma gerçekleştirir. Sözlükbilimsel karşılaştırma, tüm temel sınıfların soldan sağa ve sınıfın statik olmayan tüm üyelerinin bildirim sırasına göre karşılaştırıldıkları anlamına gelir.

İki önemli noktayı eklemeliyim:

  • Diziler ve vektörler için bir basitleştirme vardır: derleyici tarafından oluşturulan işleçler == VE != önce uzunluklarını ve sonra gerekirse içeriklerini karşılaştırın.
  • Derleyici tarafından oluşturulan üç yollu karşılaştırıcı (<=>) değer eşitliğini zorlar. Üç yollu karşılaştırma operatörü hakkında daha fazla bilgiyi önceki makalelerimde bulabilirsiniz:
  1. Üç yollu karşılaştırma operatörü
  2. Uzay operatörü hakkında daha fazla ayrıntı
  3. Uzay gemisi operatörüyle optimize edilmiş karşılaştırmalar
Dürüst olmak gerekirse, program beklendiği gibi davranıyor ama doğru gelmiyor.








Aynı değerlere sahip iki tarih eşit kabul edilmelidir, ancak iki erkek değil. İki erkeğin eşitliği, isimlerine ve yaşlarına göre değil, kimliklerine dayanmalıdır.

değerli eşyalar


Şimdi Value nesnelerinin detaylarına girmek istiyorum.

Özellikler

Son bölümden sonra bu açık olmalı. Bir Value nesnesinin eşitliği, kimliğine değil, durumuna dayalı olmalıdır.

Bir Value nesnesi değişken olmamalıdır. Bu, değerli eşyaları rekabet için ideal adaylar yapar. Bir Value nesnesini değiştirmek, değiştirilen niteliklerle yeni bir nesne oluşturmak anlamına gelir. Değişmez bir nesne üzerindeki bir işlemin yeni bir nesne döndürme özelliğinin iki ilginç sonucu vardır. Python ile konuya ulaşmak kolaydır.

Python’da bir dize değişmezdir:








  1. Eski adı yeni değere atayarak bir değişikliği simüle edersiniz: s = s.upper(). Orijinal s ve yeni s farklı adresleri var.
  2. Bir string işlemi yeni bir string döndürür. Sonuç olarak, dizi işlemleri zincirlenebilir. İşlevsel programlamada bu model akıcı arayüz olarak bilinir. Bilginize: (5 +5) * 10 – 20 gibi aritmetik ifadeler akıcı arayüze dayanır. Her işlem, sonraki işlemin uygulanacağı geçici bir nesne döndürür. Tabii ki, sayılar değerlidir.
Bir Value nesnesi, oluşturulduğunda özniteliklerini doğrulamalıdır. Basit olması için bu adımı bir önceki adıma dahil ettim. Datesınıf atladı

Değerli eşyaların artıları ve eksileri nelerdir?

Avantajlar ve dezavantajlar

Değerli eşyaların avantajları, dezavantajlarından açıkça daha ağır basmaktadır.

Basit değerleri işlemek için yerleşik veri türleri yerine zengin veri türleri kullanmalısınız. Bunun birçok anlamı var. Aşağıdaki iki tarih örneğini karşılaştıralım:


Date date1(2022, 10, 5);

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


  • geçersiz olamaz Datum Date(2022, 15, 5) oluştur, çünkü yapıcının işi girdiyi doğrulamaktır. Bu, dize değeri için geçerli değildir "2022 15 5“, çünkü ay ve gün kolayca karıştırılabilir.
  • Programınızı okumak daha kolay. Sınıf belgelerinden Date bireysel bileşenlerin nasıl anlaşılması gerektiğini açıkça gösterir.
  • için operatörleri kullanabilirsiniz. Date aşırı yükleme. Örneğin, iki tarihin çıkarılması bir zaman süresi verir. Bir süre aynı zamanda bir değer nesnesi olmalıdır.
  • Değer nesneleri, bir gün, yıl ve ay için özel değişmez değerlerle genişletilebilir. Bu durumda gerekli değil çünkü cppreference.com’da C++20: std::chrono::duration ile aldık.
Değerliler değişmez. Sonuç olarak, optimize ediciye ek garantiler sunarlar ve senkronizasyon olmadan iş parçacıkları arasında paylaşılabilirler.

Sadece tartışma uğruna: değerli şeyleri temsil eden çok fazla küçük sınıfla karşılaşabilirsiniz.

Sıradaki ne?


Boş bir nesne, bir nesnenin içinde hiçbir şey yapmama davranışını kapsar. Bir sonraki makalemde boş nesneler hakkında daha fazla ayrıntıya gireceğim.

Adımıza: Modern C++ Danışmanlığı: “C++ ile Tasarım Modelleri ve Mimari Kalıplar”


24.02.2023 tarihine kadar rezervasyon yaptırırsanız %33 indirim kazanırsınız. Ama önce mentorluk programımı tanıtmak istiyorum.








Öğrenci olmak istiyor musun? Ayrıntıları buradan alın: “C++ ile Tasarım Modelleri ve Mimari Kalıplar” ve bir C++ topluluğunun üyesi olun.


(rm)



Haberin Sonu
 
Üst