Bir nesne kendi kimliğini bilmeli mi?


22

obj.idoldukça yaygın görünüyor ve aynı zamanda bir nesnenin kendisi hakkında bildiği bir şeyin kapsamına giriyor gibi görünüyor. Kendimi neden nesnemin kendi kimliğini bilmesi gerektiğini sorarken buluyorum.

Buna sahip olmak için bir sebep yok gibi görünüyor? Varlığının temel nedenlerinden biri onu almak ve depolarımın bunu bilmesi ve böylece veritabanı etkileşimi için kullanması gerekiyor.

Ayrıca bir keresinde, bir nesnenin JSON'a, kimliğin yüke sığmadığını belirten bir RESTful API için serileştirmek istediğim bir sorunla karşılaştım, ancak yalnızca URI ve nesneyi dahil etmek bunu daha da zorlaştırdı.

Bir nesne kendi kimliğini bilmeli mi? neden ya da neden olmasın?

güncelleme : Şartlar

  1. id: Bir nesnede tanımlayıcı özelliği. Veri tabanı açısından, bir vekil anahtar, doğal bir anahtar değil.
  2. Nesne: Sistemdeki bir Varlık veya başka şekilde benzersiz bir tanımlanabilir nesne.

1
Özet olarak, eğer bilgi depolamak için bir neden yoksa, saklamayın. Sadece baş ağrısı yaratır.

3
Bir nesnenin benzersiz anahtarını bilmiyorsanız, bir veritabanındaki verileri nasıl güncellersiniz veya kullanıcının listeden bir oluşum seçmesine izin verir misiniz?
NoChance

@ EmmadKareem dediğim şey, koleksiyonun (depo) kimliği bildiği, yani nesnenin neden ihtiyaç duyduğu. Bir liste hazırlıyor olsaydım, muhtemelen kimliğini bilen bir koleksiyon hazırlardım.
xenoterracide

Nesne ile depolanan kimliği kullanmazsanız ve asla kullanmayı düşünmüyorsanız veya kullanmak istemiyorsanız, açıkça gerekli değildir.
GrandmasterB

Elbette kimliği @GrandmasterB kullanıyorsunuz, soru kimliği hafızada nesne ile birlikte saklayıp saklamadığınızı ve bunun nedenini soruyor.
xenoterracide 30.01.2012

Yanıtlar:


8

Kısa Cevap: Nesneye nesne tanımlayıcısı dahil edilmek istenirse bir zorunluluktur.

Bir nesne koleksiyonunu kullanmayı planladığınız ve bireysel bir nesneyi / varlığı yönlendirmeyi planladığınız bir senaryoda, tanımlayıcı eklenmelidir. Bununla birlikte, gibi doğal anahtarın / tanımlayıcının DateTimebu ihtiyacı yapay olarak karşılayabileceği durumlar olabilir .

Ek olarak, DTO'larınızı nesnenizin hafif bir kabı olarak alabilir, bu da kendi içinde nesne tanımlayıcıyı atlayabilir / dahil edebilir. Gerçekten, tüm bu seçimler gerçekten ticari kullanım durumlarınıza ve gereksinimlerinize bağlıdır .

Düzenleme: Nesnenizi tanımlamak istiyorsanız bir tanımlayıcıya sahip olmanız gerekir. Bu tanımlayıcı bir vekil Id, tarih-saat, yol gösterici vb. Olabilir, temel olarak nesneyi başkalarından benzersiz bir şekilde tanımlayan herhangi bir şey olabilir.


2
neden koleksiyona değil de nesneye dahil edilmeli (koleksiyonun bir tür sözlük olduğu varsayılarak)?
xenoterracide

Demek istediğim şuydu, nesnenizi tanımlamak istiyorsanız bir tanımlayıcıya ihtiyacınız var. Nesnenizi başkalarından tanımlayan herhangi bir şey, Tarih, Saat vb. olabilir.
EL Yusubov

1
Tabii ki benim sorum daha çok nesnenin kendisinin bu tanımlayıcıdan haberdar olması gerektiğinin sebebi.
xenoterracide

biraz açıklığa kavuşturmak için, bir vekil kimliği, genellikle datetime veya vin sayıları gibi şeyler doğaldır ve bu nedenle verilerin bir parçasıdır ve adlandırılmamış id(veya en azından istemem)
xenoterracide

6

