Opak işaretçi - Opaque pointer

İçinde bilgisayar Programlama, bir opak işaretçi özel bir durumdur opak veri türü, bir veri tipi olarak ilan edildi Işaretçi bir kayıt veya veri yapısı belirtilmemiş bir tür.

Opak işaretçiler birkaç Programlama dilleri dahil olmak üzere Ada, C, C ++, D ve Modula-2.

Dil ise şiddetle yazılmış, programları ve prosedürler opak bir işaretçi türü hakkında başka bilgi içermeyen T hala ilan edebilir değişkenler, diziler ve türdeki alanları kaydedin T, bu türden değerler atayın ve eşitlik için bu değerleri karşılaştırın. Ancak bunu yapamayacaklar referansı kaldırma böyle bir işaretçi ve nesnenin içeriğini yalnızca eksik bilgilere sahip bazı prosedürleri çağırarak değiştirebilir.

Opak işaretçiler, uygulama bir arayüz sıradan müşterilerden, böylece uygulama yeniden derlemeye gerek kalmadan değiştirilebilir modüller onu kullanarak. Bu, programcıya da fayda sağlar, çünkü basit bir arayüz oluşturulabilir ve çoğu ayrıntı başka bir dosyada gizlenebilir.[1] Bu sağlamak için önemlidir ikili kod uyumluluğu farklı sürümleri aracılığıyla paylaşılan kitaplık, Örneğin.

Bu teknik, Tasarım desenleri olarak Köprü deseni. Bazen "üstesinden gelmek sınıflar",[2] "Pimpl deyimi"(" uygulama deyimine işaretçi "için),[3] "Derleyici güvenlik duvarı deyimi",[4] "d-işaretçi " veya "Cheshire Kedisi", özellikle C ++ topluluğu arasında.[2]

Örnekler

Ada

paket Library_Interface dır-dir   tip Üstesinden gelmek dır-dir sınırlı özel;   -- Operasyonlar...özel   tip Hidden_Implementation;    - Paket gövdesinde tanımlanmıştır   tip Üstesinden gelmek dır-dir Giriş Hidden_Implementation;son Library_Interface;

Tip Üstesinden gelmek spesifikasyonda tanımlanmayan gerçek uygulamaya yönelik opak bir göstericidir. Türün yalnızca özel olmadığını (istemcilerin türe doğrudan erişmesini yasaklamak ve yalnızca işlemler yoluyla) aynı zamanda sınırlı olduğunu (veri yapısının kopyasını önlemek ve böylece sarkan referansları önlemek için) unutmayın.

paket vücut Library_Interface dır-dir   tip Hidden_Implementation dır-dir kayıt      ...    - Gerçek uygulama herhangi bir şey olabilir   son kayıt;   - İşlemlerin tanımı ...son Library_Interface;

Bu türlere bazen "Taft türleri"- sonra Tucker Taft, Ada 95'in ana tasarımcısı - çünkü bunlar Ada 83'te sözde Taft Değişikliği'nde tanıtıldı.[5]

C

/ * obj.h * /yapı obj;/* * Derleyici struct nesnesini eksik bir tür olarak kabul eder. Eksik türler * beyannamelerde kullanılabilir. */size_t obj_size(geçersiz);geçersiz obj_setid(yapı obj *, int);int obj_getid(yapı obj *);
/ * obj.c * /#Dahil etmek "obj.h"yapı obj {    int İD;};/* * Arayan kişi tahsisi halledecektir. * Yalnızca gerekli bilgileri sağlayın */size_t obj_size(geçersiz) {    dönüş boyutu(yapı obj);}geçersiz obj_setid(yapı obj *Ö, int ben) {    Ö->İD = ben;}int obj_getid(yapı obj *Ö) {    dönüş Ö->İD;}

Bu örnek, şu hedefe ulaşmanın bir yolunu göstermektedir: Bilgi gizleme (kapsülleme ) yönü nesne yönelimli programlama C dilini kullanarak. Birisi tanımını değiştirmek isterse struct obj, programdaki diğer modülleri kullanan diğer modülleri yeniden derlemek gereksiz olacaktır. obj.h başlık dosyası olmadıkça API da değiştirildi. İşlevlerin, geçirilen göstericinin olmadığını kontrol etmelerinin istenebileceğine dikkat edin. BOŞ, ancak bu tür kontroller kısalık açısından yukarıda atlanmıştır.

C ++

/ * PublicClass.h * /#Dahil etmek <memory>sınıf Kamusal sınıf { halka açık:  Kamusal sınıf();                               // Yapıcı  Kamusal sınıf(sabit Kamusal sınıf&);             // Yapıcıyı kopyala  Kamusal sınıf(Kamusal sınıf&&);                  // Yapıcıyı taşı  Kamusal sınıf& Şebeke=(sabit Kamusal sınıf&);  // Atama operatörünü kopyala  Kamusal sınıf& Şebeke=(Kamusal sınıf&&);       // Atama operatörünü taşı  ~Kamusal sınıf();                              // Yıkıcı  // Diğer işlemler ... özel:  yapı Cheshire Kedisi;                   // Burada tanımlanmadı  std::unique_ptr<Cheshire Kedisi> d_ptr_;  // Opak işaretçi};
/ * PublicClass.cpp * /#Dahil etmek "PublicClass.h"yapı Kamusal sınıf::Cheshire Kedisi {  int a;  int b;};Kamusal sınıf::Kamusal sınıf()    : d_ptr_(std::make_unique<Cheshire Kedisi>()) {  // Hiçbir şey yapma.}Kamusal sınıf::Kamusal sınıf(sabit Kamusal sınıf& diğer)    : d_ptr_(std::make_unique<Cheshire Kedisi>(*diğer.d_ptr_)) {  // Hiçbir şey yapma.}Kamusal sınıf::Kamusal sınıf(Kamusal sınıf&& diğer) = varsayılan;Kamusal sınıf& Kamusal sınıf::Şebeke=(sabit Kamusal sınıf &diğer) {  *d_ptr_ = *diğer.d_ptr_;  dönüş *bu;}Kamusal sınıf& Kamusal sınıf::Şebeke=(Kamusal sınıf&&) = varsayılan;Kamusal sınıf::~Kamusal sınıf() = varsayılan;

D-işaretçi modeli, opak işaretçi. Avantajları nedeniyle (aşağıda belirtilmiştir) yaygın olarak C ++ sınıflarında kullanılır. Bir d-işaretçi, bir yapının bir örneğine işaret eden sınıfın özel bir veri üyesidir. Bu yöntem, sınıf bildirimlerinin, d-işaretçisinin kendisi dışında özel veri üyelerini atlamasına izin verir.[6] Sonuç olarak,

  • sınıf uygulamasının daha fazlası gizlidir
  • özel yapıya yeni veri üyelerinin eklenmesi etkilemez ikili uyumluluk
  • sınıf bildirimini içeren başlık dosyası, uygulanması yerine yalnızca sınıf arabirimi için gereken dosyaları içermelidir.

Bir taraf avantajı, derlemelerin daha hızlı olmasıdır çünkü başlık dosyası daha az sıklıkla değişir. D-işaretçi modelinin olası dezavantajı, bazen düz, işaretçi olmayan üyeye erişimden daha yavaş olan işaretçi aracılığıyla dolaylı üye erişimidir (örneğin, dinamik depolamadaki nesneye işaretçi). D-işaretçisi, yoğun bir şekilde Qt [7] ve KDE kütüphaneler.

Ayrıca bakınız

Referanslar

  1. ^ Chris McKillop. "Programlama Araçları - Opak İşaretçiler". QNX Yazılım Sistemleri. Alındı 2019-01-16.
  2. ^ a b Bruce Eckel (2000). "Bölüm 5: Uygulamayı Gizleme". C ++ 'da Düşünme, Cilt 1: Standart C ++' ya Giriş (2. baskı). Prentice Hall. ISBN  0-13-979809-9.
  3. ^ Vladimir Batov (2008-01-25). "Pimpl'i Kolaylaştırmak". Dr. Dobb's Journal. Alındı 2008-05-07.
  4. ^ Herb Sutter. The Joy of Pimpls (or, More About the Compiler-Firewall Idiom)
  5. ^ Robert A. Duff (2002-07-29). "Re: Adı neydi?". Yeni Grupcomp.lang.ada. Alındı 2007-10-11.
  6. ^ D-Pointer kullanma - KDE opak işaretçileri neden ve nasıl uygular?
  7. ^ "D-İşaretçisi". Qt wiki. Alındı 23 Aralık 2016.

Dış bağlantılar