Cevabımı sorunuz kadar soyut bırakma girişiminde, aslında kendi sorunuzu cevapladığınızı düşünüyorum.

Bir nesne, gerekirse kendi kimliğini bilmelidir.

Bir nesne, kimliğini bilmemeli (veya hatta sahip olduğunu) bilmemelidir.

Belirttiğiniz gibi, nesnenin kimliğini koruyabilmesi veya bilmesi için uygun olmayan veya gereksiz olan durumlar vardır. Ancak nesnenin kimliğini bilmesinin daha uygun olduğu başka durumlar da vardır. Nesnelerini kullanımlarına uygun olarak kodlayın.


kimliğinin farkında olması için hangi davalar uygundur? Düşündüm ve çoğunun sadece kodlama yöntemine dayanabileceğini düşünüyordum, belki de obj.idkoleksiyonun kendisini oluşturmanın tersine kullanılan bir döngü için .
xenoterracide

1
@ xenoterracide - DB kayıtlarının asenkron olarak görüntülenmesi ve güncellenmesi buna bir örnektir. Bazı durumlarda, kimliği dışında bir kaydı benzersiz bir şekilde tanımlamak için yeterli bilgiye sahip olmayacağım, böylece kimliği kayıt nesnesiyle tutmak mantıklı olacaktır.

ama bu bir sebep mi, sonuç mu? bir gereklilik mi? eğer havuzunuz / koleksiyonunuz / veri haritanız (veya bazı zincirlerinin) güncellemeleri devam ettirmekten sorumlu ise ve kimliği biliyorsa ve iletilebiliyorsa ... Bunu izleyen bir sebep olup olmadığını anlamaya çalışıyorum. çünkü orası birçok insanın kullandığı ve aktif kayıt düzeni.
xenoterracide

@ xenoterracide - düşündüğüm durumlarda, kesinlikle nedensel bir ihtiyaçtı. İçinde bulunduğum bazı durumlar için, nesneyle ilgili kimliği saklamak çok daha uygun oldu. Sorunuz iyiydi çünkü birçok halk tarafından yapılan temel bir varsayıma meydan okuyordu. Böyle varsayımlara girdiğimizde öğrenmeye meyilliyiz. Öte yandan, fazla analiz etme ve ters yöne gitme. Aksi halde, ilk etapta çökerttiğiniz aynı sakrosaniye beyannamelerini aynı anda yaparsınız.

4

Kimliği eklemek oldukça yaygındır, ancak sözlükleri kullanmak da yaygındır, yani her nesnenin kimliğiyle ilişkilendirildiği veri yapılarını, bu kimliği karşılık gelen kimliği bilerek kolayca alabilecek şekilde kullanabilirsiniz, ancak nesne bilmez o.

Örneğin, iki yöntemle bir API oluşturuyorsanız:

Ardından, ikinci isteğin JSON yanıtında ID 452'yi tekrar göndermenize gerek yoktur. API kullanıcısı kimliği zaten biliyor.


4

Bunun öznel olduğunu ve tasarımınıza bağlı olduğunu düşünüyorum.

Çoğunlukla bu, aktif bir kayıttan gelen bir tasarım gibi gözükse de . Aktif bir kayıtta, varlığınızın veritabanı işlemlerini yapma yöntemleri vardır ve bu nedenle veritabanı tanımlayıcısını da bilmesi gerekir.

Veri eşleyicisine sahip bir depo gibi başka desenler kullanırken bu verileri nesnede saklamak gereksiz ve belki de uygun olmaz.

Örneğin bir Personnesneyi alın . Bana bir aile içinde benzersiz olabilecek ya da olmayabilecek bir isim verildi. Nüfus arttıkça, daha büyük isimler artık benzersiz değildir ve bu yüzden gittikçe daha geniş bir sistem için yedek tanımlayıcılar bulduk. Bunlara örnekler: ehliyetim ve sosyal güvenlik numaram. Bir kimlik tayinli doğmadım, bu kimliklerin tümü için başvuruda bulunulmalı.

Bunların çoğu, evrensel olmadıkları için yazılım için iyi birincil anahtarlar / ID'ler yapmazlar. En azından kendi sistemlerinin dışında değil, açıkçası bir SSN, Sosyal Güvenlik İdaresi için benzersiz ve tutarlı. Genel olarak bu bilgilerin sağlayıcıları olmadığımız için, onları bir iddeğil, temsil ettikleri veriler olarak adlandırmazsınız SSN. Bazen, DriversLicenseehliyetin sahip olduğu bilgilerin tümünü içerebilecek olan tam nesneyi bile içerebilir .

Bu nedenle, tüm genel kimlikler sistemdeki yedek anahtarlardır ve kayıtları aramak ve kalıcı hale getirmek için yalnızca kimlik bilgileri içeren bellek referanslarıyla değiştirilebilir.

Bir yana idkavramsal bir veri parçası değildir, bunun etki gelmez gibi (genellikle), nesne içinde ait olduğu şüphe. Aksine, benzersiz bir kimliği temsil etmenin başka yolu olmayan bir nesneyi tanımlamak olan amacı saklanmalıdır. Bu bir depoda / koleksiyonda kolay bir şekilde yapılabilir.

Yazılımda, nesneyi bir liste olarak göstermeniz veya devam ettirmeniz gerekirse, bunu basitçe depo / toplama nesnesinden veya bununla ilişkili başka bir nesneden yapabilirsiniz. Veri Eşleyici'ye (ayrıysa) geçerken, basitçe geçebilirsiniz .update( id, obj ).

Sorumluluk reddi : Henüz kuruluş içinde kimliği içermeyen bir sistem oluşturmayı denemedim ve bu yüzden kendimi yanlış kanıtlayabilirim.


2

GlenH7'nin bir yorumunda da belirtildiği gibi, bu iyi bir soru, çünkü birçok insanın verdiği ödüle meydan okuyor. Bununla beraber benim idim, kimliği dışarıda bırakmak kavramsal olarak saf görünse bile, yapılacak pragmatik şeyin, kimliği nesnenin mümkün olduğu kadar çok katmanı boyunca tutmasıdır. Çok az maliyetlidir, ancak işler bozulmaya başladığında işe yarayabilir.

Bir işletmenin kimliğini bilmesi gerekmeyebilir, tıpkı bir kişinin kişisel kimlik numarasını, ehliyet numarasını veya bulunduğunuz yerde kullanımda olabilecek başka bir kimliğini bilmesi gerekmez. Kesinlikle onsuz yapabilirsin çoğu zaman. Bununla birlikte, tam size göre bir tür kimlik taşımanız akıllıca olacaktır.

Aynı şey bir nesne için söylenebilir. Veri erişim katmanının karmaşıklıklarından bağımsız olarak, nesne sonuçta belirli bir veri tabanı girişine eşlenir. Bu giriş yalnızca nesnenin kimliği ile benzersiz bir şekilde tanımlanabilir. Öyleyse, bazı UI kodlarında hata ayıklamam, iş katmanında sayıların sıkıştırılması, havuzun kendisinin veya bir web servisine bağlı bir sistemin hata ayıklamamdan bağımsız olarak, bu bilgilerin istediğim zaman bana ulaşmasını tercih ederim. Ya da bu konuda hata günlüklerine göz attığımı.

Sizin durumunuzda, eğer sadece db'den veri alıyorsanız ve web servisine zorluyorsanız, kimliği dışarıda bırakmak doğru şeyler yapmak olabilir. Sadece genel davada saklamaktan daha mantıklı olduğuna inanmıyorum.


2

Haklısınız, yalnızca depo bağlamında bilmeniz gereken süre boyunca kimliği nesnede saklamanız gerekmez.

Nesneyi, bu bağlamın dışına kodlamak, nesneyi kimliğe göre istemedi kodunu (ve dolayısıyla henüz bilmediğini) iletmek, ancak hangi amaçla olursa olsun (örneğin bir listeye yerleştirmek için) kimliğe gereksinim duyduğunuzda durum değişir. Daha sonra depodan talep edilecek kimlikleri, başka bir kodla).

Bu durumda, iki seçeneğiniz var:

  • depo bağlamı ile id'nin gerekli olduğu fonksiyon arasındaki fonksiyonlar zincirinin tümüne 'id' fonksiyonunu tanıtın.

  • kimliği nesneye dahil et

Bu vakaların çoğunda, kimliği nesnenin içinde saklamak daha iyi bir çözüm olacaktır. Ayrıca, öngörülemeyen yerlerde kimlik gerektiğinde kod değişikliklerini azaltır, artı zaman zaman hata ayıklama konusunda da yardımcı olabilir.

Bu yüzden bunu yaparken yapıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.